本文介绍Linux操作系统重新加载分区表的方法:使用partprobe、blockdev、hdparm、partx命令。
背景
作为Linux管理员,你可以在一天内多次执行磁盘分区任务。大多数情况下,在虚拟环境(例如VMWare、Virtualbox等)中的磁盘分区之后,分区表已成功更改,但它不会发生在物理服务器上,那么通知操作系统有关分区表更改的解决方案是什么?下面就介绍其方法,这些方法强制内核重新加载分区表并在/dev中重新填充其ID。
如果你正在寻找磁盘分区实用程序,那么可以尝试其中之一,磁盘分区实用程序是fdisk和parted。
在执行磁盘分区时,在虚拟环境中的大多数情况下,可能会得到类似于下面的输出:
The partition table has been altered.
Syncing disks.
执行磁盘分区时,可能在物理环境中的大多数时间内获得以下相同的输出:
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy
The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
我已经在Arch Linux系统上测试了相关的命令,除了partx命令之外它工作正常,因为我在运行partx命令后没有在dmesg日志中看到任何日志,然而,它在RHEL 7系统中工作正常。
我建议你在Linux系统中添加分区后运行以下的命令,以通知操作系统有关分区表更改的信息。
可以使用以下四种方法完成:
partprobe:partprobe是一个通过请求操作系统重新读取分区表来通知操作系统内核分区表更改的程序。
blockdev:实用程序blockdev允许用户从命令行调用块设备ioctl。
hdparm:hdparm为Linux SATA/PATA/SAS “libata”子系统和旧IDE驱动子系统支持的各种内核接口提供命令行界面。
partx:partx告诉内核有关磁盘分区的存在和编号。
一、使用partprobe命令在Linux中重新加载分区表
partprobe是一个程序,通过请求操作系统重新读取分区表来通知操作系统内核分区表更改。
这是执行此任务的标准和本机命令。
在这个例子中,我将使用/dev/sdb并确保你必须输入你的设备名称:
$ sudo partprobe /dev/sdb
dmesg用于检查或控制内核环缓冲区,因此,使用以下命令查看内核更改,我可以看到更改,因为dmesg中有一个新的sdb设备日志:
$ dmesg | grep sdb
[ 3.143163] sd 3:0:0:0: [sdb] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[ 3.143186] sd 3:0:0:0: [sdb] Write Protect is off
[ 3.143192] sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 3.143276] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3.145620] sd 3:0:0:0: [sdb] Attached SCSI disk
[ 188.810583] sdb: sdb1 sdb2 sdb3 sdb4
[ 219.112109] sdb: sdb1 sdb2 sdb3 sdb4
二、使用blockdev命令在Linux中重新加载分区表
实用程序blockdev允许从命令行调用块设备ioctl。
我们可以使用blockdev命令来执行此任务:
$ sudo blockdev --rereadpt -v /dev/sdb
使用以下dmesg命令查看内核更改,我可以看到更改,因为dmesg中的sdb设备再次有一个新日志:
$ dmesg | grep sdb
[ 3.143163] sd 3:0:0:0: [sdb] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[ 3.143186] sd 3:0:0:0: [sdb] Write Protect is off
[ 3.143192] sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 3.143276] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3.145620] sd 3:0:0:0: [sdb] Attached SCSI disk
[ 188.810583] sdb: sdb1 sdb2 sdb3 sdb4
[ 219.112109] sdb: sdb1 sdb2 sdb3 sdb4
[ 422.506376] sdb: sdb1 sdb2 sdb3 sdb4
三、使用hdparm命令在Linux中重新加载分区表
hdparm为Linux SATA/PATA/SAS “libata”子系统和旧IDE驱动子系统支持的各种内核接口提供命令行界面。
或者,我们可以使用hdparm命令来执行此任务:
$ sudo hdparm -z /dev/sdb
/dev/sdb:
re-reading partition table
使用以下dmesg命令查看内核更改,我可以看到更改,因为dmesg中的sdb设备再次有一个新日志:
$ dmesg | grep sdb
[ 3.143163] sd 3:0:0:0: [sdb] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB)
[ 3.143186] sd 3:0:0:0: [sdb] Write Protect is off
[ 3.143192] sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 3.143276] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 3.145620] sd 3:0:0:0: [sdb] Attached SCSI disk
[ 188.810583] sdb: sdb1 sdb2 sdb3 sdb4
[ 219.112109] sdb: sdb1 sdb2 sdb3 sdb4
[ 422.506376] sdb: sdb1 sdb2 sdb3 sdb4
[ 504.328312] sdb: sdb1 sdb2 sdb3 sdb4
四、使用partx命令在Linux中重新加载分区表
partx告诉内核有关磁盘分区的存在和编号。
partx命令是util-linux软件包的一部分,可从Linux Kernel Archive获得。
或者,我们可以使用partx命令来执行此任务:
$ sudo partx -a /dev/sdb
或者:
$ sudo partx -u /dev/sdb
partx: /dev/sdb: error adding partitions 1-5
可以通过运行以下命令来双重确认,如果分区表已成功重新加载并且内核可见,那么可以在此位置查看这些新分区,运行cat /proc/partitions命令,如下图所示:
使用以下ls命令可以找到相同的信息:
$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Mar 8 07:23 /dev/sdb
brw-rw---- 1 root disk 8, 17 Mar 8 07:23 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Mar 8 07:23 /dev/sdb2
brw-rw---- 1 root disk 8, 19 Mar 8 07:23 /dev/sdb3
brw-rw---- 1 root disk 8, 20 Mar 8 07:23 /dev/sdb4
brw-rw---- 1 root disk 8, 21 Mar 8 07:23 /dev/sdb5
使用以下sudo partx -l /dev/sdb命令可以找到相同的信息,如下图所示:
相关主题