Skip to main content

2.1. Essential Commands: Đăng nhập Linux, tra cứu trợ giúp và làm việc với file

Mục lục​


1. Bốn cách đăng nhập vào một hệ thống Linux​

Đăng nhập vào Linux không khác mấy việc đăng nhập một website: nhập username, nhập password, xong. Phần dễ gây rối không nằm ở động tác đó mà ở mớ thuật ngữ quanh nó: console, virtual terminal, terminal emulator. Ba từ cùng chỉ "chỗ hiện chữ và nhận lệnh", nhưng tên gọi lại đến từ một thời kỳ máy tính hoàn toàn khác.

💡 Hình dung: thời kỳ đầu, một trường đại học chỉ mua nổi đúng một máy tính cho cả toà nhà. Thay vì mua 25 cái máy đắt đỏ, họ mua một cái rồi gắn thêm 25 thiết bị chỉ gồm bàn phím và màn hình để 25 người cùng dùng. Những thiết bị đó gọi là console hoặc terminal. Ngày nay chúng không còn là phần cứng nữa, chỉ còn tồn tại dưới dạng phần mềm, nhưng cái tên thì ở lại.

Phân biệt theo nghĩa hiện tại:

  • Console: màn hình chữ nơi hệ điều hành in thông báo và cho phép gõ lệnh. Khi Linux khởi động và một loạt dòng chữ trôi qua báo đang load gì, đó là console.
  • Virtual terminal: sau khi máy đã boot xong, nhấn Ctrl + Alt + F2 sẽ ra một virtual terminal.
  • Terminal emulator: một app có cửa sổ, chạy trong môi trường đồ hoạ, hiện output và nhận lệnh y như console.

Có bốn kiểu đăng nhập cần biết. Hai trục phân loại: local hay remote, và text mode hay graphical mode. Local nghĩa là máy đang ở ngay trước mặt, có thể chạm tay vào được: laptop trên bàn chẳng hạn. Một server chạy trên Google Cloud thì là remote.

Four ways to log in to LinuxLocal: the machine in front of youGraphical consolePick a user from the list, type passwordTerminal emulator available in a windowLog out when the work is doneText mode consoleNo user list: type username, then passwordPassword is not echoed on screenCtrl Alt F2 opens a virtual terminalRemote: over the networkRemote graphical loginNo single standard: depends on the serverVNC viewer, or an RDP client via xrdpClient plus IP plus user and passwordRemote text login over SSHOpenSSH daemon listens on the serverAn SSH client runs on the local machineThe standard way to reach a Linux serverMost Linux servers ship with no GUI components at all.In practice almost every login is the bottom right box.

Đăng nhập local​

Trên máy có cài GUI, mọi thứ hiện ngay trước mắt: một danh sách user để chọn, một ô nhập password. Xong việc thì log out. Ngay cả khi có desktop environment, vẫn có terminal emulator để làm việc trên command line.

Trên máy cài theo kiểu server (không có GUI, không chuột, không cửa sổ, không menu, chỉ có chữ), màn hình không đưa ra danh sách user: tự gõ username rồi gõ password. Password không hiện lên khi gõ. Kết thúc phiên làm việc bằng exit.

Đăng nhập remote vào graphical console​

Phần này rắc rối hơn, vì không có chuẩn nào được chốt. Người dựng server chọn cách họ thích:

  • Nếu họ cài VNC (Virtual Network Computing), phía client cần một VNC client, còn gọi là VNC Viewer: TightVNC, RealVNC, hoặc thứ khác. Chọn cái nào tuỳ VNC server đang chạy trên máy remote và tuỳ hệ điều hành local hỗ trợ client nào.
  • Nếu họ muốn người dùng Windows kết nối được, thường là một giải pháp cho phép RDP (Remote Desktop Protocol). Phía Windows chỉ cần bấm Start, gõ Remote Desktop Connection, mở app đó lên rồi nhập username và password.

Trong bài demo của khoá, máy Ubuntu được cài xrdp và cấu hình để máy Windows kết nối vào desktop. Phía Windows tìm Remote Desktop, nhập IP của máy remote (ví dụ 10.0.0.81), có thể gặp một cảnh báo certificate thì chọn Yes, rồi nhập username và password của Linux. Sau đó maximize cửa sổ là dùng desktop Ubuntu như đang ngồi trước máy.

Quy luật chung cho mọi biến thể: tải đúng app client, nhập IP của máy remote, nhập username và password.

Đăng nhập remote bằng text mode​

Đây là kiểu chuẩn hoá nhất, vì gần như mọi server Linux đều dùng chung một công cụ: OpenSSH daemon, một program chạy nền liên tục trên server. SSH viết tắt của Secure Shell.

Trước khi có SSH, chuẩn là Telnet. Telnet không mã hoá đường truyền, nên bất kỳ ai cùng network đều có thể lấy được username, password và xem toàn bộ những gì diễn ra trong phiên Telnet đó. Giao thức SSH dùng mã hoá mạnh để chặn chuyện này, và OpenSSH daemon được viết rất cẩn thận để tránh lỗ hổng bảo mật. Hàng triệu server đang dùng nó, qua nhiều năm chứng minh là rất khó hack, nên cả giới vận hành tin vào nó để chỉ cho người được phép đăng nhập vào hệ điều hành.

Để kết nối vào daemon đó cần một SSH client chạy trên máy local. macOS và các bản Linux như Ubuntu đã có SSH client cài sẵn: mở terminal emulator là dùng được. Windows ngày trước phải cài client riêng như PuTTY; từ Windows 10 và 11 thì không cần nữa, SSH client đã có sẵn, mở Start rồi gõ cmd để vào Command Prompt.

Cần biết IP của máy đích. Đăng nhập trực tiếp vào virtual machine rồi chạy:

ip a

# Output (rút gọn):
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
inet 192.168.0.17/24 brd 192.168.0.255 scope global enp0s3

Dòng inet cho biết IP máy đang dùng. Lấy IP đó (ở đây là 192.168.0.17) để mô phỏng tình huống có một server ở xa, rồi kết nối:

Thay aaron bằng username đã tạo trong hệ điều hành Linux, và thay IP tương ứng. Lần đầu kết nối tới một máy sẽ có một prompt hỏi xác nhận: gõ yes. Sau đó nhập password là vào.

Mọi bài thực hành ở các phần sau đều thực hiện bên trong phiên SSH này.


2. Tra cứu trợ giúp ngay trên command line​

Mỗi command trong Linux có hàng chục command-line switch. Dùng một lệnh đủ nhiều lần thì nhớ hết, nhưng lúc mới dùng một hai lần thì quên ngay. Linux cho nhiều đường để tra help, manual và documentation ngay tại command line, không cần mở browser.

Hai thứ này được phép dùng trong kỳ thi online của Linux Foundation: man và --help. Nên luyện --help trước vì nó cho kết quả nhanh nhất; lặn vào một trang manual sẽ ăn mất thời gian làm bài.

Tuỳ chọn --help​

Giả sử cần xem long listing format của ls để nhìn file permission nhưng quên mất option nào cho ra định dạng đó:

ls --help

Output dài, nhưng cuộn lên sẽ thấy cái cần tìm: flag -l. Các command-line option được sắp theo thứ tự chữ cái, kèm mô tả ngắn.

Với ls thì như vậy là đủ vì lệnh đó đơn giản. Những lệnh phức tạp hơn cần đọc giải thích dài hơn mới hiểu chúng làm gì và dùng ra sao. Lấy journalctl, lệnh đọc system log, làm ví dụ:

journalctl --help

Lần này output mở ra theo cách hơi khác. Góc dưới bên trái hiện lines 1-27. Linux vừa mở một pager: một trình xem text, cuộn lên xuống bằng phím mũi tên hoặc Page Up, Page Down. Thoát trang help này bằng q.

Manual page​

Mọi lệnh quan trọng trong Linux đều có manual riêng, gọi là man page. Cú pháp là man rồi tên lệnh:

man journalctl

Một man page gồm các phần: NAME mô tả ngắn lệnh làm gì, SYNOPSIS cú pháp tổng quát, DESCRIPTION giải thích chi tiết cách lệnh hoạt động. Một số man page còn có phần ví dụ ở gần cuối.

Đôi khi hai man page trùng tên nhau. printf là một command, nhưng printf cũng là một function cho người lập trình gọi. Man page được chia thành nhiều category, xem danh sách category bằng chính man page của man:

man man

Muốn đọc về printf dạng command thì chỉ định section 1, muốn đọc về printf dạng function thì chỉ định section 3:

man 1 printf
man 3 printf

Tìm lệnh khi không nhớ cả tên lệnh​

Những cách trên chỉ dùng được khi đã biết tên lệnh. Trường hợp khó hơn: cần tạo một directory mới nhưng không nhớ lệnh đó tên gì. apropos tìm xuyên qua các man page, đối chiếu phần mô tả ngắn của từng man page với chuỗi được nhập vào.

Lần đầu chạy apropos trên một máy ảo vừa khởi động thường gặp lỗi, vì apropos dựa vào một database và database đó cần một program refresh định kỳ. Trên máy vừa dựng, database chưa được tạo. Tạo tay bằng:

sudo mandb

Trên server đã chạy nhiều ngày thì không cần làm bước này, hệ thống tự làm. Sau đó apropos hoạt động:

apropos directory

Nên tìm với director thay vì directory: directory khớp cả những mô tả chứa directories, nhưng tìm đúng chuỗi directory thì bỏ sót những mô tả chỉ có dạng số nhiều. Giữ từ khoá ngắn và chung sẽ bắt được nhiều kết quả hơn.

Cuộn lên sẽ thấy mkdir, nhưng danh sách quá nhiều dòng. apropos không chỉ liệt kê command: nó liệt kê cả những thứ khác, ví dụ các entry ghi (2) nghĩa là nằm ở section 2 của man page, chứa system call do Linux kernel cung cấp, quá sâu so với nhu cầu hiện tại. Command nằm ở section 1 và 8, nên lọc đúng hai section đó bằng -s:

apropos -s 1,8 directory

Giờ dễ nhìn thấy mkdir hơn nhiều. Chú ý phần mô tả của mkdir chứa chữ directories: nếu lúc tìm dùng directory thì lệnh này đã không xuất hiện, vì directory không khớp directories.

Auto-completion​

Không hẳn là system documentation, nhưng tiết kiệm thời gian không kém. Gõ systemctl rồi nhấn Tab, shell tự điền phần còn thiếu.

Nhiều lệnh có gợi ý cho phần gõ tiếp theo. Gõ systemctl, thêm một dấu cách, không nhấn Enter, rồi nhấn Tab hai lần:

systemctl <Tab><Tab>

Một danh sách gợi ý rất dài hiện ra, giúp hình dung lệnh đó có những option nào. Đừng dựa hẳn vào nó: không chắc tất cả option đều nằm trong danh sách gợi ý này.

Gõ thiếu cũng xong việc. Thử systemctl list-dep rồi nhấn Tab:

systemctl list-dep<Tab>

Phần endencies được điền thêm vào, thành systemctl list-dependencies. Cơ chế là: khi nhấn Tab, nếu command interpreter suy ra được ý định thì nó tự điền phần chữ còn lại; nếu có nhiều gợi ý và không đoán được muốn cái nào, nhấn Tab lần nữa để nó in ra danh sách gợi ý.

Tab cũng hoạt động với tên file và tên directory:

ls /u<Tab>
ls /usr<Tab><Tab>

Lệnh thứ hai liệt kê các directory có trong /usr mà không cần chạy ls để xem trước. Với tên file dài như wordpress_archive.tgz, gõ wor rồi Tab là tên dài đó được điền trọn.

Vài giây tiết kiệm được mỗi lần như vậy cộng lại có thể đủ cho một hai câu hỏi nữa trong kỳ thi.

Cách luyện hiệu quả nhất: chọn một lệnh chưa biết gì về nó, rồi chỉ dùng man và --help để tự tìm ra cách làm một việc cụ thể với lệnh đó. Kỳ thi LFCS luôn có câu về phần lý thuyết chưa học tới hoặc đã quên; biết cách tra nhanh bằng man page hay help page sẽ đỡ rất nhiều.


3. File system tree và hai cách viết đường dẫn​

Linux tổ chức file và directory theo cái nó gọi là file system tree. Gọi là cây vì nó có gốc (root), có nhánh, có lá, chỉ khác là cây này bị dốc ngược: gốc ở trên, nhánh và lá mọc xuống dưới.

Root directory là dấu /. Đây là directory cấp cao nhất, không thể có directory nào nằm trên nó. Dưới / là một số sub-directory như home, var, etc, và các sub-directory đó lại chứa sub-directory khác.

Để chạm tới một file hay directory trên command line phải chỉ ra file path hoặc directory path của nó, và path viết được theo hai cách.

The inverted file system treeroothomevaretcaaronjaneDocumentsinvoice.pdfAbsolute path starts at the root slash/home/aaron/Documents/invoice.pdfRelative path, standing in /home/aaronDocuments/invoice.pdfMoving aroundcd .. goes one directory upcd - returns to the previous directorycd alone returns to the home directory

Liệt kê nội dung directory​

Liệt kê mọi file và directory, kể cả những cái bắt đầu bằng dấu chấm:

ls -la

-a đến từ chữ all, hiện cả những file và directory "ẩn nửa vời" có tên bắt đầu bằng dấu chấm. -l cho ra long listing format, dạng hiện nhiều chi tiết hơn cho mỗi entry: permission của file hay directory, user và group sở hữu nó, lần sửa cuối là khi nào.

Liệt kê ở một vị trí khác thì ghi directory path ra sau cùng:

ls /var/log
ls -l /var/log

Thứ tự các flag không quan trọng, và không bắt buộc phải thêm dấu gạch trước từng flag. Ba cách sau cho cùng kết quả, trong đó dạng cuối được ưu tiên vì gõ nhanh nhất:

ls -a -l
ls -al
ls -la

Có thêm option -h hiện kích thước ở dạng người đọc được (byte, kilobyte, megabyte...), và -h phải đi kèm -l mới có tác dụng:

ls -lah

Current working directory​

Khi làm việc trên command line, luôn luôn đang đứng bên trong một directory nào đó. Xem mình đang ở đâu bằng pwd, viết tắt của print working directory:

pwd

# Output:
/home/aaron

Mỗi user khi đăng nhập đều bắt đầu ở home directory của mình. User aaron bắt đầu ở /home/aaron, user jane ở /home/jane. Riêng superuser root có home directory ở /root.

Đổi current directory bằng cd, viết tắt của change directory:

cd /var/log
cd /home/aaron

Hai lệnh trên dùng absolute path. Ngoài ra còn:

cd ..
cd /
cd -
cd
  • cd .. đi lên một cấp. Đang ở /home/aaron thì cd .. đưa về /home. Hai dấu chấm luôn trỏ tới parent directory của current directory.
  • cd / về thẳng root directory.
  • cd - quay lại working directory trước đó. Đang ở /home mà trước đó ở /var/log thì cd - đưa về /var/log.
  • cd không kèm option hay path nào luôn đưa về home directory.

Absolute path và relative path​

Absolute path luôn bắt đầu bằng root directory, tức dấu /. Sau đó là các sub-directory cần đi vào, phân cách bằng dấu /, cuối cùng là file cần chạm tới: /home/aaron/Documents/invoice.pdf nghĩa là vào home, rồi aaron, rồi Documents, rồi lấy invoice.pdf.

Relative path tính từ current directory. Giả sử current directory là /home/aaron, có ba kiểu tham chiếu:

  • Dưới current directory: Documents/invoice.pdf. Relative path được cộng vào current directory, nên nó tương đương /home/aaron/Documents/invoice.pdf.
  • Ngay trong current directory: invoice.pdf trỏ tới /home/aaron/invoice.pdf.
  • Trên current directory: ../invoice.pdf trỏ tới /home/invoice.pdf, vì ../ nghĩa là lùi lên một cấp. Dùng ../ nhiều lần cũng được: ../../invoice.pdf trỏ tới /invoice.pdf, tức file invoice.pdf ngay tại root, vì lần lùi thứ nhất lên /home và lần thứ hai lên /.

Mọi lệnh bàn ở phần sau đều nhận cả absolute path lẫn relative path, nên các bản thay thế này sẽ không nhắc lại cho từng lệnh.


4. Thao tác cơ bản với file và directory​

Giả sử đang đứng ở home directory.

Tạo file và directory​

touch receipt.pdf

touch tạo file trong current directory. Tạo ở nơi khác thì ghi path, dùng absolute hay relative đều được:

touch /home/jane/receipt.pdf
touch ../jane/receipt.pdf

Hai lệnh trên làm cùng một việc khi đang đứng ở /home/aaron.

Tạo directory bằng mkdir, viết tắt của make directory:

mkdir Receipts

Copy​

cp (từ chữ copy) nhận trước path của file nguồn, sau đó path của đích: cp source destination.

cp receipt.pdf Receipts/

Chú ý dấu / đóng ở cuối Receipts/. Không có dấu đó vẫn chạy, nhưng tập thói quen đóng tên directory bằng / cho ra một dấu hiệu thị giác hữu ích: Receipts có thể là file, còn Receipts/ thì là directory.

Copy kèm đổi tên ở đích:

cp receipt.pdf Receipts/receipt-copy.pdf

Copy một directory cùng toàn bộ nội dung bên trong cần thêm option -r. Option này (còn gọi là command-line flag) bảo cp copy đệ quy: lấy cả bản thân directory, lặn vào trong và copy mọi thứ nó chứa, gồm file và các subdirectory, rồi lặn tiếp vào các subdirectory đó.

cp -r Receipts "Backup of Receipts"

Tên directory đích phải chưa tồn tại. Nếu Backup of Receipts đã có sẵn ở /home/aaron, lệnh trên không tạo bản clone như mong đợi mà đặt Receipts vào bên trong nó, kết quả thành Backup of Receipts/Receipts.

Di chuyển và đổi tên​

Copy để lại hai bản: bản gốc và bản mới ở vị trí mới. Khi chỉ muốn file có mặt ở vị trí mới và biến mất ở vị trí cũ thì dùng mv, từ chữ move:

mv receipt.pdf Receipts/

File được chuyển đi, chỉ còn đúng một bản.

Đổi tên cũng là mv, với tên mới ở vị trí đích. Cách này áp dụng cho cả file và directory:

mv receipt.pdf old-receipt.pdf
mv Receipts Old-Receipts

mv không cần flag -r để làm việc đệ quy với directory, nó tự lo phần đó.

Xóa​

rm đến từ chữ remove:

rm invoice.pdf
rm -r invoices

Xóa một directory cần -r để xóa đệ quy: bản thân directory cùng các subdirectory và file bên trong.

Quy tắc dễ nhớ: khi copy hay xóa directory, luôn nhớ tới option -r.


Một máy Linux dùng chung cho hai user, aaron và jane. Mỗi người đăng nhập bằng username và password riêng, có desktop riêng, cấu hình program riêng. aaron chụp ảnh con chó của gia đình rồi lưu vào /home/aaron/Pictures/family_dog.jpg.

Mô phỏng lại một file như vậy:

mkdir Pictures
echo "picture of Milo the dog" > Pictures/family_dog.jpg

Có một lệnh cho xem những thông tin thú vị về file và directory:

stat Pictures/family_dog.jpg

# Output (minh họa):
File: Pictures/family_dog.jpg
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 52946177 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ aaron) Gid: ( 1000/ aaron)

Trong output có một inode number. File system như XFS, ext4 và các loại khác theo dõi dữ liệu nhờ inode. Tấm ảnh kia có thể nằm rải rác thành nhiều block dữ liệu khắp đĩa, nhưng inode nhớ tất cả những mảnh đó nằm ở đâu. Nó cũng giữ metadata: permission, lần sửa cuối, lần truy cập cuối.

Nói với máy tính "cho tôi xem inode 52946177" thì bất tiện, nên con người làm việc với file name. File name trỏ tới inode, inode trỏ tới toàn bộ các block dữ liệu cần lấy.

Chỗ đáng chú ý trong output stat là trường Links, đang có giá trị 1. Trường này đếm số hard link trỏ tới inode đó từ các file name. Lúc tạo file, chuyện diễn ra như sau: hệ thống nhận yêu cầu lưu dữ liệu dưới tên family_dog.jpg, nó gom toàn bộ dữ liệu của file vào inode 52946177, tạo các data block và inode, rồi hard link tên family_dog.jpg vào inode đó. Lúc đọc file, hệ thống tra xem tên này link tới inode nào rồi trả về dữ liệu của inode đó.

Hard link vs soft linkHard link: two names, one inodeaaron copyfamily_dog.jpgjane copyfamily_dog.jpginode 52946177Links: 2data blocks on diskSoft link: a file holding a pathfamily_dog_shortcut.jpgstores a path, not an inode numberreadlink prints this pathPictures/family_dog.jpgthe real target fileRename the target and the link breaksls -l shows a broken link in redA hard link points at an inode. A soft link points at a path.

jane có folder ảnh riêng ở /home/jane/Pictures. Cách dễ nhất để aaron chia sẻ tấm ảnh là copy nó sang /home/jane/Pictures/family_dog.jpg. Với một tấm ảnh thì không vấn đề gì. Với 5000 tấm ảnh nặng 20 gig thì phải chứa 20 gig đó hai lần, tốn 40 gig cho dữ liệu mà lẽ ra chỉ cần 20 gig.

Thay vì copy, hard link nó. Cú pháp là ln, path tới target file, rồi path tới link file. Target file là file muốn link tới; link file là tên của hard link mới sắp tạo ra:

ln /home/aaron/Pictures/family_dog.jpg /home/jane/Pictures/family_dog.jpg

Về mặt kỹ thuật, hard link vừa tạo ở đích là một file như mọi file khác. Nó chỉ khác ở một điểm: thay vì trỏ tới một inode mới, nó trỏ tới đúng inode của target file. Tấm ảnh được lưu đúng một lần, nhưng cùng dữ liệu đó truy cập được ở nhiều vị trí qua nhiều file name khác nhau. Chạy stat lúc này sẽ thấy Links: 2, vì inode đó đang có hai hard link trỏ vào.

Điểm hay tiếp theo nằm ở chuyện xóa. aaron và jane chia sẻ 5000 tấm ảnh qua hard link, rồi aaron quyết định xóa hard link của mình ở /home/aaron/Pictures/family_dog.jpg. Ảnh của jane không bị gì cả, cô vẫn truy cập được dữ liệu đó, vì inode vẫn còn một hard link trỏ vào: trước có hai, giờ còn một.

Nhưng khi jane cũng xóa hard link của mình ở /home/jane/Pictures/family_dog.jpg, inode còn zero link. Lúc số link về zero, chính dữ liệu đó biến mất khỏi file system. Về mặt vật lý, các data block không bị ghi xoá ngay, chúng chỉ bị đánh dấu là không dùng nữa để hệ thống ghi dữ liệu mới lên; nhưng từ góc nhìn người dùng thì dữ liệu đã mất.

Cơ chế này cho những người dùng chung hard link tự do xóa cái họ không cần mà không ảnh hưởng tới người khác vẫn còn cần dữ liệu đó. Dữ liệu chỉ bị bỏ khi mọi người đều đã quyết định không cần nó nữa.

Giới hạn và những thứ phải tính trước​

Hard link có hai giới hạn cứng:

  • Chỉ hard link được tới file, không link được tới directory.
  • Chỉ hard link được tới file nằm trên cùng một file system. Có một ổ ngoài mount ở /mnt/backups thì không thể hard link một file từ SSD ở /home/aaron/file sang một file nào đó trên /mnt/backups, vì đó là file system khác.

Hai thứ cần tính trước khi tạo hard link:

  • Phải có đủ permission để tạo link file tại đích. Ở ví dụ trên là quyền write tại /home/jane/Pictures.
  • Mọi user liên quan phải có đủ permission để truy cập chính file đó. Với aaron và jane, chuyện này có thể có nghĩa là thêm cả hai username vào cùng một group, ví dụ group family, rồi cho group family quyền read và write lên file này.

Chỉ cần đổi permission trên một trong các hard link, vì permission được lưu ở inode chứ không ở tên file. Sửa permission tại /home/aaron/Pictures/family_dog.jpg thì /home/jane/Pictures/family_dog.jpg và mọi hard link khác đều hiện đúng bộ permission mới. Cách đổi permission nằm ở Part 2.2: Phân quyền file và permission đặc biệt.


💡 Hình dung: cài một program trên Windows thường kèm một shortcut trên desktop. Double-click shortcut là app chạy, dù app không hề được cài trên desktop: file của nó nằm ở C:\Program Files\MyCoolApp, và shortcut chỉ trỏ tới file thực thi C:\Program Files\MyCoolApp\application.exe. Double-click vào shortcut là được chuyển hướng sang application.exe rồi file đó được thực thi.

Soft link trong Linux hoạt động rất giống shortcut đó. Hard link trỏ tới một inode, còn soft link là một file chứa một path, gần như một file text bên trong có đường dẫn tới một file hay directory.

Cú pháp giống ln ở mục trước, chỉ thêm option -s (từ chữ symbolic, nên soft link còn gọi là symbolic link): ln -s, path tới target, path tới link file. Path tới target là nơi soft link sẽ trỏ đến, là vị trí một file hoặc directory; path tới link file là file soft link sắp được tạo.

ln -s /home/aaron/Pictures/family_dog.jpg family_dog_shortcut.jpg

Liệt kê ở long listing format:

ls -l

# Output (minh họa):
lrwxrwxrwx 1 aaron aaron 41 Oct 24 10:12 family_dog_shortcut.jpg -> /home/aaron/Pictures/family_dog.jpg
drwxr-xr-x 2 aaron aaron 4096 Oct 24 10:10 Pictures

Chữ l ở đầu dòng cho biết đây là một soft link, và ls -l còn in ra luôn path mà soft link trỏ tới. Khi path dài, ls -l có thể không hiện hết. Lệnh thay thế để xem path được lưu trong một soft link là readlink:

readlink family_dog_shortcut.jpg

# Output:
/home/aaron/Pictures/family_dog.jpg

Trong output ls -l ở trên, mọi permission bit rwx đều bật trên soft link. Permission của chính soft link không có ý nghĩa gì: permission của file đích mới là cái được áp dụng. Thử ghi vào một soft link trỏ tới /etc/fstab sẽ bị từ chối, vì /etc/fstab không cho user thường ghi vào.

Lệnh ở trên dùng absolute path /home/aaron/Pictures/family_dog.jpg. Nếu sau này directory aaron bị đổi tên, soft link đó đứt. Link đứt hiện màu đỏ trong output của ls -l.

Cách xử lý là tạo soft link bằng relative path. Đang đứng ở home directory của aaron, dùng relative path của file ảnh thay vì ghi path đầy đủ:

ln -s Pictures/family_dog.jpg relative_picture_shortcut.jpg

Ai đọc relative_picture_shortcut.jpg sẽ được chuyển hướng tới Pictures/family_dog.jpg, tính tương đối với directory chứa chính soft link đó.

Vì soft link chỉ là một path trỏ tới một file, nó không mang theo hai giới hạn của hard link: soft link tới directory được, và soft link tới file hoặc directory nằm trên file system khác cũng được.


Nguồn tham khảo​

Nguồn gốc: Khóa "Prep Course - Linux Foundation Certified System Administrator (LFCS) Certification" — phần "Essential Commands" (đăng nhập hệ thống Linux local và remote, demo đăng nhập GUI/RDP/SSH, tra cứu system documentation, tạo và quản lý file cùng directory, hard link, soft link), nền tảng KodeKloud. Giảng viên: Jeremy Morgan và Alexandru Andrei.