Tôi có cùng một vấn đề như bạn: đổi tên theo kernel /dev/sd**
sau khi khởi động lại:
Tất nhiên, tất cả các cài đặt tự động của tôi /etc/fstab
được tham chiếu bởi LABEL hoặc UUID, vì vậy về cơ bản không có vấn đề gì cho điều đó. Và tất cả các lệnh trên, blkid hoặc lsblk, cung cấp loại thông tin này.
Nhưng rắc rối bắt đầu như trong trường hợp của tôi, khi bạn đang sử dụng phân vùng ở chế độ RAW, trong quan điểm của hệ thống hiện đang khởi động: ví dụ: phân vùng được sử dụng làm thiết bị thô, để tạo đĩa ảo cho VirtualBox (vì vậy tham chiếu đến phân vùng này là một cái gì đó như /dev/sdf3
:) hoặc phân vùng được sử dụng làm thiết bị thô, để tạo LUN cho iSCSI (vì vậy tham chiếu đến phân vùng này là một cái gì đó như /dev/sdc6
:)
Vì vậy, bây giờ khi khởi động, ví dụ như trong RC.local, bạn phải tìm một cách đáng tin cậy, /dev/sdXX
thiết bị của phân vùng RAW chuyên dụng của bạn là gì và điều chỉnh một số tệp:
VÍ DỤ 1
Đĩa VirtualBox * .vmk mô tả về đĩa thô này, trong phần giống như:
\# Extent description
RW 488397167 FLAT "/dev/sdXX" 0
và sau đó khởi động lại dịch vụ VirtualBox
VÍ DỤ 2
trong cấu hình tgtd, một mục tiêu: target0 được liên kết với /dev/sdd6
thời gian xây dựng. Sau khi khởi động lại, bạn nhận được cùng một phân vùng được đổi tên /deb/sdc6
Điều này xảy ra với một đĩa di động, USB hoặc eSATA! Vậy làm thế nào để tìm thiết bị mới tự động? Một lần nữa trong /etc/rc.d/rc.local
Vì vậy, trong trường hợp này, chúng ta cần một cách đáng tin cậy để tìm tên thiết bị mới là gì. Phân vùng GPT cung cấp GUID duy nhất cho bất kỳ phân vùng GPT nào, được viết trong bảng GPT.
gdisk không cung cấp thông tin này với chế độ liệt kê mà chỉ ở chế độ tương tác với: i lệnh. May mắn thay, blkid làm điều đó!
Vì vậy, bạn cần phải viết một tập lệnh shell, để tìm trong tất cả các đĩa của bạn, là thiết bị /dev/sdXX
, được liên kết với GUID được chú ý tại thời điểm tạo phân vùng.
Một cái gì đó như, search_device_by_partUUID.sh:
\#!/bin/bash
PART_UUID=$1
if [ "$PART_UUID" = "" ]
then
echo "Syntax: $0 <a valid partition UUID>"
exit 3
fi
lsblk | grep '^sd' | awk '{print $1}' | while read DISK_DEVICE
do
INFO=`blkid /dev/${DISK_DEVICE}* | grep "PARTUUID=\"$PART_UUID\"" `
if [ "$INFO" != "" ]
then
echo INFO : "$INFO"
BLK_DEVICE=`echo "$INFO" | awk '{print $1}'`
echo $BLK_DEVICE > /dev/shm/blkdevice
echo -n "BLK_DEVICE : " ; cat /dev/shm/blkdevice
fi
done
và sau đó sử dụng /dev/shm/blkdevice
, trong tập lệnh RC.local của bạn.