磁盤引導(dǎo)對于我們使用windows的朋友來講是非常的簡單了,但在linux中有些復(fù)雜了,下文小編就為各位介紹udev控制磁盤引導(dǎo)順序配置.
vmware EXSi 虛擬化組的兄弟在對一臺虛擬機(jī)主新增了N塊磁盤后,重啟后發(fā)現(xiàn)主機(jī)引導(dǎo)后分區(qū)的順序發(fā)生了變化,導(dǎo)致各個掛載點下掛載的文件和之前不一致了,當(dāng)時給出的解決方法是在/etc/fstab文件中使用uuid,因為UUID不會變化.
一、uuid 與掛載點
1、使用blkid命令獲取UUID,代碼如下:
- [root@361way ~]# blkid
- /dev/sda1: SEC_TYPE="msdos" UUID="F159-EA55" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="ed7d2e13-8197-4226-8fdc-47d4aa64aebb"
- /dev/sda2: LABEL="boot" UUID="f7755604-99f2-4d94-ab1a-47b14def7e26" TYPE="xfs" PARTUUID="627c028f-bf10-4705-b465-d5118d8ee67d"
- /dev/sda3: UUID="Bs0vJv-cena-E9eO-2WcM-iJNQ-26Mr-fGG1pr" TYPE="LVM2_member" PARTUUID="18c50ff9-0e0d-40ac-8e2a-4f7f768347ed"
- /dev/mapper/cl-root: UUID="b2f57437-ba99-4a2d-9c82-a41037aa0e38" TYPE="xfs"
- /dev/mapper/cl-swap: UUID="2930b30d-3039-442d-a210-da1d7775652e" TYPE="swap"
- /dev/mapper/cl-data: LABEL="data" UUID="cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5" TYPE="xfs"
2、查看/dev目錄獲取UUID,代碼如下:
- [root@361way ~]# ll /dev/disk/by-uuid/
- 總用量 0
- lrwxrwxrwx 1 root root 10 11月 25 19:56 2930b30d-3039-442d-a210-da1d7775652e -> ../../dm-1
- lrwxrwxrwx 1 root root 10 11月 25 19:56 b2f57437-ba99-4a2d-9c82-a41037aa0e38 -> ../../dm-0
- lrwxrwxrwx 1 root root 10 11月 25 19:56 cfc65b4e-0ca4-4b48-934e-5f668a4fb3b5 -> ../../dm-2
- lrwxrwxrwx 1 root root 10 11月 25 19:56 F159-EA55 -> ../../sda1
- lrwxrwxrwx 1 root root 10 11月 25 19:56 f7755604-99f2-4d94-ab1a-47b14def7e26 -> ../../sda2
3、修改/etc/fstab文件,使用uuid,代碼如下:
- [root@361way ~]# cat /etc/fstab
- #
- # /etc/fstab
- # Created by anaconda on Mon Sep 8 16:38:29 2014
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
- #
- /dev/mapper/cl-root / xfs defaults 1 1
- UUID=f7755604-99f2-4d94-ab1a-47b14def7e26 /boot xfs defaults 1 2 //Vevb.com
- UUID=F159-EA55 /boot/efi vfat umask=0077,shortname=winnt 0 0
- /dev/mapper/cl-data /data xfs defaults,noatime,nobarrier 1 2
- /dev/mapper/cl-swap swap swap defaults 0 0
按上面的方法修改后,重啟主機(jī),發(fā)現(xiàn)所有的掛載點都正常了.
二、使用udev調(diào)整磁盤順序
一天數(shù)據(jù)庫側(cè)的兄弟又問起sdb、sdc、sde多個磁盤名增加后會亂的問題,后來在自己的虛擬機(jī)上又嘗試使用udev解決該問題,參考snipplr網(wǎng)站,代碼如下:
- (make sure both devices are unmounted)
- # cat /proc/partitions
- # cd /dev
- # rm sda,sdb
- # mknod /dev/sda b # fill with major and minor devices obtained from /proc/partitions for sdb
- # mknod /dev/sdb b 8 0 # verify these major, minor values for sda in /proc/partitions
- # partprobe /dev/sda
- # hdparm -z /dev/sda
- # sfdisk -R /dev/sda
- # blockdev --rereadpt /dev/sda
- (repeat the last 4 commands for sdb)
- Alternatively and to make it permanent:
- create the file /etc/udev/rules.d/10-local.rules with the following content:
- KERNEL=="sda", NAME="sdb"
- KERNEL=="sdb", NAME="sda"
- (end of file)
- and then:
- # service udev restart
- # udevadm control --reload-rules
- # udevadm trigger
1、查看本機(jī)的磁盤,代碼如下:
- [root@localhost rules.d]# fdisk -l
- Disk /dev/vda: 21.5 GB, 21474836480 bytes
- 16 heads, 63 sectors/track, 41610 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x0001bcdb
- Device Boot Start End Blocks Id System
- /dev/vda1 * 3 1018 512000 83 Linux
- Partition 1 does not end on cylinder boundary.
- /dev/vda2 1018 41611 20458496 8e Linux LVM
- Partition 2 does not end on cylinder boundary.
- Disk /dev/vdb: 1073 MB, 1073741824 bytes
- 16 heads, 63 sectors/track, 2080 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x00000000
- Disk /dev/vdc: 2147 MB, 2147483648 bytes
- 16 heads, 63 sectors/track, 4161 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x00000000
可以看到一個大小為1G的vdb磁盤和一個大小為2G的vdc磁盤.
2、創(chuàng)建rule文件,在/etc/udev/rules.d/創(chuàng)建一個rule文件,具體內(nèi)容如下:
- # cat 10-local.rules
- KERNEL=="vdb", NAME="vdc"
- KERNEL=="vdc", NAME="vdb"
3、使用udevadm命令重載rule文件,代碼如下:
- # udevadm control --reload-rules
- # udevadm trigger
4、再查看本地磁盤,代碼如下:
- [root@localhost ~]# fdisk -l
- Disk /dev/vda: 21.5 GB, 21474836480 bytes
- 16 heads, 63 sectors/track, 41610 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x0001bcdb
- Device Boot Start End Blocks Id System
- /dev/vda1 * 3 1018 512000 83 Linux
- Partition 1 does not end on cylinder boundary.
- /dev/vda2 1018 41611 20458496 8e Linux LVM
- Partition 2 does not end on cylinder boundary.
- Disk /dev/vdb: 2147 MB, 2147483648 bytes
- 16 heads, 63 sectors/track, 4161 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier: 0x00000000
- Disk /dev/vdc: 1073 MB, 1073741824 bytes
- 16 heads, 63 sectors/track, 2080 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disk identifier:0x00000000
再查看發(fā)現(xiàn)vdb變成了2G,vdc變成了1G大小.
三、udev規(guī)則相關(guān)
1、udev規(guī)則操作符
“==”:比較鍵、值,若等于,則該條件滿足.
“!=”:比較鍵、值,若不等于,則該條件滿足.
“=”:對一個鍵賦值.
“+=”:為一個表示多個條目的鍵賦值.
“:=”:對一個鍵賦值,并拒絕之后所有對該鍵的改動,目的是防止后面的規(guī)則文件對該鍵賦值.
2、udev規(guī)則的匹配鍵
ACTION:事件(uevent)的行為,例如:add(添加設(shè)備)、remove(刪除設(shè)備).
KERNEL:內(nèi)核設(shè)備名稱,例如:sda,cdrom.
DEVPATH:設(shè)備的 devpath 路徑.
SUBSYSTEM:設(shè)備的子系統(tǒng)名稱,例如:sda 的子系統(tǒng)為 block.
BUS:設(shè)備在 devpath 里的總線名稱,例如:usb.
DRIVER:設(shè)備在 devpath 里的設(shè)備驅(qū)動名稱,例如:ide-cdrom。
ID:設(shè)備在 devpath 里的識別號。
SYSFS{filename}:設(shè)備的 devpath 路徑下,設(shè)備的屬性文件“filename”里的內(nèi)容.
ENV{key}:環(huán)境變量,在一條規(guī)則中,可以設(shè)定最多五條環(huán)境變量的 匹配鍵.
PROGRAM:調(diào)用外部命令.
RESULT:外部命令 PROGRAM 的返回結(jié)果.
3、udev重要的賦值鍵
NAME:在 /dev下產(chǎn)生的設(shè)備文件名。只有第一次對某個設(shè)備的 NAME 的賦值行為生效,之后匹配的規(guī)則再對該設(shè)備的 NAME 賦值行為將被忽略。如果沒有任何規(guī)則對設(shè)備的 NAME 賦值,udev 將使用內(nèi)核設(shè)備名稱來產(chǎn)生設(shè)備文件。
SYMLINK:為 /dev/下的設(shè)備文件產(chǎn)生符號鏈接,由于 udev 只能為某個設(shè)備產(chǎn)生一個設(shè)備文件,所以為了不覆蓋系統(tǒng)默認(rèn)的 udev 規(guī)則所產(chǎn)生的文件,推薦使用符號鏈接.
OWNER,GROUP,MODE:為設(shè)備設(shè)定權(quán)限.
ENV{key}:導(dǎo)入一個環(huán)境變量
4、udev 的值和可調(diào)用的替換操作符.
$kernel,%k:設(shè)備的內(nèi)核設(shè)備名稱,例如:sda、cdrom.
$number,%n:設(shè)備的內(nèi)核號碼,例如:sda3 的內(nèi)核號碼是 3.
$devpath,%p:設(shè)備的 devpath路徑.
$id,%b:設(shè)備在 devpath里的 ID 號.
$sysfs{file},%s{file}:設(shè)備的 sysfs里 file 的內(nèi)容,其實就是設(shè)備的屬性值.
例如:$sysfs{size} 表示該設(shè)備(磁盤)的大小.
- $env{key}, %E{key}:一個環(huán)境變量的值。
- $major, %M:設(shè)備的 major 號。
- $minor %m:設(shè)備的 minor 號。
- $result, %c:PROGRAM 返回的結(jié)果。
- $parent, %P:父設(shè)備的設(shè)備文件名。
- $root, %r:udev_root的值,默認(rèn)是 /dev/。
- $tempnode, %N:臨時設(shè)備名。
- %%:符號 % 本身。
- $$:符號 $ 本身。
四、udevadm與rule
通過udevadm查看磁盤或分區(qū)信息,代碼如下:
- [root@localhost rules.d]# udevadm info -a -p /sys/block/vdb
- Udevadm info starts with the device specified by the devpath and then
- walks up the chain of parent devices. It prints for every device
- found, all possible attributes in the udev rules key format.
- A rule to match, can be composed by the attributes of the device
- and the attributes from one single parent device.
- looking at device '/devices/pci0000:00/0000:00:06.0/virtio3/block/vdb':
- KERNEL=="vdb"
- SUBSYSTEM=="block"
- DRIVER==""
- ATTR{range}=="16"
- ATTR{ext_range}=="16"
- ATTR{removable}=="0"
- ATTR{ro}=="0"
- ATTR{size}=="2097152"
- ATTR{alignment_offset}=="0"
- ATTR{discard_alignment}=="0"
- ATTR{capability}=="10"
- ATTR{stat}==" 276 13 2312 8 0 0 0 0 0 8 8"
- ATTR{inflight}==" 0 0"
- ATTR{serial}==""
- looking at parent device '/devices/pci0000:00/0000:00:06.0/virtio3':
- KERNELS=="virtio3"
- SUBSYSTEMS=="virtio"
- DRIVERS=="virtio_blk"
- ATTRS{device}=="2"
- ATTRS{vendor}=="6900"
- ATTRS{status}=="0x00000007"
- ATTRS{modalias}=="virtio:d00000002v00001AF4"
- ATTRS{features}=="0010101101100000000000000000110000000000000000000000000000000000"
- looking at parent device '/devices/pci0000:00/0000:00:06.0':
- KERNELS=="0000:00:06.0"
- SUBSYSTEMS=="pci"
- DRIVERS=="virtio-pci"
- ATTRS{vendor}=="0x1af4"
- ATTRS{device}=="0x1001"
- ATTRS{subsystem_vendor}=="0x1af4"
- ATTRS{subsystem_device}=="0x0002"
- ATTRS{class}=="0x010000"
- ATTRS{irq}=="11"
- ATTRS{local_cpus}=="1"
- ATTRS{local_cpulist}=="0"
- ATTRS{modalias}=="pci:v00001AF4d00001001sv00001AF4sd00000002bc01sc00i00"
- ATTRS{numa_node}=="-1"
- ATTRS{enable}=="1"
- ATTRS{broken_parity_status}=="0"
- ATTRS{msi_bus}==""
- looking at parent device '/devices/pci0000:00':
- KERNELS=="pci0000:00"
- SUBSYSTEMS==""
- DRIVERS==""
如有多塊磁盤,其中又有大小相同的,可以通過其他條件進(jìn)行區(qū)分,如rules里可以這樣寫:
- SUBSYSTEM=="block", ATTR{size}=="234441648", NAME="my_hard_disk"
- SUBSYSTEM=="block", SUBSYSTEMS=="scsi", ATTRS{model}=="ST3120827AS", NAME="my_hard_disk"
- KERNEL=="sda1" ATTR{size}=="2096753" NAME="asm_ocr"
注:一些老版本的udev里包里沒有udevadm,使用的是udevinfo命令.
五、uedv與asm 磁盤rule
1、scsi_id 獲取磁盤UUID,代碼如下:
- [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdb
- 3690b11c0002be80e00000ce3514380db
- [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdc
- 3690b11c0002be80e00000ce5514380f8
- [root@localhost ~]# /sbin/scsi_id -g -u /dev/sdd
- 3690b11c0002be80e00000ce75143810c
- //Vevb.com
新版本中的scsi_id命令位于/usr/lib/udev/scsi_id.
2、asm rule規(guī)則,代碼如下:
- #cat /etc/udev/rules.d/99-Oracle-asmdevices.rules
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
- RESULT=="3690b11c0002be80e00000ce3514380db",
- NAME="asm-crs01", OWNER="grid",GROUP="asmadmin",MODE="0660"
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
- RESULT=="3690b11c0002be80e00000ce5514380f8",
- NAME="asm-data01", OWNER="grid",GROUP="asmadmin",MODE="0660"
- KERNEL=="sd?1",BUS="scsi",PROGRAM=="/sbin/scsi_id -g -u -d /dev/$parent",
- RESULT=="3690b11c0002be80e00000ce75143810c",
- NAME="asm-data02", OWNER="grid",GROUP="asmadmin",MODE="0660"
3、重啟udev服務(wù),代碼如下:
- [root@localhost rules.d]# /sbin/partprobe /dev/sdb1
- [root@localhost rules.d]# /sbin/partprobe /dev/sdc1
- [root@localhost rules.d]# /sbin/partprobe /dev/sdd1
- [root@localhost rules.d]# /sbin/start_udev
4、查看asm設(shè)備,代碼如下:
- [root@localhost rules.d]# ll /dev/asm*
- brw-rw----. 1 root root 8, 17 3月 27 11:30 /dev/asm-crs01
- brw-rw----. 1 root root 8, 33 3月 27 11:30 /dev/asm-data01
- brw-rw----. 1 root root 8, 49 3月 27 11:30 /dev/asm-data02
在centos7/redhat7 版本中的udev已不再單獨是一個包,而是在systemd包中包含了udev工具,rule規(guī)則除了/etc/udev/rules.d目錄,還有/usr/lib/udev/rules.d/ 目錄.
新聞熱點
疑難解答
圖片精選