Có một nhược điểm để xóa tất cả các liên kết tượng trưng bị hỏng trong một hệ thống?


46

Tôi đã chạy một tập lệnh lặp đi lặp lại trên tất cả các tệp trên hệ thống Linux của tôi và tạo ra một số siêu dữ liệu về chúng và nó đã gây ra lỗi khi nó chạm vào một liên kết tượng trưng bị hỏng.

Tôi mới sử dụng * nix, nhưng tôi có ý tưởng chính đằng sau các tệp liên kết và cách liên kết bị hỏng tồn tại. Theo tôi biết, chúng giống như rác trên đường phố. Những điều mà một chương trình tôi đang gỡ bỏ không đủ thông minh để nói với người quản lý gói tồn tại và thuộc về nó, hoặc thứ gì đó bị bỏ lại trong bản nâng cấp. Lúc đầu, tôi bắt đầu điều chỉnh kịch bản tôi đang chạy để bỏ qua chúng, sau đó tôi nghĩ, 'chúng ta luôn có thể xóa chúng trong khi chúng ta xuống đây ...'

Tôi đang chạy Ubuntu 14.04 (Trusty Tahr). Tôi không thể thấy bất kỳ lý do nào để không, nhưng trước khi tôi tiếp tục và điều hành nó trên hệ thống phát triển của mình, có lý do nào thực sự có thể là một ý tưởng khủng khiếp không? Do các liên kết bị hỏng phục vụ một số mục đích tôi không nhận thức được?


7
Có: xem câu trả lời đánh dấu dưới đây. Nhưng quan trọng hơn, đây không phải là một giải pháp cho vấn đề của bạn: kịch bản phải hoạt động đúng, không chỉ là một hệ thống vệ sinh. Một hệ thống có thể được khử trùng trong một nửa giây giữa khi được khử trùng và nửa sau của tập lệnh đang chạy. Ngoài ra, điều này đã vi phạm nguyên tắc trách nhiệm duy nhất và triết lý Unix: Giành làm một việc tốt.
ctrl-alt-delor

Câu trả lời:


68

Có nhiều lý do cho các liên kết tượng trưng bị hỏng:

  • Một liên kết đã được tạo đến một mục tiêu không còn tồn tại.
    Giải quyết: loại bỏ các liên kết tượng trưng bị hỏng.
  • Một liên kết đã được tạo cho một mục tiêu đã được di chuyển. Hoặc đó là một liên kết tương đối đã được di chuyển so với mục tiêu của nó. (Không ngụ ý rằng các liên kết tương đối là một ý tưởng tồi - hoàn toàn ngược lại: các liên kết tuyệt đối dễ bị cũ hơn vì mục tiêu của chúng bị di chuyển.)
    Độ phân giải: tìm mục tiêu dự định và sửa liên kết.
  • Có một lỗi khi tạo liên kết.
    Giải quyết: tìm mục tiêu dự định và sửa chữa liên kết.
  • Liên kết là một tệp nằm trên đĩa di động, hệ thống tệp mạng hoặc vùng lưu trữ khác hiện không được gắn. Giải quyết: không, liên kết không bị hỏng mọi lúc. Liên kết sẽ hoạt động khi khu vực lưu trữ được gắn kết.
  • Liên kết là một tập tin chỉ tồn tại một số thời gian, theo thiết kế. Ví dụ, tệp là đầu ra được lưu trong bộ nhớ cache của một quá trình, nó sẽ bị xóa khi thông tin bị cũ nhưng chỉ được tạo lại theo yêu cầu rõ ràng. Hoặc liên kết là một hộp thư đến bị xóa khi trống. Hoặc liên kết là một tập tin thiết bị chỉ xuất hiện khi thiết bị ngoại vi tương ứng được đính kèm. Giải quyết: không, liên kết không bị hỏng mọi lúc.
  • Liên kết chỉ hợp lệ trong một hệ thống phân cấp lưu trữ khác nhau. Ví dụ, nó chỉ hợp lệ trong một nhà tù chroot, hoặc nó được xuất khẩu bởi một máy chủ NFS và chỉ hợp lệ trên máy chủ hoặc trên một số máy khách của nó.
    Giải quyết: không, liên kết không bị hỏng ở mọi nơi.
  • Liên kết bị hỏng đối với bạn, vì bạn không có quyền truy cập thư mục để tiếp cận mục tiêu, nhưng nó không bị phá vỡ đối với người dùng có đặc quyền phù hợp.
    Giải quyết: không, liên kết không bị hỏng đối với mọi người.
  • Liên kết được sử dụng để lưu trữ thông tin, như trong ví dụ về khóa Firefox được trích dẫn bởi vinc17 . Một lý do để thực hiện theo cách này là để dễ dàng tạo ra một liên kết tượng trưng một cách nguyên tử - không có cách nào khác, trong khi việc tạo một tệp về mặt nguyên tử thì phức tạp hơn: bạn cần tạo nội dung tệp theo tên tạm thời, sau đó di chuyển nó vào vị trí và xử lý các tập tin tạm thời cũ bị bỏ lại bởi một vụ tai nạn. Một lý do khác là các liên kết tượng trưng thường được lưu trữ trực tiếp bên trong inode của chúng trên một số hệ thống tệp, điều này làm cho việc đọc chúng nhanh hơn đọc nội dung của tệp.
    Giải quyết: không có. Trong trường hợp này, loại bỏ liên kết sẽ gây bất lợi.

Nếu bạn có thể xác định rằng một liên kết tượng trưng rơi vào danh mục đầu tiên, thì chắc chắn, hãy tiếp tục và xóa nó. Nếu không, hãy kiêng.

Một chương trình đi qua các thư mục đệ quy và quan tâm đến nội dung tệp thường bỏ qua các liên kết tượng trưng bị hỏng.


symlink là (thường) không có trong thư mục mẹ của chúng. Tuy nhiên trên một số hệ thống tập tin, mục tiêu liên kết được lưu trữ trong inode.
James Youngman

Danh sách rất tốt. Tôi có một loạt các liên kết rơi vào cả loại 4 và 6. Chúng trỏ vào một hệ thống tệp mà tôi gắn kết với SSHFS. Khi hệ thống tập tin không được gắn kết, chúng là loại 4; khi hệ thống tập tin được gắn kết, chỉ tôi mới có thể truy cập nó, vì vậy chúng là loại 6 cho mọi người khác (thậm chí cả root).
Barmar

Một lý do có thể nữa cho một liên kết tượng trưng bị hỏng: một liên kết tượng trưng đến một tệp thực tế chỉ tồn tại một số thời gian. Ví dụ: trong luồng công việc với các đường dẫn sâu, bạn có thể có một liên kết tượng trưng đến tệp công việc (để thuận tiện) bị xóa khi luồng công việc hoàn thành, nhưng sẽ được tạo lại trong lần sử dụng tiếp theo của luồng công việc đó. / dev / modem là loại tương tự vì tệp thiết bị thực tế mà nó trỏ đến chỉ tồn tại khi thiết bị vật lý được kết nối.
Joe

một câu trả lời khá toàn diện!
njzk2

1
@MichaelDurrant Uh? Vấn đề là nhược điểm (hoặc thiếu nó) phụ thuộc vào cách liên kết symlink bị hỏng.
Gilles 'SO- ngừng trở nên xấu xa'

19

Đừng mù quáng loại bỏ tất cả các liên kết tượng trưng lơ lửng. Chúng có thể tồn tại chỉ để mang một số thông tin và có thể an toàn hơn các tệp thông thường do việc tạo liên kết tượng trưng là nguyên tử.

Chẳng hạn, Firefox tạo ra một "khóa" lockfile là một liên kết tượng trưng có giá trị có dạng như "IP_address: + PID".


1
Vì vậy, giống như, một chương trình có thể điền một tệp trống một cách linh hoạt rằng một trong những liên kết tượng trưng này là một liên kết bị hỏng, trong khi chương trình không chạy ? Hoặc nó có thể chỉ là một phần thông tin?
quilt_cat

1
@jackech Mục đích của một số liên kết tượng trưng (không nhất thiết phải liên kết với chương trình đang chạy) có thể chỉ tồn tại. Giá trị của chúng là vô nghĩa hoặc truyền tải một số thông tin cụ thể; trong cả hai trường hợp, nói chung, họ chỉ ra không có gì. Không có tập tin trống, chỉ là một liên kết tượng trưng. Cũng lưu ý, như một ví dụ, trường hợp của gcc build, tạo ra các liên kết "tem-bit" tự trỏ đến: gcc.gnu.org/ml/libstdc++/2011/02/msg00014.html
vinc17

6

Cả fnord và máy chủ web Gatling đều sử dụng hệ thống tệp Unix làm cơ sở dữ liệu cấu hình của chúng (trái ngược với Microsoft IIS, sử dụng sổ đăng ký Windows hoặc Apache, sử dụng tệp cấu hình phức tạp để phân tích).

Ví dụ: máy chủ ảo chỉ là thư mục và việc tạo máy chủ ảo mới cũng đơn giản như

mkdir www.example.com:80

Cấu hình tập tin nào để phục vụ?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Cấu hình tập tin nào để thực thi như CGI và tập tin nào sẽ phục vụ?

chmod a-x plain_file.html
chmod a+x cgi_script.html

Và cuối cùng (và có liên quan đến câu hỏi này): cấu hình chuyển hướng?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Bây giờ bạn sẽ có một liên kết tượng trưng được gọi là search.htmlđiểm nào, nhưng nó rất quan trọng đối với hoạt động của trang web của bạn.


0

Một liên kết tượng trưng có thể trỏ đến một vị trí chưa rõ chỉ để buộc tạo ở một vị trí hoặc tên hệ thống tệp cụ thể.

Vì vậy, không - đừng mù quáng loại bỏ chúng.


0

Một nhược điểm đáng kể để xóa các liên kết tượng trưng cũ là bạn mất tham chiếu đến nơi họ từng chỉ đến có thể khá có giá trị!

Giả sử tôi có một liên kết tượng trưng cho một tệp có tên " send_to" trỏ đến /Users/myname/tmpvà giả sử rằng /Users/myname/tmpnó không tồn tại.

Với liên kết tượng trưng tôi biết nơi tập tin được dự định . Ví dụ, trong trường hợp này tôi có thể thấy rằng đó là một thư mục tạm thời và nếu tôi cần "sửa" nó, tôi nên coi một thư mục tạm thời là đích.

Tương tự, một liên kết " my_config" trỏ đến điểm /etc/conf_fileđó là "xấu" vì liên kết conf_fileđã được đổi tên thành Confirm_file vẫn là thông tin hữu ích. Nếu bạn đã vào /etcthư mục và thực hiện lsvà thấy tệp conf_filebị thiếu nhưng confirmation_fileở đó bạn có thể có đủ thông tin để sửa liên kết.


-2

Trích dẫn từ Dòng lệnh Linux (cuốn sách hay nhất từng có cho người mới sử dụng Linux và bạn có thể tải xuống miễn phí tại đây ):

Hình dung kịch bản này: Một chương trình yêu cầu sử dụng một loại tài nguyên được chia sẻ trong một tệp có tên là foo foo, nhưng foo foo có những thay đổi phiên bản thường xuyên. Sẽ rất tốt nếu bao gồm số phiên bản trong tên tệp để quản trị viên hoặc bên quan tâm khác có thể xem phiên bản của foo foo nào được cài đặt. Điều này trình bày một vấn đề. Nếu chúng ta thay đổi tên của tài nguyên được chia sẻ, chúng ta phải theo dõi mọi chương trình có thể sử dụng nó và thay đổi nó để tìm tên tài nguyên mới mỗi khi cài đặt phiên bản mới của tài nguyên. Điều đó không có vẻ vui chút nào.

Đây là nơi liên kết tượng trưng tiết kiệm trong ngày. Giả sử chúng ta cài đặt phiên bản 2.6 của foo foo, tên có tên tập tin là foo-2.6, sau đó tạo một liên kết tượng trưng đơn giản gọi là foo foo, chỉ vào đó là foo-2.6. foo, nó thực sự đang mở tập tin Foo-2.6. Bây giờ mọi người đều hạnh phúc. Các chương trình phụ thuộc vào foo foo có thể tìm thấy nó và chúng ta vẫn có thể xem phiên bản thực tế nào được cài đặt. Khi đến lúc nâng cấp lên thành foo-2.7, chúng tôi chỉ cần thêm tệp vào hệ thống của mình, xóa liên kết tượng trưng là foo foo và tạo một liên kết mới trỏ đến phiên bản mới. Điều này không chỉ giải quyết vấn đề nâng cấp phiên bản mà còn cho phép chúng tôi giữ cả hai phiên bản trên máy của mình. Hãy tưởng tượng rằng, foo-2.7, có một lỗi (chết tiệt những nhà phát triển đó!) Và chúng ta cần trở lại phiên bản cũ. Lần nữa,

Vì vậy, tôi sẽ không xóa các liên kết tượng trưng vì điều đó chắc chắn sẽ khiến bạn đau đầu và bạn có nguy cơ làm rối loạn hệ thống của mình.


6
OP đã không ủng hộ việc loại bỏ các liên kết chào mời tòa án - chỉ các liên kết tượng trưng bị hỏng , tức là các liên kết tượng trưng không trỏ đến bất kỳ tệp hiện có nào.
LSerni
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.