Перечитать таблицу разделов без перезагрузки?

Иногда, изменяя размер или иным образом копаясь в разделах на диске, cfdisk скажет:

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

(Это также происходит с другими инструментами разбиения, поэтому я думаю, что это проблема Linux, а не проблема cfdisk.) Почему это происходит, и почему это происходит только иногда, и что я могу сделать, чтобы избежать этого?

Примечание: Пожалуйста, предположите, что ни один из разделов, которые я редактирую, не открыт, не смонтирован и не используется иным образом.


Обновить:

cfdisk использует ioctl(fd, BLKRRPART, NULL) сказать Linux перечитать таблицу разделов. Два других инструмента, рекомендованных до сих пор (hdparm -zDEVICE, sfdisk -RDEVICE) делает то же самое. partprobeDEVICE Команда, с другой стороны, похоже, использует новый ioctl под названием BLKPG, который может быть лучше; Я не знаю. (Он также возвращается к BLKRRPART в случае сбоя BLKPG.)

BLKPG выглядит как операция "этот раздел изменился; вот новый размер", и это выглядело как partprobe вызывается по отдельности на всех переданных разделах устройства, поэтому он должен работать, если отдельные разделы не используются. Однако у меня не было возможности попробовать это.

16 ответов

Решение

ИМХО самый надежный / лучший ответ

partprobe /dev/sdX

Перечитывание информации таблицы разделов не всегда работает, но попробуйте

hdparm -z /dev/sda

или же

sfdisk -R /dev/sda

Если это работает, значения в /proc/partitions изменятся.

У меня (исходного опрашивающего) была ситуация несколько дней назад, когда ни один из других ответов (включая partprobe /dev/sdX, в настоящее время принятый и получивший наибольшее количество голосов) работал. Что сработало, однако, было так:

blockdev --rereadpt /dev/sdX

(Я не знаю, почему это сработало, а другие нет, но я рад, что это сработало, поскольку это спасло меня от перезагрузки на занятом сервере.)

На Centos7:

Согласно https://access.redhat.com/solutions/199573

Тебе стоит попробовать:

partx -u <partition>

Это сработало для меня.

Примечание: Пожалуйста, предположите, что ни один из разделов, которые я редактирую, не открыт, не смонтирован и не используется иным образом.

Учитывая это предположение, таблица разделов может быть успешно повторно проверена, и проблема не возникнет. Если вы получаете эту ошибку, это потому, что таблица разделов в настоящее время используется, и, следовательно, не может быть повторно проверена без создания несоответствий.

Когда команда, как blockdev --rereadpt /dev/sdX не удается с

blockdev: ioctl error on BLKRRPART: Device or resource busy

это обычно означает, что какой-то (старый) раздел действительно все еще каким-то образом используется ядром.

Возможные причины / исправления:

  1. раздел sdX - скажем sdX1 - все еще установлен - проверьте с mount и размонтировать его
  2. /dev/sdX1 является частью программного рейда - проверьте cat /proc/mdstat и, возможно, остановить соответствующие массивы, например, mdadm --stop /dev/md126
  3. /dev/sdX1 является частью физического тома LVM - проверьте с pvdisplay/vgdisplay и, возможно, деактивировать с vgchange
  4. /dev/sdX1 является частью сопоставления некоторых устройств - например, через cryptsetup - проверять /dev/mapper а также lsblk и, возможно, удалить сопоставление (например, cryptsetup luksClose)
  5. Соревнование с некоторой проверкой udev - проверьте запущенные процессы с ps и, возможно, убить одного

Если один инструмент - скажем blockdev --rereadpt обычно не схожи, как (partx -uv, kpartx, partprobe, kpartprobe) потерпеть неудачу подобным образом, пока не будет устранена основная причина.

Он не основан на разделе, который вы редактируете.

Предположим, у вас есть только один жесткий диск (/dev/sda) и два раздела (/dev/sda1, /dev/sda2) и вы установили только один раздел (/dev/sda1). Если вы удалите или измените что-либо в другом разделе, который даже не смонтирован (/dev/sda2) вы получите ошибку, что перечитывание таблицы разделов не удалось и ядро ​​будет использовать старую таблицу.

Но если у вас есть два жестких диска (/dev/sda, /dev/sdb) и ни один из разделов (/dev/sdb) используются. Затем вы можете добавлять / удалять / изменять размер / редактировать разделы /dev/sdb и они будут перечитаны без проблем. Но даже если один раздел /dev/sdb был смонтирован во время изменения. Тогда ядро ​​продолжит использовать старую таблицу.

При всех несмонтированных точках монтирования работает Yocto 2.4:

partprobe /dev/sda 

Не удалось перезагрузить таблицу разделов после удаления разделов на устройстве. Также попробовал - и не удалось:

udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda

Все сообщали об аналогичных ошибках "Ошибка BLKRRPART: устройство или ресурс занят...", указывающие на перезагрузку. Возможно, этот сбой ранее использовавшихся методов связан с тем, что udev теперь находится под контролем systemd? Размышляя в том же духе, я попытался:

systemctl restart systemd-udevd.service

И вдруг мой диск снова доступен, без перезагрузки!

Я нахожусь на Centos 6,5 х64; ядро 2.6.32 . и я проверяю трюк fdisk, чтобы изменить размер.

/dev/sda1 /boot
/dev/sda2 /

Все следующие команды не делали ядро ​​перечитанным разделом:

  • partprobe / dev / sda (предупреждение: ядру не удалось перечитать....)
  • hdparm -z / dev / sda (сбой BLKRRPART: устройство или ресурс заняты)
  • blockdev -rereadpt / dev / sda (сбой BLKRRPART: устройство или ресурс занят)
  • sfdisk -R / dev / sda (сбой BLKRRPART: устройство или ресурс заняты)

мне все еще нужна перезагрузка, чтобы она заработала

Вы также можете попробовать:

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

(Но не сработает, см. Комментарий ниже)

В режиме сетевой загрузки Alpine-Linux новые разделы были показаны в dmesg, основные диски / dev / sda присутствовали, но не было файлов устройств разделов /dev/sdaX, попробовал все описанные выше приемы, наконец


mknod -m 660 ${chroot_dir}/dev/sda1 b 8 1
mknod -m 660 ${chroot_dir}/dev/sda2 b 8 2

работал

https://wiki.alpinelinux.org/wiki/Alpine_Linux_in_a_chroot

Для меня ни partprobe или же blockdev Решение сработало. Хотя, этот работает:

udevadm settle --exit-if-exists=/dev/sdb1

kpartx -a <partition> может быть запущен два раза на вновь созданном разделе.... вместо перезагрузки системы.

Не забудьте проверить, что сервис udev запущен. Это особенно полезно, когда partprobe, hdparm, blockdev и различные другие команды, кажется, не имеют никакого значения, какие файлы устройств доступны в каталоге /dev/.

      fdisk /dev/sdX

и выйти через "w"

Если вы прочитали man-страницу "man oracleasm-scandisks", то обратите внимание на текст ниже. oracleasm использует / proc / partitions в качестве источника всего сканирования, которое он выполняет. Вы должны получить список ваших необработанных устройств в / proc / partitions, прежде чем сможете сделать скандиск. Параметры Scanorder и Scanexclude, которые вы помещаете в / etc / sysconfig / oracleasm, относятся к именам, найденным в / proc / partitions (!!!!).

---------- человек оракул-скандис ------...

КАК ПРОИСХОДИТ СКАНИРОВАНИЕ Сканирование проходит в четыре основных этапа.

   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.
Другие вопросы по тегам