`sshfs -oworkaround=rename`은 무엇을 합니까?

`sshfs -oworkaround=rename`은 무엇을 합니까?

제가 수강하는 운영 체제 과정의 경우 Freebsd5.4를 실행해야 합니다. git이 출시되기 전에는 bsd 버전에서 git을 빌드하고 싶지 않았기 때문에 gitArch에서 사용하는 것이 깔끔할 것이라고 생각했습니다 sshfs.

어쨌든 하나 찾았어해결책이것은 내가 sshfs선택권을 줬다는 것을 보여줍니다 -o workaround=rename.

행복해 보이지만 git방금 무슨 일이 일어났는지 혼란스럽습니다...

모든 것매뉴얼 페이지해결책은 다음과 같다고 한다

fix renaming to existing file

그런데 이게 무슨 뜻인지 전혀 모르겠어요...

이 옵션의 역할은 정확히 무엇입니까?

답변1

sshfs는 SSH 파일 전송 프로토콜(SFTP)을 사용합니다. 활성화하는 해결 방법은 "새" 이름이 이미 존재할 때 프로토콜에서 rename() 작업의 의미를 해결하는 것입니다.

이 경우 rename()의 POSIX 동작은 기존 파일을 삭제하고 이름 바꾸기를 완료하는 것입니다.

SFTP 프로토콜에서는 SSH_FXP_RENAME 작업을 통해 파일 이름을 바꿀 수 있습니다. 그러나 대상 이름이 이미 존재할 때의 동작은 사용 중인 프로토콜 버전과 전달하는 플래그에 따라 달라지는 것 같습니다. 이것SFTP 프로토콜에 대한 Wikipedia 페이지다양한 버전의 프로토콜에 대한 다양한 RFC 초안에 대한 링크가 있습니다. 존재하다초안 00해당 법안은 다음과 같이 나열됩니다.

newpath로 지정한 이름의 파일이 이미 존재하면 오류가 발생한다.

존재하다초안 13, 동작은 다음과 같이 나열됩니다.

플래그에 SSH_FXP_RENAME_OVERWRITE가 포함되어 있지 않고 newpath로 지정된 이름의 파일이 이미 존재하는 경우 서버는 SSH_FX_FILE_ALREADY_EXISTS로 응답해야 합니다.

플래그에 SSH_FXP_RENAME_ATOMIC이 포함되어 있고 대상 파일이 이미 존재하는 경우 원자적으로 대체됩니다. 즉, 이전 파일이나 새 파일을 참조하지 않는 관찰 가능한 특정 시점 이름이 없습니다. SSH_FXP_RENAME_ATOMIC은 SSH_FXP_RENAME_OVERWRITE를 의미합니다.

대상 이름이 존재하는 경우 rename() 작업이 실패할 수 있는 상황을 처리하려면sshfs는 다음 해결 방법을 제공합니다(활성화된 경우):

   if (err == -EPERM && sshfs.rename_workaround) {
            size_t tolen = strlen(to);
            if (tolen + RENAME_TEMP_CHARS < PATH_MAX) {
                    int tmperr;
                    char totmp[PATH_MAX];
                    strcpy(totmp, to);
                    random_string(totmp + tolen, RENAME_TEMP_CHARS);
                    tmperr = sshfs_do_rename(to, totmp);
                    if (!tmperr) {
                            err = sshfs_do_rename(from, to);
                            if (!err)
                                    err = sshfs_unlink(totmp);
                            else
                                    sshfs_do_rename(totmp, to);
                    }
            }
    }

이 코드에서 "from"은 이름을 바꾸려는 파일의 기존 이름이고 "to"는 원하는 새 이름입니다. 일부 경로 길이와 잘못된 부기 관리는 제쳐두고 이 솔루션

  • "to"의 이름을 "totmp"로 바꿉니다.
  • "from"을 "to"로 이름 바꾸기
  • "totmp" 연결 해제(삭제)

이렇게 하면 "파일이 이미 존재함" 충돌을 방지할 수 있을 뿐만 아니라 rename() 작업의 의미도 변경되므로 기본적으로 이 작업을 수행하지 않으려는 것입니다.

관련 정보