Giới thiệu
Trong lab này, bạn sẽ học cách sử dụng lệnh lsof
, viết tắt của "list open files" (liệt kê các file đang mở), để xác định các file đang mở và các kết nối mạng trên một hệ thống Linux. Lệnh lsof
là một công cụ mạnh mẽ cung cấp thông tin chi tiết về các tiến trình có các file đang mở, bao gồm file descriptor, loại file, thiết bị và tên file.
Lab này bao gồm ba bước chính: hiểu lệnh lsof
, xác định các file đang mở bởi một tiến trình và định vị các kết nối mạng bằng cách sử dụng lsof
. Bạn sẽ học cách diễn giải kết quả đầu ra của lệnh lsof
và sử dụng các tùy chọn khác nhau để lọc kết quả. Lab này là một phần của chương trình System Monitoring and Management (Giám sát và Quản lý Hệ thống) và sẽ giúp bạn phát triển các kỹ năng về systemadmin và khắc phục sự cố.
Tìm hiểu về Lệnh lsof
Trong bước này, bạn sẽ tìm hiểu về lệnh lsof
, viết tắt của "list open files" (liệt kê các file đang mở). Lệnh lsof
là một công cụ mạnh mẽ trong Linux cho phép bạn xác định tiến trình nào đang mở file và kết nối mạng.
Để bắt đầu, hãy chạy lệnh lsof
mà không có bất kỳ tham số nào:
sudo lsof
Ví dụ đầu ra:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1428176 655360 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,1 2067688 655361 /usr/lib/x86_64-linux-gnu/libc-2.35.so
...
Lệnh lsof
hiển thị rất nhiều thông tin về các file đang mở và các kết nối mạng trên hệ thống của bạn. Hãy phân tích các cột:
COMMAND
: Tên của tiến trình có file đang mở.PID
: ID của tiến trình.TID
: ID của thread (nếu có).USER
: Người dùng sở hữu tiến trình.FD
: File descriptor, là một số xác định file đang mở.TYPE
: Loại của file đang mở (ví dụ: file thông thường, thư mục, socket, v.v.).DEVICE
: Số thiết bị của hệ thống file nơi file được đặt.SIZE/OFF
: Kích thước của file hoặc offset của file.NODE
: Số inode của file.NAME
: Tên của file hoặc kết nối mạng.
Đầu ra có thể khá dài, vì vậy bạn có thể sử dụng các tùy chọn khác nhau để lọc kết quả. Ví dụ: để chỉ xem các file đang mở cho một tiến trình cụ thể, bạn có thể sử dụng tùy chọn -p
theo sau là ID tiến trình:
sudo lsof -p 1
Điều này sẽ hiển thị cho bạn tất cả các file đang mở cho tiến trình có PID là 1, thường là tiến trình systemd
.
Bạn cũng có thể sử dụng lệnh lsof
để tìm các file đang mở bởi một người dùng cụ thể:
sudo lsof -u labex
Điều này sẽ hiển thị cho bạn tất cả các file đang mở thuộc sở hữu của người dùng labex
.
Trong bước tiếp theo, bạn sẽ tìm hiểu cách sử dụng lệnh lsof
để xác định các file đang mở bởi một tiến trình cụ thể.
Xác định File Đang Mở bởi Một Tiến Trình
Trong bước này, bạn sẽ học cách sử dụng lệnh lsof
để xác định các file đang mở được liên kết với một tiến trình cụ thể.
Hãy bắt đầu bằng cách tìm ID tiến trình (PID) của một tiến trình đang chạy. Bạn có thể sử dụng lệnh ps
cho việc này:
sudo ps -ef | grep nginx
Ví dụ đầu ra:
root 825 1 0 14:32 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 826 825 0 14:32 ? 00:00:00 nginx: worker process
www-data 827 825 0 14:32 ? 00:00:00 nginx: worker process
Trong ví dụ này, tiến trình nginx
có PID là 825.
Bây giờ, bạn có thể sử dụng lệnh lsof
để liệt kê tất cả các file đang mở được liên kết với tiến trình này:
sudo lsof -p 825
Ví dụ đầu ra:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 825 root cwd DIR 253,0 4096 1048576 /usr/sbin
nginx 825 root rtd DIR 253,0 4096 2 /
nginx 825 root txt REG 253,0 977528 1048577 /usr/sbin/nginx
nginx 825 root mem REG 253,0 2067688 1048578 /usr/lib/x86_64-linux-gnu/libc-2.35.so
nginx 825 root mem REG 253,0 169032 1048579 /usr/lib/x86_64-linux-gnu/ld-2.35.so
nginx 825 root 0u CHR 136,0 0t0 3 /dev/pts/0
nginx 825 root 1u CHR 136,0 0t0 3 /dev/pts/0
nginx 825 root 2u CHR 136,0 0t0 3 /dev/pts/0
Đầu ra này hiển thị tất cả các file đang mở được liên kết với tiến trình nginx
, bao gồm file thực thi, các thư viện dùng chung và các file descriptor đầu vào/đầu ra/lỗi tiêu chuẩn.
Bạn cũng có thể sử dụng lệnh lsof
để tìm các file đang mở bởi một người dùng cụ thể. Ví dụ: để tìm tất cả các file đang mở thuộc sở hữu của người dùng labex
:
sudo lsof -u labex
Điều này có thể hữu ích cho việc khắc phục sự cố hoặc hiểu hoạt động của một người dùng cụ thể trên hệ thống.
Trong bước tiếp theo, bạn sẽ tìm hiểu cách sử dụng lệnh lsof
để định vị các kết nối mạng.
Định Vị Kết Nối Mạng Sử Dụng lsof
Trong bước này, bạn sẽ học cách sử dụng lệnh lsof
để xác định các kết nối mạng trên hệ thống của bạn.
Để liệt kê tất cả các kết nối mạng trên hệ thống của bạn, bạn có thể sử dụng lệnh lsof
với tùy chọn -i
:
sudo lsof -i
Ví dụ đầu ra:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 824 root 3u IPv4 18620 0t0 TCP *:22 (LISTEN)
sshd 824 root 4u IPv6 18622 0t0 TCP *:22 (LISTEN)
nginx 825 root 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 826 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 827 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
Đầu ra này hiển thị tất cả các kết nối mạng trên hệ thống, bao gồm tiến trình sshd
đang lắng nghe trên cổng 22 (SSH) và tiến trình nginx
đang lắng nghe trên cổng 80 (HTTP).
Bạn cũng có thể lọc đầu ra để chỉ hiển thị các loại kết nối mạng cụ thể. Ví dụ: để chỉ hiển thị các kết nối TCP:
sudo lsof -i TCP
Ví dụ đầu ra:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 824 root 3u IPv4 18620 0t0 TCP *:22 (LISTEN)
sshd 824 root 4u IPv6 18622 0t0 TCP *:22 (LISTEN)
nginx 825 root 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 826 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 827 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
Bạn cũng có thể lọc đầu ra để chỉ hiển thị các kết nối cho một người dùng hoặc tiến trình cụ thể. Ví dụ: để chỉ hiển thị các kết nối mạng cho người dùng labex
:
sudo lsof -i -u labex
Lệnh lsof
có thể là một công cụ mạnh mẽ để khắc phục sự cố mạng và hiểu hoạt động mạng trên hệ thống của bạn.
Tóm tắt
Trong lab này, bạn sẽ học cách sử dụng lệnh lsof
, viết tắt của "list open files" (liệt kê các file đang mở). Lệnh lsof
là một công cụ mạnh mẽ trong Linux cho phép bạn xác định tiến trình nào đang mở file và kết nối mạng. Bạn sẽ bắt đầu bằng cách chạy lệnh lsof
mà không có bất kỳ tham số nào để hiểu các cột thông tin khác nhau mà nó cung cấp, chẳng hạn như tên tiến trình, ID tiến trình, file descriptor, loại file và tên file. Sau đó, bạn sẽ học cách sử dụng tùy chọn -p
để xem các file đang mở cho một tiến trình cụ thể. Cuối cùng, bạn sẽ khám phá cách sử dụng lệnh lsof
để định vị các kết nối mạng trên hệ thống của bạn.