重新读取分区表而不重新启动?

有时候,在调整磁盘分区的大小时,cfdi​​sk会说:

Wrote partition table, but re-read table failed. Reboot to update table.

(其他分区工具也会发生这种情况,所以我认为这是一个Linux问题,而不是一个cfdisk问题。)为什么会这样呢,为什么只是偶尔发生,我该怎么办才能避免呢?

注意:请假设我正在编辑的分区没有被打开,挂载或以其他方式使用。


更新:

cfdisk使用ioctl(fd, BLKRRPART, NULL)告诉Linux重新读取分区表。 到目前为止推荐的其他两种工具( hdparm -z DEVICEsfdisk -R DEVICE )的function完全相同。 另一方面, partprobe DEVICE命令似乎使用了一个名为BLKPG的新的ioctl,可能会更好; 我不知道。 (如果BLKPG失败,它也会落在BLKRRPART上。)

BLKPG似乎是“这个分区已经改变了;这是新的大小”的操作,它看起来像partprobe在设备的所有分区上单独调用它,所以它应该工作,如果单个分区是未使用的。 但是,我没有机会去尝试。

    恕我直言,最可靠/最好的答案是

     partprobe /dev/sdX 

    重新读取分区表信息并不总是奏效,但请尝试

     hdparm -z /dev/sda 

    要么

     sfdisk -R /dev/sda 

    如果有效,/ proc / partitions中的值将会改变。

    在Centos7上:

    根据https://access.redhat.com/solutions/199573

    你应该试试 :

     partx -u <partition> 

    它为我工作。

    注意:请假设我正在编辑的分区没有被打开,挂载或以其他方式使用。

    考虑到这个假设,分区表可以被成功地重新扫描,并且不会出现问题。 如果你得到这个错误,那是因为分区表目前正在使用,因此不能在不产生不一致的情况下重新扫描。

    它不是基于你正在编辑的分区。

    假设您只有一个硬盘( /dev/sda )和两个分区( /dev/sda1/dev/sda2 ),并且只挂载了一个分区( /dev/sda1 )。 如果您删除或更改其他未挂载的分区( /dev/sda2 )的任何内容,将会出现重新读取分区表失败并且内核将使用旧表的错误。

    但是,如果您有两个硬盘( /dev/sda/dev/sdb ),并且没有( /dev/sdb )分区正在使用中。 然后你可以添加/删除/resize/编辑/dev/sdb分区,他们将被重新读取没有任何问题。 但即使在更改过程中安装了/ dev / sdb的一个分区。 然后内核将继续使用旧表。

    我在centos 6.5 x64; 内核2.6.32。 我正在testingfdisk技巧来resize。

     /dev/sda1 /boot /dev/sda2 / 

    以下所有命令都没有使内核重读分区:

    • partprobe / dev / sda (警告:内核无法重读….)
    • hdparm -z / dev / sda (BLKRRPART失败:设备或资源忙)
    • blockdev -rereadpt / dev / sda (BLKRRPART失败:设备或资源忙)
    • sfdisk -R / dev / sda (BLKRRPART失败:设备或资源忙)

    我仍然需要重新启动才能使其工作

    我(最初的提问者)几天前有一种情况,其他答案都没有(包括partprobe /dev/sdX ,目前被接受并且得票最高的答案)工作。 然而,什么工作是这样的:

     blockdev --rereadpt /dev/sdX 

    (我不知道为什么这个工作,其他人没有,但我很高兴它的工作,因为它节省了我在繁忙的服务器上重新启动。)

    你也可以尝试:

     echo 1 > /sys/block/sdX/device/rescan 

    (但是不行,请看下面的评论)

    kpartx -a <partition>可以在新创build的分区上运行两次….而不是重新启动系统。

    如果你阅读“man oracleasm-scandisks”的手册页,你会注意到下面的文字。 oracleasm使用/ proc /分区作为它执行的所有扫描的来源。 您必须先获取/ proc /分区中列出的原始设备,才能进行扫描。 您放置在/ etc / sysconfig / oracleasm中的Scanorder和Scanexclude参数与/ proc / partitions(!!!!)中的名称相关。

    ———- man oracleasm-scandisks —— …

    如何扫描发生扫描进行了四个基本阶段。

      First, the list of disks to scan is created. If disks were specified on the command line, this is the list. If not, /proc/partitions is read, and each block device is added, subject to the -o and -x options. Second, the partition tables of each disk in the scan are reloaded unless the -s option was specified. Any disks that no longer exist are dropped. Third, the list of disks is recreated based on the new partition tables. Finally, each disk in the list is checked to see if it is marked for ASM use. Disks that are marked are instantiated.