Phỏng vấn

Câu hỏi về Linux khi phỏng vấn: 24 câu hỏi kèm đáp án

Cập nhật: · Skillaria.Top

Khi phỏng vấn Linux, người ta thường hỏi về cấu trúc hệ thống tệp và inode, liên kết cứng và liên kết mềm, quyền truy cập và sudo, tiến trình và tín hiệu, quá trình khởi động, cùng mạng: cách kiểm tra cổng đang mở, DNS phân giải tên miền thế nào và phải làm gì khi máy chủ không truy cập được.

Linux được hỏi trong các buổi phỏng vấn kỹ sư DevOps, quản trị hệ thống, SRE và lập trình viên backend. Nhà tuyển dụng hiếm khi mong bạn thuộc lòng các tùy chọn lệnh: điều họ muốn biết là bạn có hiểu cách hệ thống hoạt động và có thể tìm ra nguyên nhân sự cố hay không. Dưới đây là những câu hỏi Linux phỏng vấn gặp nhiều nhất, từ cơ bản đến chẩn đoán, kèm đáp án và lệnh minh họa.

Mẹo: khi trả lời, hãy nêu lệnh bạn dùng để kiểm tra điều mình nói. Câu "tôi sẽ xem bằng ss -tlnp" thuyết phục hơn nhiều so với lời nói chung chung.

Hệ thống tệp

1. FHS là gì và các thư mục chính chứa gì?

FHS (Filesystem Hierarchy Standard) là tiêu chuẩn quy định vị trí các thư mục. Toàn bộ cây bắt đầu từ gốc /, không có ổ đĩa theo chữ cái: các hệ thống tệp khác được gắn vào các thư mục trong cây.

  • /etc — cấu hình hệ thống và dịch vụ;
  • /var — dữ liệu thay đổi: nhật ký (/var/log), cache, hàng đợi, cơ sở dữ liệu;
  • /home — thư mục cá nhân của người dùng, /root — thư mục của root;
  • /usr — chương trình và thư viện; /bin và /sbin trên bản phân phối hiện đại thường là liên kết tới /usr/bin và /usr/sbin;
  • /tmp — tệp tạm, /boot — kernel và bootloader;
  • /proc và /sys — hệ thống tệp ảo với thông tin về tiến trình và kernel, /dev — tệp thiết bị.

2. inode là gì?

Inode là cấu trúc của hệ thống tệp lưu siêu dữ liệu của tệp: kiểu, quyền, chủ sở hữu, kích thước, mốc thời gian, số liên kết cứng và con trỏ tới các khối dữ liệu. Tên tệp không nằm trong inode: tên được lưu trong thư mục dưới dạng bản ghi "tên → số inode".

Số inode xem bằng ls -i, chi tiết bằng stat file. Số lượng inode trên một hệ thống tệp có giới hạn, và df -i cho biết đã dùng bao nhiêu. Tình huống kinh điển: "đĩa còn nhiều chỗ nhưng không tạo được tệp" — inode đã cạn vì có hàng triệu tệp nhỏ.

3. Liên kết cứng khác liên kết mềm thế nào?

Liên kết cứng (ln file link) là một tên khác cho cùng một inode. Hai tên có quyền ngang nhau, dữ liệu chỉ bị xóa khi số liên kết về không. Hạn chế: không thể liên kết tới thư mục và không thể vượt ra ngoài một hệ thống tệp.

Liên kết mềm (ln -s target link) là một tệp riêng với inode riêng, bên trong ghi đường dẫn tới đích. Nó có thể trỏ tới thư mục và sang hệ thống tệp khác, nhưng sẽ "hỏng" nếu đích bị xóa hoặc di chuyển.

4. Đĩa đã hết chỗ nhưng du hiển thị ít hơn df. Vì sao?

Thường là vì một tệp đã bị xóa nhưng vẫn có tiến trình đang mở nó — ví dụ xóa một nhật ký lớn của dịch vụ đang chạy. Tệp không còn tên nên du không thấy, nhưng các khối vẫn bị chiếm và df vẫn tính.

Tìm các tệp như vậy: lsof +L1 hoặc lsof | grep deleted. Cách xử lý là khởi động lại tiến trình, hoặc cắt ngắn tệp qua bộ mô tả của nó: : > /proc/PID/fd/N. Về sau nên dọn nhật ký bằng truncate hoặc xoay vòng với logrotate, thay vì rm.

5. Linux khởi động qua những bước nào?

Firmware (BIOS hoặc UEFI) khởi tạo phần cứng và trao quyền cho bootloader, thường là GRUB. Bootloader đọc cấu hình, nạp vào bộ nhớ kernel và initramfs — hệ thống tệp gốc tạm thời chứa các driver cần thiết để truy cập gốc thật.

Kernel khởi tạo thiết bị, gắn hệ thống tệp gốc và chạy tiến trình người dùng đầu tiên với PID 1 — trên đa số bản phân phối đó là systemd. systemd bật các dịch vụ đến target mặc định, ví dụ multi-user.target. Thời gian từng giai đoạn xem bằng systemd-analyze.

6. Lệnh mount làm gì và tự động gắn khi khởi động được khai báo ở đâu?

mount gắn một hệ thống tệp từ thiết bị vào một thư mục (điểm gắn): mount /dev/sdb1 /mnt/data. Các điểm gắn hiện tại xem bằng findmnt hoặc mount không tham số.

Gắn khi khởi động được mô tả trong /etc/fstab. Nên ghi thiết bị theo UUID (xem bằng blkid) thay vì tên như /dev/sdb1, vì tên có thể thay đổi. Trước khi khởi động lại, kiểm tra thay đổi bằng mount -a: lỗi trong fstab có thể làm máy không khởi động được.

Người dùng và quyền truy cập

7. Quyền truy cập trong Linux được tổ chức thế nào?

Mỗi tệp có chủ sở hữu, nhóm và ba bộ quyền: cho chủ sở hữu, cho nhóm và cho những người khác. Mỗi bộ gồm r (đọc), w (ghi), x (thực thi). Dạng số: r=4, w=2, x=1, nên chmod 640 file cho chủ sở hữu quyền đọc và ghi, nhóm quyền đọc, những người khác không có quyền gì.

$ ls -l app.conf
-rw-r----- 1 deploy www-data 512 Oct 12 10:03 app.conf

Đổi chủ sở hữu bằng chown user:group file, còn đổi quyền bằng chmod.

8. Quyền r, w, x có ý nghĩa gì với thư mục?

Với thư mục, ý nghĩa khác: r — xem được danh sách tên, w — tạo, xóa và đổi tên tệp bên trong, x — đi vào thư mục và truy cập tệp theo tên.

Hệ quả quan trọng: người có quyền ghi trên thư mục có thể xóa một tệp không thuộc về họ. Nếu thiếu x trên thư mục, ngay cả r cũng không giúp: bạn thấy tên nhưng không mở được tệp.

9. SUID, SGID và sticky bit là gì?

SUID trên tệp thực thi khiến chương trình chạy với quyền của chủ sở hữu tệp, không phải của người chạy. Ví dụ kinh điển là /usr/bin/passwd: nó thuộc root và có thể sửa /etc/shadow. SGID trên tệp làm điều tương tự với nhóm, còn trên thư mục khiến tệp mới kế thừa nhóm của thư mục, tiện cho các thư mục dùng chung.

Sticky bit trên thư mục chỉ cho phép chủ sở hữu xóa tệp của mình, ngay cả khi thư mục cho phép ghi với tất cả mọi người. /tmp hoạt động như vậy: ls -ld /tmp hiển thị drwxrwxrwt. Tìm mọi tệp SUID để kiểm toán: find / -perm -4000 -type f 2>/dev/null.

10. umask là gì?

umask là mặt nạ loại bỏ quyền của tệp và thư mục mới. Quyền cơ sở là 666 cho tệp và 777 cho thư mục, umask trừ đi các bit. Với umask thông thường 022, tệp được tạo với quyền 644 và thư mục với 755. Giá trị hiện tại xem bằng lệnh umask.

11. Người dùng và mật khẩu được lưu ở đâu?

Tài khoản nằm trong /etc/passwd: tên, UID, GID nhóm chính, thư mục cá nhân và shell. Băm mật khẩu được tách ra /etc/shadow, chỉ root đọc được — nhờ vậy người dùng thường không thể lấy băm để dò. Nhóm được mô tả trong /etc/group.

Thông tin người dùng xem tiện nhất bằng id user và getent passwd user — lệnh thứ hai cũng tính đến các nguồn bên ngoài như LDAP.

12. sudo hoạt động thế nào và có lợi gì hơn đăng nhập bằng root?

sudo chạy một lệnh với tư cách người dùng khác (mặc định là root) theo các quy tắc trong /etc/sudoers và các tệp trong /etc/sudoers.d/. Người dùng nhập mật khẩu của chính mình chứ không phải của root, và mọi hành động được ghi vào nhật ký kèm tên người thực hiện.

Quy tắc có thể cho phép tất cả (alena ALL=(ALL:ALL) ALL) hoặc chỉ một số lệnh cụ thể. Chỉnh sửa sudoers phải dùng visudo: nó kiểm tra cú pháp trước khi lưu, và lỗi không làm bạn mất sudo. Trên Ubuntu, quyền quản trị được cấp qua nhóm sudo, trên các bản họ RHEL — nhóm wheel.

13. Làm sao thêm người dùng vào nhóm, và vì sao thay đổi chưa có hiệu lực?

Lệnh usermod -aG docker alena thêm người dùng vào một nhóm phụ. Tùy chọn -a là bắt buộc: thiếu nó, -G sẽ thay thế toàn bộ danh sách nhóm.

Thay đổi chỉ có hiệu lực ở lần đăng nhập mới: phiên hiện tại giữ danh sách nhóm cũ. Có thể đăng nhập lại hoặc mở shell với nhóm mới bằng newgrp docker. Kiểm tra bằng id.

Tiến trình

14. Tiến trình, PID là gì và xem tiến trình bằng cách nào?

Tiến trình là một chương trình đang chạy, có không gian địa chỉ, các tệp đang mở và định danh PID riêng. Mỗi tiến trình có tiến trình cha (PPID); tổ tiên chung là tiến trình có PID 1. Danh sách tiến trình xem bằng ps aux hoặc ps -ef, dạng cây bằng pstree hoặc ps -ef --forest, và theo dõi thời gian thực bằng top hoặc htop.

15. SIGTERM và SIGKILL khác nhau thế nào?

kill PID mặc định gửi SIGTERM (15) — một yêu cầu lịch sự để kết thúc. Tiến trình có thể bắt tín hiệu này, đóng kết nối, lưu dữ liệu và thoát. SIGKILL (9, kill -9) không thể bắt: kernel kết thúc tiến trình ngay lập tức mà không dọn dẹp.

Thứ tự đúng là gửi SIGTERM trước, và chỉ dùng SIGKILL khi tiến trình không phản hồi. Một tín hiệu thường gặp khác là SIGHUP: nhiều daemon đọc lại cấu hình khi nhận nó.

16. Zombie process là gì?

Zombie là tiến trình đã kết thúc nhưng tiến trình cha chưa đọc mã trả về bằng lệnh wait(). Nó gần như không chiếm tài nguyên, nhưng vẫn giữ một mục trong bảng tiến trình. Trong ps trạng thái của nó là Z.

Không thể "giết" zombie vì nó đã chết. Cần để tiến trình cha thu nhận nó — sửa chương trình cha, hoặc kết thúc tiến trình cha; khi đó zombie được chuyển cho PID 1 và PID 1 sẽ dọn dẹp.

17. Load average cho biết điều gì?

Ba số trong uptime và top là số tiến trình trung bình đang chờ chạy trong 1, 5 và 15 phút. Trên Linux, con số này cũng tính các tiến trình ở trạng thái chờ không thể ngắt (trạng thái D), thường là chờ ổ đĩa.

Giá trị được so với số nhân CPU (nproc): load 4 trên 4 nhân là tải tối đa, trên 16 nhân là một phần tư. Load cao khi CPU nhàn rỗi thường là dấu hiệu vấn đề I/O; kiểm tra bằng iostat hoặc cột wa trong top.

Mạng

18. Xem địa chỉ IP, định tuyến và cổng đang mở bằng cách nào?

Địa chỉ giao diện xem bằng ip a, bảng định tuyến bằng ip r. Các lệnh cũ ifconfig và netstat trong gói net-tools không được cài sẵn trên nhiều bản phân phối.

Cổng đang lắng nghe và tiến trình mở chúng hiển thị bằng ss -tlnp: t — TCP, l — chỉ các cổng đang lắng nghe, n — không đổi sang tên, p — kèm tiến trình. Với UDP dùng ss -ulnp.

$ sudo ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*     users:(("nginx",pid=812,fd=6))
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*     users:(("sshd",pid=640,fd=3))

19. Dịch vụ lắng nghe ở 127.0.0.1:8080 — có kết nối từ bên ngoài được không?

Không. Địa chỉ 127.0.0.1 là giao diện loopback, chỉ truy cập được từ chính máy đó. Để nhận kết nối bên ngoài, dịch vụ phải lắng nghe trên địa chỉ của giao diện ngoài hoặc 0.0.0.0 (mọi địa chỉ IPv4). Đây là nguyên nhân thường gặp của tình trạng "cổng đang mở nhưng từ ngoài không vào được", cùng với tường lửa.

20. Linux chuyển tên máy thành địa chỉ IP thế nào?

Thứ tự nguồn được quyết định bởi dòng hosts: trong /etc/nsswitch.conf, thường là tệp /etc/hosts trước, rồi đến DNS. Địa chỉ máy chủ DNS lấy từ /etc/resolv.conf; trên hệ thống dùng systemd-resolved, tệp này chỉ ra địa chỉ cục bộ 127.0.0.53, còn máy chủ thực sự hiển thị bằng resolvectl status.

Kiểm tra bằng dig example.com hoặc dig @1.1.1.1 example.com (truy vấn tới một máy chủ cụ thể). Điểm tinh tế: dig và nslookup truy vấn DNS trực tiếp và không đọc /etc/hosts, còn getent hosts example.com đi qua cùng đường như các ứng dụng.

21. TCP khác UDP ở điểm nào?

TCP thiết lập kết nối (bắt tay ba bước SYN, SYN-ACK, ACK), đảm bảo giao hàng và thứ tự dữ liệu, gửi lại gói bị mất. Trên TCP chạy HTTP, SSH, phần lớn cơ sở dữ liệu. UDP gửi datagram không kết nối và không đảm bảo, đổi lại độ trễ thấp hơn — được dùng cho truy vấn DNS, gọi video, trò chơi.

22. Trang web không mở được. Bạn sẽ tìm nguyên nhân thế nào?

Đi theo từng tầng, từ tên miền tới ứng dụng:

  1. Tên có phân giải được không: dig site.example, địa chỉ có đúng như mong đợi không.
  2. Máy có truy cập được không: ping (có thể bị chặn), traceroute hoặc mtr.
  3. Cổng có mở không: nc -zv host 443 hoặc curl -v https://site.example.
  4. Trên máy chủ: dịch vụ có chạy không (systemctl status nginx), cổng có lắng nghe không (ss -tlnp), tường lửa có chặn không (sudo nft list ruleset, sudo ufw status).
  5. Nhật ký ứng dụng và journalctl -u của dịch vụ.

Người phỏng vấn quan tâm đến thứ tự có hệ thống, không phải bộ công cụ cụ thể.

23. Trạng thái TIME_WAIT là gì?

Sau khi đóng kết nối TCP, bên đóng trước giữ socket ở trạng thái TIME_WAIT một khoảng thời gian, để các gói đến muộn của kết nối cũ không rơi vào kết nối mới có cùng địa chỉ và cổng. Số lượng TIME_WAIT lớn là bình thường với máy chủ hoặc client tải cao, thực hiện nhiều kết nối ngắn. Đếm bằng ss -tan state time-wait | wc -l.

24. /etc/hosts khác DNS ở điểm nào, và khi nào cần dùng /etc/hosts?

/etc/hosts là bảng tĩnh "địa chỉ — tên" trên một máy cụ thể. Nó được kiểm tra trước DNS (với cấu hình nsswitch chuẩn) và tiện cho thử nghiệm: ví dụ trỏ một tên miền tới máy chủ mới trước khi đổi bản ghi DNS. DNS là hệ thống phân tán, mọi client đều thấy các câu trả lời của nó. Lỗi trong /etc/hosts là nguyên nhân thường gặp của tình huống "trang mở được trên máy tôi nhưng không mở được với mọi người".

Tóm lại

Câu hỏi Linux trong phỏng vấn kiểm tra ba điều: bạn có hiểu mô hình hệ thống không (inode, quyền, tiến trình, khởi động), có biết công cụ chẩn đoán không (ss, dig, journalctl, lsof), và có tìm nguyên nhân theo từng bước không. Hãy trả lời kèm lệnh và ví dụ từ thực tế. Hệ thống tệp, quyền và mạng đều được hướng dẫn thực hành chi tiết trong khóa học Linux.

Câu hỏi thường gặp

Người mới vào vị trí DevOps junior thường được hỏi gì về Linux?

Thường là kiến thức nền: điều hướng và quyền truy cập, tiến trình và systemctl, xem nhật ký, công cụ mạng như ip, ss, dig và curl, cơ bản về bash script. Hay có bài thực hành kiểu "tìm xem cái gì đang chiếm đĩa".

Có cần nhớ hết các tùy chọn lệnh không?

Không. Có thể nói bạn sẽ kiểm tra tùy chọn trong man. Quan trọng hơn là hiểu công cụ nào giải quyết vấn đề nào và ý nghĩa của kết quả nó in ra.

Nên học bản phân phối nào cho buổi phỏng vấn?

Bản phân phối phổ biến cho máy chủ đều được, như Ubuntu hoặc Debian, hay Rocky Linux thuộc họ RHEL. Kiến thức nền dùng chung; khác biệt chủ yếu là trình quản lý gói và tên một số dịch vụ.

Làm sao chuẩn bị phần thực hành của phỏng vấn Linux?

Dựng một máy ảo và tự giải quyết các bài toán thực tế: cấu hình web server thành dịch vụ systemd, đăng nhập bằng khóa SSH, tường lửa, tìm tiến trình theo cổng. Nói thành tiếng các bước của mình cũng là một phần của việc chuẩn bị.