Linux /proc và /sys: Giao tiếp trực tiếp với Kernel và Phần cứng

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Nguyên lý ‘Tất cả là một tệp’ trong thực tế

Hầu hết người dùng Linux bắt đầu bằng cách chạy các lệnh như top, lscpu, hoặc free -m để kiểm tra sức khỏe hệ thống. Các công cụ này rất hữu ích, nhưng chúng chỉ là các “lớp bao bọc” (wrappers). Chúng đọc dữ liệu từ các tệp cụ thể, định dạng lại văn bản và đưa cho bạn. Nếu bạn đang làm việc trên một container tối giản hoặc một hệ thống nhúng cũ, các tệp thực thi này thậm chí có thể không tồn tại.

Linux coi gần như mọi thứ là một tệp. Đây không chỉ là một khẩu hiệu; đó là nguyên tắc kiến trúc cốt lõi của toàn bộ hệ điều hành. Các thư mục /proc/sys là các hệ thống tệp ảo (virtual filesystems). Bạn sẽ không tìm thấy chúng trên ổ SSD của mình. Thay vào đó, chúng đóng vai trò là những cửa sổ trực tiếp nhìn vào bộ nhớ của kernel, cung cấp một giao diện thời gian thực cho phần cứng, driver và các tiến trình đang chạy.

Tôi đã chuyển sang sử dụng các tệp ảo này sau khi gặp phải các rào cản về hiệu suất trên một máy chủ Ubuntu 22.04 chỉ có 4GB RAM. Việc chạy lscpu vài giây một lần có vẻ không đáng kể, nhưng các lệnh gọi fork/exec sẽ tiêu tốn PID và chu kỳ bộ nhớ. Bằng cách đọc trực tiếp các tệp văn bản, tôi đã giảm được khoảng 18% tải CPU cho các script giám sát của mình. Nó nhanh hơn, nhẹ hơn và đáng tin cậy hơn cho các tác vụ tự động hóa tần suất cao.

Truy cập các hệ thống tệp ảo

Bạn sẽ không tìm thấy /proc hay /sys trong các trình quản lý gói như apt hay dnf. Chúng được tích hợp trực tiếp vào Linux kernel. Tuy nhiên, chúng phải được mount để bạn có thể thấy. Hầu hết các bản phân phối hiện đại đều tự động xử lý việc này trong quá trình khởi động bằng systemd.

Xác nhận rằng các hệ thống tệp này đang hoạt động bằng cách kiểm tra các điểm mount hiện tại:

mount | grep -E 'proc|sysfs'

Kết quả mong đợi sẽ trông như thế này:

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)

Nếu chúng bị thiếu—thường gặp trong các môi trường chroot tùy chỉnh—bạn có thể mount chúng thủ công bằng hai lệnh:

mount -t proc proc /proc
mount -t sysfs sysfs /sys

Đằng sau hậu trường, /proc (procfs) xử lý dữ liệu tiến trình và thống kê của kernel. Trong khi đó, /sys (sysfs) cung cấp một bản đồ cấu trúc của mô hình thiết bị, bao quát mọi thứ từ bus USB đến quản lý năng lượng.

Điều chỉnh Kernel trực tiếp

Nhiều người dùng cho rằng /proc/sys là chỉ đọc (read-only). Đó là một sai lầm. Nhiều tệp ở đây có thể tinh chỉnh được (tunables). Bằng cách ghi các giá trị mới vào chúng, bạn có thể thay đổi hành vi của kernel ngay lập tức mà không cần khởi động lại.

Giao diện /proc/sys

Thư mục con /proc/sys chứa các tham số bạn có thể điều chỉnh. Ví dụ, nếu bạn đang thiết lập một router Linux, bạn cần bật IP forwarding. Hãy quên các công cụ cấu hình phức tạp đi; chỉ cần “nói chuyện” với kernel:

# Kiểm tra trạng thái (0 = tắt, 1 = bật)
cat /proc/sys/net/ipv4/ip_forward

# Bật ngay lập tức
echo 1 > /proc/sys/net/ipv4/ip_forward

Quản lý áp lực bộ nhớ là một tác vụ phổ biến khác. Nếu một máy chủ cảm thấy chậm chạp vì nó đang chiếm giữ quá nhiều cache, bạn có thể xóa nó một cách an toàn:

# Xóa PageCache, dentries, và inodes
echo 3 > /proc/sys/vm/drop_caches

Quản lý phần cứng qua /sys

Thư mục /sys là đường dây trực tiếp của bạn tới phần cứng. Nếu bạn cần giảm độ sáng màn hình laptop hoặc kiểm tra chu kỳ pin, /sys/class là nơi để tìm. Trong môi trường máy chủ, tôi sử dụng nó để ép các CPU scaling governors vào chế độ hiệu suất (performance mode).

Kiểm tra governor hiện tại cho nhân CPU đầu tiên của bạn:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Để ưu tiên tốc độ hơn tiết kiệm điện, hãy chuyển nó sang ‘performance’:

echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Lưu ý rằng những thay đổi này chỉ mang tính tạm thời. Chúng sẽ bị reset khi bạn khởi động lại. Để giữ chúng vĩnh viễn, hãy sử dụng sysctl.conf cho các mục trong /proc/sys hoặc các quy tắc Udev cho phần cứng trong /sys.

Trích xuất các chỉ số thời gian thực

Truy cập tệp trực tiếp là một vũ khí bí mật cho các kỹ sư DevOps. Thay vì phải bóc tách (scrape) kết quả đầu ra lộn xộn từ CLI, bạn có thể lấy dữ liệu thô bằng các công cụ xử lý chuỗi đơn giản.

Mức sử dụng RAM và CPU

Tệp /proc/meminfo là nguồn dữ liệu toàn diện cho RAM. Nếu bạn cần cụ thể bộ nhớ còn trống, hãy sử dụng grep để lấy chính xác dòng đó:

grep "MemAvailable" /proc/meminfo

Đối với hoạt động của CPU, /proc/stat theo dõi các bộ đếm tích lũy. Dòng ‘cpu’ hiển thị thời gian đã sử dụng trong các trạng thái user, system, và idle kể từ lần khởi động cuối cùng. Các script của tôi đọc tệp này hai lần với khoảng thời gian trễ một giây để tính toán tỷ lệ sử dụng thời gian thực.

Kiểm tra các tiến trình

Mỗi tiến trình đang chạy nhận được một thư mục trong /proc được đặt tên theo Process ID (PID) của nó. Đối với một tiến trình có PID 1234, bạn có thể xem lệnh khởi chạy hoặc vị trí tệp thực thi của nó một cách dễ dàng:

# Xem toàn bộ lệnh khởi chạy
cat /proc/1234/cmdline | tr '\0' ' '

# Tìm đường dẫn tệp thực thi
ls -l /proc/1234/exe

Tệp cmdline sử dụng các null byte làm dấu ngăn cách. Sử dụng tr sẽ chuyển đổi chúng thành các khoảng trắng để dễ đọc hơn.

Trạng thái kết nối và Nhiệt độ

Thay thế ip link bằng việc đọc tệp là một cách tuyệt vời để kiểm tra sức khỏe mạng. Bạn có thể xem liệu cáp có được kết nối vật lý với ‘eth0’ hay không tại đây:

cat /sys/class/net/eth0/operstate

Kiểm tra nhiệt độ cũng đơn giản không kém. Các cảm biến nhiệt báo cáo dữ liệu theo đơn vị mili độ C:

cat /sys/class/thermal/thermal_zone0/temp

Kết quả 48500 có nghĩa là 48.5°C. Một phép chia đơn giản trong script của bạn sẽ cho ra một chỉ số sạch sẽ mà không cần thêm công cụ nào khác.

Tự động hóa với Python

Bạn đang xây dựng một agent giám sát tùy chỉnh? Việc đọc các tệp này trong Python cực kỳ nhanh. Đây là cách lấy uptime của hệ thống trực tiếp từ /proc/uptime:

def get_uptime():
    with open('/proc/uptime', 'r') as f:
        uptime_seconds = float(f.readline().split()[0])
        return uptime_seconds

print(f"Thời gian hoạt động: {get_uptime()} giây")

Bỏ qua các tệp thực thi bên ngoài giúp hệ thống của bạn luôn tinh gọn. Nó đảm bảo các công cụ giám sát không trở thành những kẻ ngốn tài nguyên nhất trên máy chủ. Cho dù bạn đang debug một kernel module hay tối ưu hiệu suất cho một cloud instance nhỏ, việc thành thạo các tệp ảo này là một kỹ năng cốt lõi cho bất kỳ chuyên gia Linux nào.

Share: