Giải ngố Linux – Phần 2: Linux Filesystem và các đòn cơ bản để duyệt và quản lý file với Command Line

Vẫn tiếp tục với câu hỏi Linux là gì? trong Phần 1, kỳ này tôi sẽ đi sâu hơn một tí vào 2 nội dung khá đặc trưng của hệ điều hành này là Linux FilesystemCommnand Line – một “công cụ sinh tồn cơ bản” trong “khu rừng Linux”. Vâng, tôi biết, với “người thường (làm với Linux Server)”, Command Line thì có cái vẹo gì để mà bàn bạc. Nhưng với gà mờ sống trong nhung lụa của Graphical Interface (giao diện đồ họa) từ bé, khi bị đẩy vào thế Command Line là lựa chọn duy nhất (ví dụ như khi ssh vào Linux Server), gà mờ mới thấm thía cảm giác tủi nhục, bất lực khi nhìn con chuột thường ngày tung tóe rê/click đã bị phế hoàn toàn võ công.

Quay lại vấn đề chính, đối tượng tôi dùng demo kỳ này sẽ vẫn là con Kali Linux đã dựng sẵn cho đỡ mất thời gian. Tuy nhiên phần lớn các nội dung sau đây có thể áp dụng cho Linux nói chung nên bạn chơi Distro khác thì 99% vẫn ngon ăn.

#1 Behold… Linux Filesystem!

Trước khi có thể bay vô đâm chép với đám Linux Command Line, việc đầu tiên và chán ngấy (nhưng vẫn phải làm) đó là rà sơ bộ về Linux Filesystem (hệ thống file Linux). Dù nó có một số điểm tương đồng với Windows nhưng nếu bạn định chơi ẩu bỏ qua phần này thì ăn hành như chơi đấy nhé.

Với các Linux Distros, Filesystem Hierarchy Standard (FHS) sẽ chuẩn hóa mục đích sử dụng của từng thư mục. Cụ thể đám đầu sỏ Top-level Directories được tóm lược như sau:

  • /bin/: chứa các chương trình cơ bản;
  • /boot/: chứa file của Linux Kernel và file dùng cho quá trình khởi động ban đầu;
  • /dev/: chứa file cho thiết bị;
  • /etc/: chứa file cấu hình;
  • /home/: chứa file cá nhân của các user;
  • /lib/: chứa các thư viện cơ bản;
  • /media/*: điểm mount (đại ý là điểm kết nối) các removable device (CD-ROM, USB,…);
  • /mnt/: điểm mount tạm;
  • /opt/: chứa các ứng dụng phụ của third parties;
  • /root/: chứa file cá nhân của administrator (root);
  • /run/: chứa volatile runtime data (dữ liệu dễ “bay hơi”! – nghĩa là reboot thì bay màu ấy) chưa được FHS quản lý)
  • /sbin/: chứa các chương trình hệ thống;
  • /srv/: chứa dữ liệu dùng cho server hosted trên hệ thống;
  • /tmp/: chứa các file tạm (thường bị xóa khi khởi động);
  • /usr/: chứa các ứng dụng và thường chia nhỏ thành các thư mục con như binsbinlibtương tự như kiểu của thư mục root. Trong đám này còn có /usr/share/ chứa các dữ liệu chơi được với nhiều dạng kiến trúc khác nhau và /usr/local/ được admin dùng để cài thủ công các ứng dụng nhằm tránh ghi đè lên file packaging system (dpkg) quản lý.
  • /var/: chứa dữ liệu variable (biến) do các daemon xử lý. Đám này thường bao gồm log files, queues, spools, và caches.
  • /proc/và /sys/: hai thằng này thì tùy thuộc Linux Kernel (và không thuộc FHS), được kernel sử dụng để xuất thông tin về các phần cứng đã nhận diện.

Trong đám trên thì /home/user cần được đặc biệc lưu ý. User home directory thường được thể hiện bằng dấu “~”, và khi được xử lý, Command Interpreter sẽ thay thế “~” với thư mục phù hợp cho từng user (ví dụ /home/convitlac).

Lưu ý:

  • Daemon dịch thô bỉ ổi là “con quỷ”. Nhưng nếu áp vô ngữ cảnh hiện tại thì như sh*t vì chỉ tổ làm rối rắm vấn đề. Để hình dung đơn giản thì có thể hiểu daemon là chương trình có thể được kích hoạt chạy nền trên Linux khi có một sự kiện cụ thể mà không cần có user kiểm soát. Một số deamon “nổi tiếng” như httpd, sshd;
  • Command Interpreter thay thế “~” với thư mục phù hợp cho từng user dựa vào thông tin được lưu trong HOME Environment Variable với giá trị tương ứng là /home/user/ (Nếu chưa biết Command Interpreter Environment Variable là gì thì bạn kéo xuống Mục 2 bên dưới để xem thêm).

Thông thường, User home directory cũng là vị trí lưu file cấu hình ứng dụng với tên bắt đầu bằng dấu “.” (ví dụ với email client Mutt sẽ là ~/.muttrc). Với kiểu “thông thường” này, do được tự do phát triển nên User home directory có khả năng trở thành cái đống rác sau một thời gian sử dụng. May mắn thay, đã có XDG Base Directory Specification hỗ trợ khắc phục vấn đề này. Theo đó, giải pháp khuyến nghị là:

  • ~/.config: dùng lưu file cấu hình;
  • ~/.cache: lưu cache file;
  • ~/.local: lưu dữ liệu ứng dụng hoặc thư mục con.

Lưu ý:

  • Đám file cấu hình này mặc định sẽ ẩn nên bạn sẽ dùng command ls -a hoặc kích hoạt hiển thị file ẩn nếu dùng giao diện đồ họa;
  • Với Graphical desktop, bạn sẽ có thêm ~/Desktop để chứa đám dữ liệu trên desktop của từng user.
XDG Base Directory Specification
XDG Base Directory Specification

#2 Shell, Command Line và các đòn thế duyệt và quản lý file

#2.1 Mối quan hệ mờ ám của Command Line và Shell

Trước hết, Command Line Interface – CLI (Text-based interface hay giao diện dòng lệnh) nói chung là giao diện dạng text cho phép bạn nhập command, thực thi nó và xem kết quả thực thi (cũng ở dạng text). Để làm được điều này, nó sẽ nhờ cậy vào một nhân vật có tên gọi là Command Interpreter (đại ý là thằng thông dịch command cho máy hiểu) hay gọi bằng tên quen thuộc hơn là “The Shell” (trong Kali Linux mặc định là Bash – Bourne Again Shell).

Bash - Bourne Again Shell
Bash – Bourne Again Shell

Shell sẽ thực thi mỗi command (ví dụ ls) bằng cách chạy chương trình đầu tiên có tên khớp với command (ở đây đang ví dụ là ls) mà nó tìm thấy trong thư mục liệt kê trong PATH Environment Variable ví dụ như /bin/ls.

Ngoài ra, còn có loại Shell built-in command có thể được Shell xử lý trực tiếp như command cdpwd. Để biết thể loại command bạn có thể dùng cú pháp type command_name để kiểm tra.

Lưu ý:

  • Nếu lúc nãy bạn bỏ qua thông tin đám FHS Top-level Directories trong Mục 1 thì giờ chịu khó quay lại xem cái đi, sắp phải dùng rồi đấy!
  • Thông thường, các chương trình sẽ nằm trong /bin, /sbin, /usr/bin hoặc /usr/sbin;
  • Để biết vị trí của command được thực thi bạn có thể dùng which (ví dụ which ls sẽ cho bạn biến vị trí command ls được gọi thực thi từ /bin/ls);
  • Environment Variable (Biến môi trường) có thể được dùng để lưu giữ Global Settings (kiểu như các thiết lập tổng thể của hệ thống) cho đám Shell và các chương trình khác sử dụng (mỗi process có thể có bộ Environment Variable riêng theo Contextual (ngữ cảnh) cụ thể của nó). Với Shell (ví dụ như Login Shell), nó có thể Declare Variables (khai báo biến) để chuyển đến các chương trình khác được Shell thực thi (chỗ này nếu thấy rối quá thì bạn bỏ qua đi, chừng đụng trận thực tế tôi nói kỹ hơn sau vậy). Environment Variable có thể định nghĩa ở 2 cấp độ: System-wide (tại vị trí /etc/profile) hoặc Per-user (tại vị trí ~/.profile). Đối với đám Variable không cho các command cụ thể nói trên thì giang hồ khuyên nên đặt trong /etc/enviroment để sử dụng trong session của các user thông qua Pluggable Authentication Module (PAM).

#2.2 Command Line duyệt và quản lý file

Để gọi CLI, bạn có thể dùng nhiều cách. Ngoài mấy phương án tôi dùng như trong nội dung Giải ngố Virtualization – Phần 6: Cơ chế cấp IP Address trên Kali Linux VM, đọc ngay để tránh bị ăn hành bởi VMware network, bạn có thể truy cập vào khu vực tìm kiếm và gõ “Terminal” như sau cũng được.

Open Terminal
Open Terminal

Lưu ý:

  • Với con hàng Kali, tôi còn có một lựa chọn khác nhanh gọn hơn là tổ hợp phím tắt CTRL+ALT+T;
  • Nếu bạn ssh vào Linux Server thật thì khỏi quan tâm vấn đề mở CLI vì sau khi xác thực thành công rồi thì bạn bay vô CLI ngay chứ không chạy đi đâu được đâu;

Sau khi đã truy cập vào CLI, trước hết bạn cần dợt một số đòn thế Command Line duyệt và quản lý file cơ bản như sau:

pwd – print working directory

  • Mục đích: hiển thị vị trí hiện hành trong filesystem
  • Cú pháp: pwd

cd  – change direcroty

  • Mục đích: thay đổi thư mục hiện hành
  • Cú pháp:
    • cd: di chuyển về home directory
    • cd –: di chuyển về directory trước khi thực thi command cd trước đó
    • cd ..: di chuyển về thư mục cha của thư mục hiện hành (kí hiệu là “.”, thư mục cha lớn hơn nên hiển nhiên phải là “..”!)
    • cd target_directory: di chuyển đến thư mục target_directory

ls – listing

  • Mục đích: liệt kê nội dung của thư mục
  • Cú pháp:
    • ls: liệt kê nội dung thư mục hiện hành
    • ls target_directory: liệt kê nội dung thư mục target_directory
    • Option -l: liệt kê theo long list format – nghĩa là liệt kê nhiều thông tin hơn
Basic Command Line
Basic Command Line

Lưu ý: kí hiệu “$” cho biết tôi đang đăng nhập với user thường (testkali). Nếu bạn đăng nhập bằng super user như root thì thấy “#”. 

mkdir – make directory

  • Mục đích: tạo thư mục
  • Cú pháp:
    • mkdir target_directory: tạo thư mục target_directory

rm – remove file/directory

  • Mục đích: xóa file/thư mục
  • Cú pháp:
    • rm target_file/ target_directory: xóa target_file
    • Option -f: force, xóa kiểu chà đạp dư luận, không cần nói nhiều (cần đặc biệt lưu ý khi sử dụng, xóa nhầm là mệt mỏi luôn đấy)
    • Option -R: xóa kiểu Recursive (đệ quy) đối với toàn bộ file và thư mục con trong target_directory

mv – moving file/directory

  • Mục đích: di chuyển tập tin/thư mục (cho phép đổi tên)
  • Cú pháp:
    • mv source destination: source và destination ở đây có thể là file/thư mục

cp – copy file

  • Mục đích: sao chép tập tin
  • Cú pháp:
    • cp source_file target_file: copy source_file thành target_file (để thế này thì nó sẽ thực thi ở thư mục hiện hành. Bạn có thể chỉ định thêm đường dẫn nếu cần)

OK, tôi nghĩ kì này sơ bộ như thế thôi. Kỳ tới tôi sẽ tiếp tục đào bới kỹ thêm về đám Command Line ảo diệu này!

4 thoughts on “Giải ngố Linux – Phần 2: Linux Filesystem và các đòn cơ bản để duyệt và quản lý file với Command Line”

Leave a Reply

Your email address will not be published. Required fields are marked *