UUID, PARTUUID, fstab và cmdline.txt

cmdline.txt chứa các thông số khởi động RPi, trong đó root= chỉ định phân vùng được mount thành thư mục gốc /

Thông thường root=/dev/mmcblk0p2. Theo đó /dev/mmcblk0 là ổ đĩa thẻ nhớ dùng khởi động RPi. Thẻ nhớ này thường được chia thành 2 phân vùng và được gán là mmcblk0p1 (DOS32) và mmcblk0p2 (EXT4).

Nếu chúng ta sao chép mmcblk0p2 sang một phân vùng USB/SDD (giả sử là /dev/sda1) và muốn mount phân vùng này thành / thì sửa tham số root=/dev/sda1

Trong trường hợp có nhiều USB/SDD được cắm vào RPi, thứ tự sda/sdb/…sdx được gán cho các thiết bị này có thể bị thay đổi gây lỗi không khởi động được, khi đó cần dùng một định danh khác đặc trưng cho mỗi thiết bị.

Ứng dụng fdisk (có sẳn trong Debian Jessie) giúp phân chia đĩa theo MBR. Mỗi phân vùng được gán cho một dãy 16 số ngẫu nhiên gọi là UUID, tuy được gọi là định danh duy nhất nhưng cũng có thể trùng (nếu 2 đĩa được clone bằng dd…). Tuy nhiên MBR cũng đã đến lúc được thay thế bằng GPT.

Ứng dụng gdisk (apt-get install gdisk) giúp phân chia đĩa theo GPT. Mỗi phân vùng được gán cho một định danh duy nhất gọi là PARTUUID, bên cạnh UUID theo cách cũ. PARTUUID được gán cho thiết bị theo cách độc lập với hệ điều hành.

PARTUUID dùng được ở những nơi UUID dùng được và không ngược lại.

Thí dụ trong /etc/fstab, mmcblk0p2 có thể được thay bằng UUID hay PARTUUID của nó

/dev/mmcblk0p2   /   ext4   defaults,noatime   0   1

hay

UUID="2f840c69-cecb-4b10-87e4-01b9d28c231c"   /   ext4   defaults,noatime   0   1

hay

PARTUUID="64397e6a-02"   /   ext4   defaults,noatime   0   1

Tuy nhiên, trong cmdline.txt, khai báo root= không thể dùng UUID vì trong giai đoạn khởi động chưa có HĐH để có thể đọc UUID

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait rootdelay=5

có thể thay bằng

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=2dfe14bf-1aa1-4311-adcc-cc50df2b6898 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait rootdelay=5

Việc dùng PARTUUID giúp ngăn chặn việc gán nhầm tên thiết bị ở giai đoạn khởi động.

Nếu đĩa được phân chia bằng cách dùng fdisk, ứng dụng blkid không đọc được PARTUUID, nhưng dùng gdisk vẫn thấy được PARTUUID. PARTUUID này vừa được gdisk tạo ra nhưng chưa ghi vào đĩa nếu chúng ta chưa cho chuyển đĩa từ hệ thống MBR sang GPT, nghĩa là nếu chưa cho lệnh w (write) thì chưa dùng được PARTUUID, lệnh blkid phản ánh chính xác phân vùng có PARTUUID hay không.

Screenshot-2016-08-19a

Ngoài ra có thể dùng lệnh ls -l /dev/disk/by-partuuid để biết phân vùng có PARTUUID hay không qua sự tồn tại của link trỏ đến partition như sau, trong đó 2dfe14bf-1aa1-4311-adcc-cc50df2b6898 là PARTUUID của sda1

lrwxrwxrwx 1 root root 10 Aug 20 05:51 2dfe14bf-1aa1-4311-adcc-cc50df2b6898 -> ../../sda1

Chú ý rằng nếu thay tham số root trong cmdline.txt cũng phải đồng thời khai báo lại partition (giống như khai báo tại boot) được mount thành / trong /etc/fstab

Mặt khác, nếu phân vùng được gán nhãn sẽ giúp tránh được nhầm lẫn. Nhãn đước gán khi định dạng dĩa bằng lệnh mkfs

mkfs.ext4 -L OS /dev/sda1
mkfs.ext4 -L DATA /dev/sda2

hay dùng e2label khi đĩa đã định dạng

e2label /dev/sda1 OS
e2label /dev/sda2 DATA

Chú thích:

  1. Việc xóa và tạo lại các partition theo cùng thứ tự và kích thước như cũ không làm mất dữ liệu nếu không format các partition
  2. Chia đĩa theo GPT cần để một phần đĩa trống đầu và cuối đĩa. Thông thường ta để trống phía đầu đĩa 2048 sector x 512 byte = 10MB, phía cuối đĩa chỉ cần trống 33 sector x 512 byte = 16.5 KB

Leave a Comment

Filed under Software

Leave a Reply