`sshfs -oworkaround = rename` làm gì?


17

Đối với lớp hệ điều hành tôi đang dùng, tôi cần chạy Freebsd5.4. Vì tôi không muốn vật lộn với việc cố gắng xây dựng git trên một phiên bản bsd được phát hành trước khi git được phát hành, tôi nghĩ rằng nó sẽ gọn gàng khi sử dụng gittừ Arch sshfs.

Ở bất cứ giá nào tôi cũng tìm thấy một cách giải quyết mà tôi đề nghị tôi đưa sshfsra tùy chọn -o workaround=rename.

Nó dường như làm cho githạnh phúc, nhưng tôi khá bối rối về những gì vừa xảy ra ...

Tất cả các trang người đàn ông nói về cách giải quyết là

fix renaming to existing file

nhưng tôi hoàn toàn bối rối về điều đó có nghĩa là gì ...

Chính xác thì lựa chọn đó làm gì?


3
Con trỏ cho ai đó muốn xem xét chính xác ý nghĩa của nó (và viết ra câu trả lời và hy vọng bản vá tài liệu): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c bắt đầu trên dòng 2300.
derobert

Câu trả lời:


10

sshfs sử dụng Giao thức truyền tệp SSH (SFTP). Cách giải quyết mà bạn đã kích hoạt là xoay quanh ngữ nghĩa của hoạt động đổi tên () trên giao thức đó khi tên "mới" đã tồn tại.

Hành vi POSIX để đổi tên () trong trường hợp này là xóa tệp hiện có và hoàn tất đổi tên.

Trong giao thức SFTP, bạn có thể đổi tên một tệp bằng thao tác SSH_FXP_RENAME; tuy nhiên, hành vi của nó khi tên đích đã tồn tại dường như phụ thuộc vào phiên bản của giao thức bạn đang sử dụng và cờ nào bạn vượt qua. Các trang wikipedia cho giao thức SFTP có liên kết đến dự thảo RFC khác nhau cho các phiên bản khác nhau của giao thức. Trong Dự thảo 00 , hành vi được liệt kê là:

Đó là một lỗi nếu đã tồn tại một tệp có tên được chỉ định bởi newpath.

Trong Dự thảo 13 , hành vi được liệt kê là

Nếu các cờ không bao gồm SSH_FXP_RENAME_OVERWRITE và đã tồn tại một tệp có tên được chỉ định bởi newpath, máy chủ PHẢI trả lời bằng SSH_FX_FILE_ALREADY_EXISTS.

Nếu các cờ bao gồm SSH_FXP_RENAME_ATOMIC và tệp đích đã tồn tại, thì nó được thay thế theo kiểu nguyên tử. Tức là, không có thời gian có thể quan sát được trong thời gian mà tên không đề cập đến tệp cũ hoặc tệp mới. SSH_FXP_RENAME_ATOMIC ngụ ý SSH_FXP_RENAME_OVERWRITE.

Để xử lý sự cố có thể xảy ra của thao tác đổi tên () khi tên đích tồn tại, sshfs cung cấp cách giải quyết sau (nếu được bật) :

   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);
                    }
            }
    }

Trong mã này "từ" là tên hiện có của tệp chúng tôi muốn đổi tên và "thành" là tên mới mà chúng tôi muốn. Đặt một số độ dài đường dẫn và sổ sách lỗi sang một bên, công việc này xung quanh

  • Đổi tên "thành" thành "totmp"
  • Đổi tên "từ" thành "thành"
  • Bỏ liên kết (xóa) "totmp"

Điều này tránh xung đột "tập tin đã tồn tại", nhưng cũng thay đổi ngữ nghĩa của các hoạt động đổi tên (), đó là lý do tại sao bạn không muốn làm điều đó theo mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.