Перечитать таблицу разделов без перезагрузки?
Иногда, изменяя размер или иным образом копаясь в разделах на диске, cfdisk скажет:
Wrote partition table, but re-read table failed. Reboot to update table.
(Это также происходит с другими инструментами разбиения, поэтому я думаю, что это проблема Linux, а не проблема cfdisk.) Почему это происходит, и почему это происходит только иногда, и что я могу сделать, чтобы избежать этого?
Примечание: Пожалуйста, предположите, что ни один из разделов, которые я редактирую, не открыт, не смонтирован и не используется иным образом.
Обновить:
cfdisk использует ioctl(fd, BLKRRPART, NULL)
сказать Linux перечитать таблицу разделов. Два других инструмента, рекомендованных до сих пор (hdparm -z
DEVICE
, sfdisk -R
DEVICE
) делает то же самое. partprobe
DEVICE
Команда, с другой стороны, похоже, использует новый ioctl под названием BLKPG, который может быть лучше; Я не знаю. (Он также возвращается к BLKRRPART в случае сбоя BLKPG.)
BLKPG выглядит как операция "этот раздел изменился; вот новый размер", и это выглядело как partprobe
вызывается по отдельности на всех переданных разделах устройства, поэтому он должен работать, если отдельные разделы не используются. Однако у меня не было возможности попробовать это.
16 ответов
Перечитывание информации таблицы разделов не всегда работает, но попробуйте
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
это обычно означает, что какой-то (старый) раздел действительно все еще каким-то образом используется ядром.
Возможные причины / исправления:
- раздел sdX - скажем
sdX1
- все еще установлен - проверьте сmount
и размонтировать его /dev/sdX1
является частью программного рейда - проверьтеcat /proc/mdstat
и, возможно, остановить соответствующие массивы, например,mdadm --stop /dev/md126
/dev/sdX1
является частью физического тома LVM - проверьте сpvdisplay
/vgdisplay
и, возможно, деактивировать сvgchange
/dev/sdX1
является частью сопоставления некоторых устройств - например, черезcryptsetup
- проверять/dev/mapper
а такжеlsblk
и, возможно, удалить сопоставление (например,cryptsetup luksClose
)- Соревнование с некоторой проверкой 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
работал
Для меня ни partprobe
или же blockdev
Решение сработало. Хотя, этот работает:
udevadm settle --exit-if-exists=/dev/sdb1
kpartx -a <partition>
может быть запущен два раза на вновь созданном разделе.... вместо перезагрузки системы.
Не забудьте проверить, что сервис udev запущен. Это особенно полезно, когда partprobe, hdparm, blockdev и различные другие команды, кажется, не имеют никакого значения, какие файлы устройств доступны в каталоге /dev/.
Если вы прочитали 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.