Liên kết tượng trưng so với liên kết cứng trong Linux: Những điều bạn cần biết

Tác giả Starlink, T.M.Một 01, 2024, 07:43:47 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Tiết kiệm dung lượng đĩa và sắp xếp các tập tin của bạn bằng các liên kết của Linux.

  • Các liên kết trong Linux giống như các phím tắt: tham chiếu đến một tệp mà không trùng lặp với tệp đó.
  • Liên kết tượng trưng tham chiếu theo tên tệp nhưng sẽ bị hỏng nếu mục tiêu của nó di chuyển.
  • Liên kết cứng tham chiếu đến inode của tệp, có thể mạnh mẽ hơn nhưng khó hiểu hơn.


Trên Linux, liên kết giống như một phím tắt đến một tệp, cung cấp cho bạn quyền quyết định lớn về cách bạn sắp xếp hệ thống tệp của mình. Nhưng có hai loại liên kết và chúng rất khác nhau.

1. Liên kết trong Linux là gì?

Trong Linux, một tệp có hai phần: tên và nội dung của nó. Một cấu trúc được gọi là "inode" kết nối tên tệp với dữ liệu mà nó chứa. Inode này cũng lưu trữ siêu dữ liệu về tệp, như chủ sở hữu, quyền và ngày thay đổi cuối cùng.


Tên tệp chỉ đơn giản là trỏ hoặc "liên kết" đến cấu trúc inode này. Điều này có nghĩa là nhiều hơn một tên tệp có thể tham chiếu đến cùng một cấu trúc, tức là cùng một tệp cơ bản.

2. Tạo liên kết cứng

Kiểu liên kết mặc định là "liên kết cứng". Bạn có thể tạo liên kết cứng đến một tệp hiện có bằng lệnh ln theo mẫu này:

Mã nguồn [Chọn]
ln existing_file new_hard_link
Bây giờ bạn sẽ có hai tên tệp trỏ đến cùng một inode. Điều quan trọng là phải hiểu rằng thực sự chỉ có một tệp ở đây, chỉ là nó có hai tên tệp. Vì vậy, bạn có thể sử dụng tên (hoặc đường dẫn) để tham chiếu đến cùng một tệp và mọi thứ sẽ được đồng bộ hóa.

Hãy thử và bạn sẽ thấy điều gì đang xảy ra. Bắt đầu bằng cách sao chép một tệp như bình thường, sử dụng lệnh cp :

Mã nguồn [Chọn]
echo "hello world" > foo
cp foo bar
ls -li
cat foo bar

Truyền tùy chọn i cho ls sẽ hướng dẫn nó in số inode của từng tệp ở đầu dòng. Lưu ý rằng tệp mới có inode riêng biệt nhưng có cùng nội dung với tệp gốc.


Bây giờ hãy tạo một liên kết cứng tới tệp gốc và so sánh nó:

Mã nguồn [Chọn]
ln foo hum
ls -li
cat foo bar hum


Lưu ý rằng liên kết cứng có cùng inode với tệp gốc: 43458473. Cả foo và hum đều trỏ đến cùng một tệp cơ sở. Ngoài ra, hãy lưu ý số ở cột thứ 3, ngay bên phải quyền. Đối với tệp gốc (foo) và liên kết cứng (hum), số này là "2", nhưng đối với bản sao (bar) là "1". Số này biểu thị tổng số liên kết cứng đến tệp đó.

Vẽ lại sơ đồ đầu tiên để biểu diễn tệp gốc và liên kết cứng của nó sẽ cho kết quả:


Không có sự khác biệt có ý nghĩa nào giữa tệp gốc và liên kết cứng. Trên thực tế, cả hai đều là "liên kết" theo nghĩa của Linux và đây là lý do tại sao có lệnh unlink thực hiện cùng công việc như lệnh rm để xóa tệp.

Bằng cách liệt kê các số inode, bạn có thể xác nhận rằng thực sự chỉ có một tệp thực tế cho hai tên tệp. Nếu bạn vẫn còn nghi ngờ, hãy thử thay đổi nội dung của một trong hai tệp:

Mã nguồn [Chọn]
echo "some new contents" > hum
cat foo


3. Tạo liên kết tượng trưng (mềm)

Liên kết tượng trưng (symlink) cũng cho phép bạn tham chiếu đến cùng một tệp ở nhiều vị trí. Sự khác biệt là, trong khi liên kết cứng tham chiếu đến inode, liên kết mềm tham chiếu đến các tệp khác theo tên tệp. Bạn vẫn sử dụng lệnh ln để tạo liên kết tượng trưng, nhưng cũng truyền cờ -s (symbolic):

Mã nguồn [Chọn]
ln -s existing_file new_soft_link
Liên kết tượng trưng là một tệp riêng biệt; nó có inode với nội dung riêng. Nhưng nội dung của liên kết tượng trưng không gì khác hơn là một tên tệp, một tham chiếu đến một tệp riêng biệt mà liên kết tượng trưng phải hoạt động như một proxy. Siêu dữ liệu được lưu trữ trong inode của liên kết tượng trưng đánh dấu rõ ràng nó là một liên kết tượng trưng, vì vậy bất kỳ chương trình nào sử dụng nó sẽ biết cách lấy tên tệp mà nó trỏ đến thay thế.

Sau đây là một ví dụ:

Mã nguồn [Chọn]
ln -s foo baz
cat baz
ls -li


Lưu ý rằng điều này trông khá giống với trường hợp liên kết cứng, nhưng đầu ra từ ls lại khá khác. Đầu tiên, liên kết tượng trưng được đánh dấu bằng "l" (liên kết) ngay từ đầu của quyền. Nhưng, hữu ích hơn nữa, tên tệp của liên kết tượng trưng được tô màu hồng và theo sau là một mũi tên và tên tệp gốc.

Mối quan hệ giữa liên kết tượng trưng và tệp gốc giống như sau:


Khi bạn tạo một liên kết tượng trưng, bạn có thể chọn chính xác cách tham chiếu đến tệp mà nó trỏ đến. Ví dụ trước chỉ sử dụng một tên tệp đơn giản là tham chiếu tương đối đến một tệp trong cùng thư mục. Nhưng bạn có thể sử dụng bất kỳ đường dẫn hợp lệ nào, tương đối hoặc tuyệt đối, ví dụ:

Mã nguồn [Chọn]
ln -s foo sub/dir/baz
ln -s foo../../baz
ln -s foo /tmp/baz

Bạn có thể đã phát hiện ra một lỗi ở đây: nếu tệp gốc thay đổi tên hoặc vị trí thì sao? Trên thực tế, nếu tệp liên kết tượng trưng thay đổi vị trí thì sao? Vâng, tùy thuộc vào loại đường dẫn bạn đang sử dụng—tương đối hay tuyệt đối—và tùy thuộc vào việc cả hai tệp đều được di chuyển hay chỉ một tệp, bạn có thể ổn. Nhưng bạn sẽ cần phải cẩn thận.

4. Khi nào bạn nên sử dụng liên kết cứng hoặc liên kết mềm?

Một cách sử dụng phổ biến của symlink là quản lý phần mềm đã cài đặt. Ví dụ, trên hệ thống của tôi, tôi có vim—trình soạn thảo văn bản—và vi, trình soạn thảo cũ hơn mà nó phát triển từ đó. Chúng được cài đặt như thế này:


Với thiết lập này, bất kỳ tập lệnh nào sử dụng vi sẽ tự động sử dụng vim.

Cả hai loại liên kết đều tốt cho việc quản lý hệ thống tập tin. Bạn có thể sử dụng liên kết để sắp xếp các tập tin và thư mục của mình, giúp chúng dễ truy cập hơn mà không lãng phí dung lượng đĩa. Ví dụ:

Mã nguồn [Chọn]
# Create a hard link to the apache log file in home directory
~ $ ln /var/log/apache2/access_log apache-log

# Create a soft link to a deeply-nested directory
~ $ ln -s./work/acme/2024/10 current-work

Liên kết có thể rất hữu ích như một cách để chuyển đổi giữa các tệp khác nhau mà không cần phải sửa đổi chúng. Ví dụ, hãy tưởng tượng bạn có một tệp cấu hình, conf, mà một số phần mềm sử dụng. Bạn có thể tạo nhiều cấu hình, lưu trữ chúng trong các tệp riêng biệt, sau đó chuyển đổi giữa chúng bằng liên kết:

Mã nguồn [Chọn]
# Create two config files
config $ mv conf dark.conf
config $ cp dark.conf light.conf

# Use the dark config
config $ ln -s dark.conf conf

# Switch to the light config. Note -f to force overwrite of existing link.
config $ ln -fs light.conf conf

Liên kết mềm hoạt động cho đến khi tệp mà nó trỏ tới bị di chuyển hoặc đổi tên, khi đó nó sẽ trở thành liên kết bị hỏng:


Vì lý do này, liên kết mềm thường hoạt động tốt nhất trong phạm vi hẹp, ví dụ như khi tệp và liên kết của tệp đó nằm trong cùng một thư mục.

Liên kết cứng không gặp phải vấn đề này; bạn có thể di chuyển chúng an toàn đến bất kỳ đâu trong cùng một hệ thống tệp. Tuy nhiên, chúng gặp phải một vấn đề khác. Một số trình chỉnh sửa—và các chương trình khác hoạt động trên tệp—tạo một bản sao của tệp và đổi tên tệp đó khi lưu, cho mục đích sao lưu. Hành vi này có thể phá vỡ liên kết cứng, khiến chúng không đồng bộ và chiếm gấp đôi dung lượng đĩa. Bạn cần kiểm tra cẩn thận các chương trình bạn chỉnh sửa liên kết cứng để đảm bảo chúng không làm điều này.

Nếu bạn đang liên kết đến một thư mục, liên kết mềm là lựa chọn duy nhất của bạn. Liên kết cứng không có nhiều ý nghĩa khi nói đến thư mục và sẽ tạo ra nhiều vấn đề hơn là giải quyết được. Liên kết cứng cũng không thể được lưu trữ trong kho lưu trữ git.

Trên dòng lệnh, liên kết cứng là mặc định, nhưng GUI—ví dụ như Nautilus—thường chỉ hỗ trợ liên kết mềm. Ngay cả khi đó, bạn vẫn phải bật tùy chọn qua Preferences:


Khái niệm về liên kết mềm dễ hiểu hơn một chút và có khả năng an toàn hơn. Liên kết mềm dễ thấy hơn, phổ biến hơn và nhìn chung dễ hiểu hơn.

Bất kể bạn sử dụng loại liên kết nào, khái niệm này có thể mất một thời gian và thực hành để bạn hiểu rõ. Nhưng liên kết rất mạnh mẽ và phổ biến, vì vậy bạn sẽ cảm thấy lợi ích của chúng. Đảm bảo bạn sử dụng ls để theo dõi liên kết và cố gắng không đi quá xa!