Назад | Перейти на главную страницу

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

Иногда, изменяя размер или иным образом перебирая разделы на диске, 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 вызывал его индивидуально для всех разделов устройства, поэтому он должен работать, если отдельные разделы не используются. Однако у меня не было возможности попробовать.

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

partprobe /dev/sdX

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

hdparm -z /dev/sda

или

sfdisk -R /dev/sda

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

На Centos7:

В соответствии с https://access.redhat.com/solutions/199573

Ты должен попытаться :

partx -u <partition>

У меня это сработало.

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

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

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

blockdev --rereadpt /dev/sdX

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

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

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

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

я использую centos 6.5 x64; ядро 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: устройство или ресурс занят)

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

Когда все точки монтирования отключены, 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

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

Когда такая команда, как 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) аналогичным образом не работают, пока не будет устранена основная причина.

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


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

работал

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

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

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

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

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

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

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

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

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

---------- человек 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.