Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 8 — Linux Fundamentals cho DevOps Engineer

Đã đọc 0/15 mục · còn khoảng 11 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Mở đầu — vì sao bài này quan trọng

Nếu bạn hỏi mười DevOps Engineer đang đi làm rằng kỹ năng nào họ dùng nhiều nhất mỗi ngày, khả năng cao chín người sẽ trả lời: gõ lệnh trên Linux. Không phải Terraform, không phải Kubernetes, mà là cái terminal đen ngòm với dấu nhắc $ nhấp nháy. Lý do rất đơn giản: hơn 90% máy chủ production trên thế giới chạy Linux. Mọi container bạn build đều dựa trên một image Linux. Mọi node trong cụm Kubernetes gần như chắc chắn là một máy Linux. Mọi máy ảo (VM) bạn tạo trên AWS, Google Cloud hay một VPS Hostinger giá rẻ ở Việt Nam, theo mặc định đều là Linux.

Nói cách khác, Linux là "tiếng mẹ đẻ" của hạ tầng hiện đại. Bạn có thể dùng giao diện đồ họa để nhấp chuột trên máy tính cá nhân, nhưng khi SSH vào một server production lúc 2 giờ sáng để xử lý sự cố, bạn chỉ có terminal và bàn phím. Không có chuột, không có menu, không có đường lùi. Đó là lúc kỹ năng Linux quyết định bạn xử lý sự cố trong 5 phút hay 5 tiếng.

Bài này không nhằm biến bạn thành một quản trị hệ thống Linux chuyên sâu. Mục tiêu thực tế hơn: trang bị cho bạn bộ nền tảng đủ vững để tự tin sống trên terminal — hiểu hệ thống file, quản lý tiến trình, đọc log, phân quyền, và ghép các lệnh lại để tự động hóa công việc. Đây chính là lớp nền mà tất cả các bài sau (shell scripting, Docker, Kubernetes) sẽ đứng lên trên đó.

Khái niệm cốt lõi

Filesystem — mọi thứ đều là file

Triết lý nền tảng của Linux là "everything is a file" — mọi thứ đều là file. Ổ đĩa, thiết bị mạng, tiến trình đang chạy, thậm chí cấu hình kernel, tất cả đều được biểu diễn dưới dạng file trong một cây thư mục thống nhất bắt đầu từ gốc / (root). Hiểu cây thư mục này giúp bạn biết cái gì nằm ở đâu:

  • /etc — nơi chứa file cấu hình của hệ thống và ứng dụng. Ví dụ /etc/nginx/nginx.conf, /etc/hosts.
  • /var — dữ liệu thay đổi liên tục. Quan trọng nhất với DevOps là /var/log chứa log hệ thống.
  • /home — thư mục cá nhân của từng user thường.
  • /tmp — file tạm, thường bị xóa khi khởi động lại.
  • /usr/bin, /usr/local/bin — nơi chứa các chương trình thực thi (binary).
  • /proc và /sys — filesystem ảo phản ánh trạng thái kernel và tiến trình theo thời gian thực.
Đường dẫn có hai loại: tuyệt đối (bắt đầu bằng /, ví dụ /var/log/syslog) và tương đối (tính từ vị trí hiện tại, ví dụ ../config). Trong scripting, luôn ưu tiên đường dẫn tuyệt đối để tránh lỗi khó lường.

Những lệnh phải thuộc

Đây là bộ lệnh xương sống. Bạn cần gõ chúng thành thạo tới mức không cần suy nghĩ:

# Di chuyển và xem file
pwd                    # đang ở thư mục nào
ls -lah                # liệt kê chi tiết, kèm file ẩn, dung lượng dễ đọc
cd /var/log            # chuyển thư mục
cat app.log            # in toàn bộ file
less app.log           # xem file dài, cuộn được, gõ q để thoát
head -n 50 app.log     # 50 dòng đầu
tail -n 100 app.log    # 100 dòng cuối
tail -f app.log        # theo dõi log real-time (rất hay dùng)

# Tìm kiếm
grep "ERROR" app.log             # lọc dòng chứa ERROR
grep -ri "timeout" /etc/nginx/   # tìm đệ quy, không phân biệt hoa thường
find / -name "*.conf" 2>/dev/null  # tìm file theo tên

# Thao tác file
cp src.txt dest.txt    # copy
mv old.txt new.txt     # đổi tên / di chuyển
rm -rf /tmp/cache      # xóa (cẩn thận!)
mkdir -p a/b/c         # tạo thư mục lồng nhau

Permissions — phân quyền file

Đây là nơi người mới hay vấp nhất. Mỗi file có ba nhóm quyền: owner (chủ), group (nhóm), other (còn lại). Mỗi nhóm có ba quyền: đọc (r=4), ghi (w=2), thực thi (x=1). Khi gõ ls -l, bạn thấy dòng như -rwxr-xr--. Dịch ra: chủ có đủ rwx (7), nhóm có r-x (5), còn lại chỉ r-- (4), tức chmod 754.

chmod 644 config.yaml     # rw-r--r-- : file cấu hình điển hình
chmod 600 id_rsa          # rw------- : private key chỉ chủ đọc được
chmod +x deploy.sh        # thêm quyền thực thi cho script
chown www-data:www-data /var/www   # đổi chủ và nhóm

Quy tắc vàng: private key SSH bắt buộc chmod 600, nếu không SSH sẽ từ chối kết nối. Script cần +x mới chạy được. Và tuyệt đối tránh chmod 777 — nó mở toang mọi quyền cho mọi người, một lỗ hổng bảo mật kinh điển.

Process management — quản lý tiến trình

Server chạy hàng trăm tiến trình. Bạn cần biết cái nào đang ngốn CPU, cái nào treo, và cách tắt nó:

ps aux                     # liệt kê tất cả tiến trình
ps aux | grep nginx        # tìm tiến trình nginx
top                        # theo dõi CPU/RAM real-time
htop                       # phiên bản đẹp và trực quan hơn (cần cài)
kill 1234                  # gửi tín hiệu dừng nhẹ nhàng cho PID 1234
kill -9 1234               # ép chết ngay (dùng khi bất đắc dĩ)
systemctl status nginx     # trạng thái service
systemctl restart nginx    # khởi động lại service
journalctl -u nginx -f     # xem log của service theo real-time

Pipe và redirect — ghép lệnh lại thành sức mạnh

Đây là thứ khiến terminal Linux mạnh hơn bất kỳ giao diện đồ họa nào. Dấu | (pipe) đưa output của lệnh này làm input của lệnh kia. Dấu > ghi output ra file, >> ghi nối thêm, 2> chuyển hướng lỗi.

cat access.log | grep "404" | wc -l          # đếm số request 404
ps aux | sort -k3 -nr | head -5              # top 5 tiến trình ngốn CPU
cat urls.txt | sort | uniq -c | sort -nr     # đếm và xếp hạng URL trùng
grep "ERROR" app.log > errors.txt 2>&1       # gom lỗi ra file

Khi thành thạo, bạn sẽ nghĩ theo kiểu "dòng chảy dữ liệu": lấy dữ liệu thô, lọc, biến đổi, đếm, sắp xếp — chỉ trong một dòng lệnh duy nhất.

Tình huống thực tế

Ví dụ 1 — Sàn thương mại điện tử Tiki và sự cố "ổ đĩa đầy"

Một kỹ sư vận hành tại một sàn thương mại điện tử lớn ở Việt Nam kể lại: một đêm khuya, cảnh báo bắn về báo dịch vụ thanh toán ngừng ghi log và bắt đầu trả lỗi 500. Không có ai chạm vào code cả tuần nay. SSH vào server, việc đầu tiên anh gõ là df -h để xem dung lượng đĩa:

df -h
# /dev/sda1  50G  50G  0  100% /

Ổ đĩa đầy 100%. Nhiều ứng dụng khi không ghi được log sẽ treo hoặc lỗi. Anh dùng lệnh để truy vết thư mục nào phình to:

du -h --max-depth=1 /var | sort -hr | head
# 42G  /var/log

Thủ phạm là /var/log. Một service bật debug log từ lần deploy trước và tạo ra file log 40GB. Chỉ cần dọn log cũ và cấu hình lại log rotation, hệ thống hồi phục trong 10 phút.

Bài học: df -h và du -h là hai lệnh cấp cứu quan trọng bậc nhất. "Disk full" là một trong những nguyên nhân sự cố production phổ biến nhất, và nếu không biết hai lệnh này, bạn sẽ mò mẫm hàng giờ.

Ví dụ 2 — Startup fintech ở Singapore và bài học chmod 600

Một startup fintech ở Singapore thuê một bạn junior mới ra trường để dựng CI/CD deploy lên server. Bạn ấy copy private key SSH vào server build, rồi loay hoay cả buổi vì cứ chạy ssh deploy@prod-server là bị từ chối với thông báo khó hiểu:

Permissions 0644 for '/home/ci/.ssh/id_rsa' are too open.
This private key will be ignored.

SSH cố tình từ chối dùng private key nếu file đó ai cũng đọc được — vì key mà lộ thì cả hệ thống bị chiếm. Giải pháp chỉ một dòng:

chmod 600 /home/ci/.ssh/id_rsa

Bài học: hiểu permissions không phải kiến thức "cho vui". Rất nhiều lỗi kết nối, lỗi bảo mật, lỗi service không chạy đều bắt nguồn từ quyền file sai. Một DevOps giỏi nhìn thông báo lỗi này là biết ngay phải làm gì, thay vì mất cả buổi tìm trên Google.

Ví dụ 3 — Đội SRE và cuộc điều tra bằng pipe

Một đội vận hành ở một công ty game tại TP.HCM gặp tình trạng API chậm bất thường vào giờ cao điểm. Thay vì mở dashboard rườm rà, một anh senior chỉ SSH vào server và gõ một dòng để tìm 10 IP gọi API nhiều nhất trong file access log:

cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10

Kết quả lộ ra một IP gọi tới hơn 200.000 request trong một giờ — một bot đang cào dữ liệu. Chỉ trong 30 giây, không cần công cụ gì cầu kỳ, anh đã khoanh vùng được nguyên nhân và chặn IP đó ngay.

Bài học: sức mạnh thật sự của Linux không nằm ở một lệnh đơn lẻ mà ở khả năng ghép chúng bằng pipe. Cùng một câu hỏi, người biết pipe trả lời trong nửa phút, người không biết phải viết cả script Python hoặc xuất log ra Excel.

Hướng dẫn từng bước

Để luyện tập bài bản, hãy làm theo trình tự sau trên một môi trường Linux thật (một VPS giá rẻ, một máy ảo, hoặc WSL trên Windows):

  • Tạo môi trường luyện tập. Nếu chưa có, đăng ký một VPS Ubuntu rẻ hoặc cài WSL2 trên Windows với wsl --install. Trên macOS đã có sẵn terminal Unix, nhưng nên dùng Linux thật để giống môi trường server.
  • Làm chủ điều hướng. Dành 15 phút chỉ để cd, ls -lah, pwd, cat, less. Đi vào /etc, /var/log, /usr/bin và quan sát xem mỗi nơi chứa gì. Xây bản đồ hệ thống file trong đầu.
  • Luyện tìm kiếm. Dùng grep, find, tail -f. Thử mở một file log và lọc ra các dòng lỗi. Đây là kỹ năng bạn dùng nhiều nhất khi debug.
  • Thực hành permissions. Tạo một file, chạy ls -l xem quyền, đổi bằng chmod, đổi chủ bằng chown (cần sudo). Cố ý gây lỗi "permission denied" rồi tự sửa để hiểu cơ chế.
  • Quản lý tiến trình và service. Cài nginx bằng sudo apt install nginx, rồi dùng systemctl start/stop/status nginx, ps aux | grep nginx, journalctl -u nginx để quan sát vòng đời một service.
  • Ghép pipe. Lấy một file log mẫu và tự đặt câu hỏi: "IP nào gọi nhiều nhất?", "có bao nhiêu lỗi 500?". Trả lời chúng chỉ bằng một dòng pipe. Đây là bài tập tư duy quan trọng nhất.

Lỗi thường gặp & mẹo

  • rm -rf nhầm chỗ. Đây là ác mộng kinh điển. Một dấu cách thừa biến rm -rf /tmp/cache thành rm -rf / tmp/cache — xóa sạch hệ thống. Luôn kiểm tra kỹ đường dẫn trước khi Enter, và cân nhắc ls thử trước khi rm.
  • sudo bừa bãi. Không phải lệnh nào cũng cần quyền root. Chạy mọi thứ bằng sudo tạo file thuộc sở hữu root và gây lỗi phân quyền về sau. Chỉ dùng khi thực sự cần.
  • Không biết Ctrl+C và q. Nhiều người mới hoảng loạn khi lệnh chạy không dừng. Ctrl+C để ngắt một lệnh đang chạy, q để thoát khỏi less, top, man. Nhớ hai phím này đỡ hoang mang rất nhiều.
  • Quên 2>/dev/null khi find. Chạy find / thường in đầy lỗi "Permission denied". Thêm 2>/dev/null để giấu lỗi, kết quả sạch sẽ hơn.
  • Mẹo dùng man và --help. Không nhớ tham số? Gõ man ls hoặc ls --help. Đừng vội mở trình duyệt, câu trả lời thường nằm ngay trong terminal.
  • Mẹo dùng history và Ctrl+R. Gõ history xem lại lệnh đã dùng, nhấn Ctrl+R rồi gõ vài ký tự để tìm nhanh lệnh cũ. Tiết kiệm rất nhiều thời gian gõ lại.
  • Mẹo tạo alias. Thêm vào ~/.bashrc những lệnh hay dùng, ví dụ alias ll='ls -lah', để gõ nhanh hơn mỗi ngày.

Bài tập thực hành

  • Điều tra ổ đĩa. Trên môi trường của bạn, chạy df -h để xem phân vùng nào sắp đầy, rồi dùng du -h --max-depth=1 /var | sort -hr để tìm thư mục con lớn nhất. Ghi lại kết quả.
  • Săn lỗi trong log. Tải một file access log mẫu (hoặc dùng /var/log/syslog). Viết một dòng lệnh pipe đếm số dòng chứa từ "error" (không phân biệt hoa thường), và một dòng khác liệt kê 5 loại lỗi xuất hiện nhiều nhất.
  • Sửa permission. Tạo file secret.key, đặt quyền cố ý sai thành chmod 777, giải thích tại sao đây là lỗi bảo mật, rồi sửa về mức đúng cho một private key.
  • Vòng đời service. Cài nginx, dùng systemctl để start, kiểm tra trạng thái, xem tiến trình bằng ps aux | grep nginx, theo dõi log bằng journalctl -u nginx -f, rồi stop nó.
  • Một dòng thống kê. Từ một file access log, viết một dòng pipe duy nhất trả lời: "IP nào gửi nhiều request nhất và bao nhiêu lần?" Gợi ý: kết hợp awk, sort, uniq -c, head.

Tóm tắt

Linux là nền tảng không thể bỏ qua của mọi DevOps Engineer, đơn giản vì gần như toàn bộ hạ tầng production, container và cloud đều chạy trên nó. Trong bài này, bạn đã đi qua những trụ cột cốt lõi: cây filesystem với triết lý "mọi thứ là file", bộ lệnh điều hướng và tìm kiếm phải thuộc, cơ chế phân quyền (permissions) là nguồn gốc của vô số lỗi thực tế, cách quản lý tiến trình và service, cùng nghệ thuật ghép lệnh bằng pipe và redirect.

Qua ba tình huống thực tế — ổ đĩa đầy làm sập thanh toán, private key bị từ chối vì sai quyền, và cuộc truy vết bot bằng một dòng pipe — bạn thấy rằng những kiến thức tưởng chừng cơ bản này chính là thứ tạo ra khác biệt giữa xử lý sự cố trong vài phút hay vật lộn hàng giờ. Đừng chỉ đọc: hãy mở terminal, gõ đi gõ lại cho tới khi các lệnh này trở thành phản xạ. Đó là nền móng vững chắc để bạn bước tiếp vào Shell Scripting, Docker và Kubernetes ở các bài sau.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi