Hướng dẫn

Gắn ổ đĩa trong Linux: lsblk, phân vùng, mkfs, mount và fstab

Cập nhật: · Skillaria.Top

Gắn ổ đĩa (mount) trong Linux là kết nối hệ thống tệp của một phân vùng vào một thư mục trong cây thư mục, ví dụ /data. Ổ đĩa mới được tìm bằng lsblk, phân vùng bằng fdisk hoặc parted, định dạng bằng mkfs.ext4, gắn bằng mount /dev/sdb1 /data, còn để phân vùng tự gắn sau khi khởi động thì thêm một dòng với UUID của nó vào /etc/fstab và kiểm tra bằng mount -a.

Trong Linux không có ký hiệu ổ đĩa theo chữ cái: mọi thiết bị lưu trữ đều được gắn vào một cây thư mục duy nhất bắt đầu từ /. Gắn ổ đĩa (mount) là thao tác «treo» hệ thống tệp của một phân vùng lên một thư mục trống, gọi là điểm gắn. Quy trình với ổ đĩa mới luôn giống nhau: tìm thiết bị (lsblk), phân vùng (fdisk hoặc parted), tạo hệ thống tệp (mkfs), gắn (mount) và cố định cấu hình trong /etc/fstab. Dưới đây đi qua từng bước, đồng thời giải thích dung lượng đã biến đi đâu bằng df và du.

Ổ đĩa và phân vùng trong Linux hoạt động thế nào

Kernel biểu diễn mỗi ổ đĩa bằng một file thiết bị trong /dev. Tên phụ thuộc vào kiểu kết nối:

TênThiết bịPhân vùng
/dev/sda, /dev/sdbổ SATA/SAS/USB, nhiều ổ ảo/dev/sda1, /dev/sda2
/dev/vdaổ virtio trong máy ảo KVM/dev/vda1
/dev/nvme0n1SSD NVMe/dev/nvme0n1p1
/dev/mapper/...ổ logic LVM, ổ mã hóa—

Ổ đĩa được chia thành các phân vùng, trên mỗi phân vùng tạo một hệ thống tệp (ext4, xfs, btrfs), và chính hệ thống tệp đó được gắn vào một thư mục. Khi phân vùng chưa được gắn, các file trên nó không truy cập được, dù ổ đĩa đã cắm vật lý.

Xem danh sách ổ đĩa: lsblk và blkid

Lệnh đầu tiên khi làm việc với ổ đĩa là lsblk. Nó hiển thị cây thiết bị, dung lượng và điểm gắn:

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   40G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   39G  0 part /
sdb      8:16   0  100G  0 disk

Có thể thấy sdb là ổ mới 100 GB, chưa có phân vùng và chưa có điểm gắn. Một số tùy chọn hữu ích:

  • lsblk -f — loại hệ thống tệp, nhãn và UUID của từng phân vùng.
  • lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL — chỉ các cột cần thiết.
  • sudo blkid — UUID và loại hệ thống tệp của mọi phân vùng.
  • sudo fdisk -l — bảng phân vùng của mọi ổ đĩa kèm số sector.

Nếu ổ đĩa được thêm vào máy ảo «khi đang chạy» mà lsblk không thấy, hãy yêu cầu kernel quét lại bus: echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan.

Phân vùng ổ đĩa: fdisk và parted

Trước khi phân vùng, hãy chắc chắn đã chọn đúng thiết bị: ghi bảng phân vùng lên ổ hệ thống sẽ phá hủy dữ liệu. Căn cứ vào dung lượng và việc ổ chưa có điểm gắn trong kết quả lsblk.

GPT hay MBR

Với ổ mới, nên chọn GPT: nó hỗ trợ ổ trên 2 TB và tối đa 128 phân vùng. MBR (dos) chỉ cần cho hệ thống cũ khởi động qua BIOS, khi bộ nạp khởi động yêu cầu.

Phân vùng bằng fdisk

fdisk hiện đại làm được cả GPT lẫn MBR. Thao tác diễn ra ở chế độ tương tác:

$ sudo fdisk /dev/sdb
Command (m for help): g        # tạo bảng phân vùng GPT trống
Command (m for help): n        # phân vùng mới
Partition number (1-128, default 1): Enter
First sector: Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P}: Enter   # toàn bộ ổ
Command (m for help): w        # ghi thay đổi và thoát

Cho tới khi bạn nhấn w, chưa có gì được ghi lên ổ, nên q cho phép thoát mà không thay đổi gì.

Phân vùng bằng parted trong một dòng

Trong script, parted tiện hơn vì chạy không cần hội thoại:

$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdb mkpart primary ext4 0% 100%
$ lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0  100G  0 disk
└─sdb1   8:17   0  100G  0 part

Ranh giới tính theo phần trăm giúp phân vùng được căn chỉnh đúng. Nếu phân vùng mới không xuất hiện, chạy sudo partprobe /dev/sdb để kernel đọc lại bảng phân vùng.

Tạo hệ thống tệp: mkfs

Phân vùng chỉ là một dải khối. Để lưu file, cần tạo hệ thống tệp trên đó:

$ sudo mkfs.ext4 -L data /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
...
Writing superblocks and filesystem accounting information: done

Tùy chọn -L đặt nhãn để sau này dễ nhận ra phân vùng. Cách chọn loại hệ thống tệp:

Hệ thống tệpLệnhPhù hợp khi
ext4mkfs.ext4lựa chọn đa năng mặc định, có thể thu nhỏ
XFSmkfs.xfsfile và ổ lớn, mặc định của RHEL; chỉ mở rộng được
Btrfsmkfs.btrfssnapshot, nén, subvolume
vfat/exFATmkfs.vfat, mkfs.exfatUSB để trao đổi với Windows và macOS

mkfs xóa mọi thứ đang có trên phân vùng. Với phân vùng trống, lệnh không hỏi xác nhận, nên hãy kiểm tra lại tên thiết bị trước khi chạy.

Cách gắn ổ đĩa trong Linux bằng lệnh mount

Tạo thư mục làm điểm gắn rồi gắn phân vùng vào đó:

$ sudo mkdir -p /data
$ sudo mount /dev/sdb1 /data
$ df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        98G   24K   93G   1% /data

mount tự nhận diện loại hệ thống tệp, nhưng có thể chỉ định rõ bằng mount -t xfs. Nếu thư mục /data đã có file, sau khi gắn các file đó không bị xóa mà chỉ bị che khuất bởi hệ thống tệp mới, và sẽ xuất hiện lại khi gỡ gắn.

Tùy chọn gắn

Các tùy chọn truyền qua -o, phân cách bằng dấu phẩy:

  • ro / rw — chỉ đọc hoặc đọc và ghi.
  • noatime — không cập nhật thời gian truy cập mỗi lần đọc, giảm số lần ghi thừa.
  • noexec — cấm chạy chương trình từ phân vùng này (hữu ích cho /tmp và thư mục tải xuống).
  • nosuid, nodev — bỏ qua bit SUID và file thiết bị.
  • remount — đổi tùy chọn mà không gỡ gắn: sudo mount -o remount,ro /data.

Để xem những gì đang gắn và với tùy chọn nào, dùng findmnt: findmnt /data hoặc findmnt -t ext4.

Quyền trên ổ đĩa đã gắn

Thư mục gốc của ext4 mới thuộc về root, nên người dùng thường không ghi được vào đó. Sau khi gắn, hãy giao thư mục cho đúng người dùng: sudo chown alice:alice /data. Với vfat và exFAT không có quyền Unix, chủ sở hữu được đặt bằng các tùy chọn uid=, gid= và umask= khi gắn.

Cách gỡ gắn ổ đĩa: umount và lỗi target is busy

Gỡ gắn dùng lệnh umount (không có chữ n) với thiết bị hoặc thư mục:

$ sudo umount /data
umount: /data: target is busy.

Lỗi này có nghĩa là một tiến trình đang giữ file trên hệ thống tệp đó, hoặc lấy nó làm thư mục hiện tại — thường là chính terminal của bạn sau khi chạy cd /data. Để tìm thủ phạm:

$ sudo lsof +f -- /data
$ sudo fuser -vm /data

Dừng tiến trình hoặc thoát khỏi thư mục rồi thử lại. Cách cuối cùng là umount -l (lazy): hệ thống tệp được tách khỏi cây thư mục ngay, còn việc giải phóng hoàn tất khi các tiến trình đóng file.

Tự động gắn khi khởi động: /etc/fstab

Lệnh mount chỉ có hiệu lực tới lần khởi động lại tiếp theo. Để ổ đĩa được gắn tự động, thêm một dòng vào /etc/fstab. Nên khai báo phân vùng bằng UUID thay vì tên /dev/sdb1: tên có thể đổi thứ tự khi thêm ổ, còn UUID thì cố định.

$ sudo blkid /dev/sdb1
/dev/sdb1: LABEL="data" UUID="3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77" TYPE="ext4" PARTUUID="..."

Dòng cấu hình gồm sáu trường:

# <thiết bị>                              <điểm gắn>  <loại>  <tùy chọn>        <dump> <fsck>
UUID=3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77  /data    ext4   defaults,noatime  0      2
TrườngÝ nghĩa
thiết bịUUID=..., LABEL=... hoặc đường dẫn
điểm gắnthư mục để gắn vào (phải tồn tại)
loạiext4, xfs, swap, nfs v.v.
tùy chọndefaults cộng thêm những tùy chọn cần, ví dụ noatime, nofail
dumphầu như luôn là 0
fsckthứ tự kiểm tra: 1 cho gốc, 2 cho các phân vùng khác, 0 — không kiểm tra

Luôn kiểm tra fstab trước khi khởi động lại

Lỗi trong /etc/fstab có thể khiến máy chủ rơi vào chế độ khẩn cấp khi khởi động, và trên máy đám mây không có console thì rất khó chịu. Ngay sau khi sửa, chạy:

$ sudo findmnt --verify
$ sudo systemctl daemon-reload
$ sudo mount -a
$ findmnt /data

mount -a gắn mọi thứ trong fstab chưa được gắn, và báo lỗi ngay lập tức. Với ổ tháo rời và ổ mạng, thêm tùy chọn nofail: nếu thiết bị không có mặt, hệ thống vẫn khởi động tiếp. Trong systemd, mỗi dòng fstab trở thành một unit .mount — chẳng hạn data.mount, trạng thái của nó xem bằng systemctl status data.mount.

Kiểm tra dung lượng trống: df

df cho biết mức độ đầy của các hệ thống tệp đã gắn:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        39G   37G  1.1G  98% /
/dev/sda1       974M  180M  727M  20% /boot
/dev/sdb1        98G   24K   93G   1% /data
  • -h — hiển thị kích thước theo đơn vị dễ đọc.
  • -T — thêm cột loại hệ thống tệp.
  • -i — hiển thị inode: ổ có thể «hết chỗ» dù còn nhiều gigabyte nếu có quá nhiều file nhỏ.
  • -x tmpfs -x devtmpfs — ẩn các hệ thống tệp ảo.

Vì sao Size không bằng Used + Avail: ext4 dành khoảng 5% dung lượng cho root, để hệ thống vẫn hoạt động khi ổ gần đầy. Trên phân vùng chứa dữ liệu có thể giảm phần dự trữ này: sudo tune2fs -m 1 /dev/sdb1.

Dung lượng đã đi đâu: du

df cho biết ổ đã đầy, nhưng không cho biết ai chiếm chỗ. Với việc đó dùng du, lệnh cộng dung lượng các file trong từng thư mục:

$ sudo du -sh /var/log
4.2G    /var/log
$ sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head
37G     /
21G     /var
9.8G    /home
3.1G    /usr
  • -s — chỉ tổng của thư mục, -a — từng file riêng lẻ.
  • --max-depth=1 (hoặc -d 1) — chỉ một mức lồng nhau; đi sâu hơn vào thư mục lớn nhất.
  • -x — không đi sang hệ thống tệp khác, nếu không tổng sẽ gồm cả /data, /proc và ổ mạng.
  • sort -rh — sắp xếp theo kích thước đọc được, lớn nhất lên đầu.

Muốn tìm các file lớn riêng lẻ, find tiện hơn: sudo find / -xdev -type f -size +1G -exec ls -lh {} +.

df báo đầy nhưng du thì không

Tình huống kinh điển: vừa xóa một file log khổng lồ mà dung lượng không được giải phóng. File đã biến khỏi thư mục, nhưng một tiến trình (ví dụ web server) vẫn đang mở nó, nên các khối chưa được trả lại. Tìm các file như vậy:

$ sudo lsof +L1
COMMAND  PID USER   FD   TYPE DEVICE   SIZE/OFF NLINK  NODE NAME
nginx    812 www    5w   REG    8,2 8589934592     0 13054 /var/log/nginx/access.log (deleted)

Khởi động lại tiến trình hoặc yêu cầu nó mở lại file log, khi đó dung lượng sẽ được trả. Về sau, hãy dọn file log đang được ghi bằng cách cắt rỗng thay vì xóa: sudo truncate -s 0 /var/log/nginx/access.log. Nguyên nhân thứ hai gây lệch số liệu là các file nằm dưới điểm gắn: chúng chiếm chỗ trên phân vùng gốc nhưng du không thấy chúng khi có một hệ thống tệp được gắn đè lên.

Lỗi thường gặp và cách khắc phục

Thông báoNguyên nhânCách xử lý
mount point /data does not existchưa có thư mụcsudo mkdir -p /data
wrong fs type, bad option, bad superblockphân vùng không có hệ thống tệp, sai loại hoặc thiếu driverkiểm tra lsblk -f; với exFAT/NTFS cài gói exfatprogs, ntfs-3g
only root can do thatgắn mà không có sudochạy với sudo, hoặc thêm tùy chọn user vào fstab
target is busythư mục đang bị tiến trình dùnglsof/fuser, thoát khỏi thư mục
khởi động vào emergency modelỗi trong fstab hoặc ổ không có mặtđăng nhập root, sửa fstab, thêm nofail

Kịch bản từng bước: ổ đĩa mới để lưu dữ liệu

  1. lsblk — tìm ổ mới, ví dụ /dev/sdb.
  2. sudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100% — phân vùng.
  3. sudo mkfs.ext4 -L data /dev/sdb1 — tạo hệ thống tệp.
  4. sudo mkdir -p /data — tạo điểm gắn.
  5. sudo blkid /dev/sdb1 — lấy UUID và thêm dòng vào /etc/fstab.
  6. sudo mount -a && df -h /data — gắn và kiểm tra.
  7. sudo chown người-dùng: /data — cấp quyền.

Nếu về sau cần mở rộng dung lượng mà không dừng dịch vụ, hoặc gộp nhiều ổ, thay vì phân vùng thông thường người ta dùng LVM: ổ trở thành physical volume, từ đó cắt ra các logical volume có thể lớn lên bằng lvextend -r.

Tổng kết

Gắn ổ đĩa trong Linux là chuỗi lsblk → phân vùng → mkfs → mount → /etc/fstab. Hãy khai báo phân vùng bằng UUID, kiểm tra fstab bằng mount -a trước khi khởi động lại, và dùng nofail cho các ổ không bắt buộc. Khi hết chỗ, df -h cho biết phân vùng nào đầy, còn du -xh --max-depth=1 | sort -rh và lsof +L1 cho biết thứ gì đang chiếm dung lượng. Ổ đĩa, phân vùng, SWAP, LVM và RAID được thực hành chi tiết trong khóa học Linux.

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

Làm sao gắn USB trong Linux?

Tìm thiết bị bằng lsblk (thường là /dev/sdb1), tạo thư mục rồi chạy sudo mount /dev/sdb1 /mnt/usb. Trên các giao diện đồ họa, USB thường được tự gắn vào /media/tên_người_dùng hoặc /run/media.

Làm sao gắn file ISO?

Dùng sudo mount -o loop,ro image.iso /mnt/iso: tùy chọn loop coi file như một thiết bị khối. Gỡ gắn bằng umount thông thường.

Làm sao gắn thư mục mạng qua fstab?

Với NFS, dòng có dạng server:/export /mnt/nfs nfs defaults,_netdev,nofail 0 0; với SMB, //server/share /mnt/smb cifs credentials=/root/.smbcred,_netdev,nofail 0 0. Tùy chọn _netdev chờ mạng được bật lên trước khi gắn.

UUID khác PARTUUID ở điểm nào?

UUID thuộc về hệ thống tệp và thay đổi khi chạy lại mkfs; PARTUUID thuộc về phân vùng trong bảng GPT và được giữ nguyên khi định dạng lại. Trong fstab thường dùng UUID.

Làm sao kiểm tra lỗi hệ thống tệp?

Gỡ gắn phân vùng rồi chạy sudo fsck -f /dev/sdb1 với ext4, hoặc sudo xfs_repair /dev/sdb1 với XFS. Không được kiểm tra hệ thống tệp đang gắn và đang ghi, vì có thể làm hỏng dữ liệu.

Học chủ đề này qua video

Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Linux: с нуля до уверенного администрирования”.

Đến khóa học