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

71

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

Тедди
источник
1
man sfdiskговорит:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
Том Хейл

Ответы:

66

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

partprobe /dev/sdX
knweiss
источник
1
Я только что развернул dev под Ubuntu Server, этот dev - аппаратный рейд. После расширения базового рейда с помощью raidcontroller я размонтировал файловую систему и попробовал "partprobe / dev / sda" - это не сработало. «fdisk -l» все еще показывал старый размер. Затем я запустил «hdparm -z / dev / sda», и это помогло. Затем я могу смонтировать и изменить размер моей файловой системы без перезагрузки. Я знаю, что не добавляю ничего, кроме YMMV.
Mwuanno
Я нахожусь на Centos 6,5; ядро 2.6.32. все следующие команды не делали ядро ​​перечитанным разделом: - partprobe / dev / sda (warnikg: ядро ​​не удалось перечитать)
Макс
@ Макс, я также заметил, что иногда даже partprobe выводит ошибку, что она не работает. Иногда перезагрузка является единственным вариантом, чтобы быть уверенным. Много раз, кажется, это работает для меня, хотя.
Мэтт
Это не сработало для меня, потому что некоторые каталоги все еще были подключены с --bind. Сам раздел уже был отключен, но привязные устройства, указывающие на этот раздел, все еще были там. Странно, что umount работал, а partprobe нет, но после размонтирования bind-mounts я также смог частично протестировать диск.
Итан Леруа
Это работает для меня на CentOS 6 после flagellating вокруг с kpartxи в udevadm triggerтечение 10 минут. Спасибо!
Майк Эндрюс
19

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

hdparm -z /dev/sda

или же

sfdisk -R /dev/sda

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

ко-дос
источник
у меня работал hdparm.
Профессор Фалькен
3
опция sfdisk -R не существует.
Мэтт
Следует отметить, что hdparmкоманда будет работать, только если разделы не смонтированы.
... действительно, похоже, что он sfdisk -Rбыл удален где-то между util-linux 2.24.2 и 2.26.1
Чарльз Даффи,
1
man sfdiskговорит:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
Том Хейл
10

На Centos7:

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

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

partx -u <partition>

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

UUS
источник
1
Это был единственный, который работает для меня. Большое спасибо, что поделились!! Начало дня вам, сэр!
NotGaeL
8

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

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

romble
источник
Некоторые разделы могут использоваться, но я не изменяю ни один из них, хотя они могут находиться в одной таблице разделов.
Тедди
8
Ядро не такое умное. Если какой-либо раздел в таблице используется, ядро ​​не выполняет повторное сканирование. Ошибиться в другом направлении может быть катастрофическим, так что это безопасно. Если вы хотите разбираться с разделами по желанию, используйте LVM.
womble
6

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

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

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

Саураб Баржатия
источник
5

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

blockdev --rereadpt /dev/sdX

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

Тедди
источник
5

Я нахожусь на 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: устройство или ресурс заняты)

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

Максимум
источник
у меня ничего этого не получалось (Proxmox VM, centos 7, раздел xfs, нет lvm). Ответ @uus сработал, хотя: serverfault.com/a/722386/102252
NotGaeL
Все вышеперечисленные команды у меня тоже не сработали.
Фади Асбих,
Я думаю, что ядро ​​2.6.32 имеет проблему, я использовал их раньше на других машинах, оно работало просто отлично, даже при добавлении разделов с более высокими номерами между старыми разделами. т.е. sdb1 sdb2 sdb3 - удалить sdb2, затем sdb1 sdb4 sdb5 sdb3. В дополнение к вышесказанному, partx, kpartx, blockdev также не работали.
sdkks
Я не думаю, что необычно то, что если одна команда не перечитывает разделы, все не сработают - см. Также мой ответ о том, как устранить некоторые причины для этого .
maxschlepzig
3

При всех несмонтированных точках монтирования работает 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

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

Camp Waub-O-Jeeg
источник
Самый распространенный ответ неполон: в современном systemdмире ЭТО правильный ответ. Обратите внимание, что вам также необходимо перезапустить один из них (или оба) systemd-udev-settleи systemd-udev-trigger. Перезапуска, systemd-udevdкак сказал Кэмп, было недостаточно для меня. Но перезапуск также двух других сделал свое дело!
Костин Гуцэ
1

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

maxschlepzig
источник
0

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

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

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

bogdano
источник
3
Это не перечитывает таблицу разделов. Он просто обновляет информацию о геометрии, режим кэширования и т. Д. Идет выдача SCSI IDENTIFY_DRIVE.
Дмитрий Чубаров
0

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

Кайлас Кадам
источник
2
Два раза? Вы тоже запускаете « sync; sync; sync»? Smell Я чувствую запах суеверия ...
Тедди
1
Я думаю, что это суеверие произошло из-за того, что вы проверяете свою синхронизацию, выполняя вторую синхронизацию. За исключением того, что второй является ценным только для оператора, чтобы подтвердить, что он возвращается, чтобы немедленно предложить, таким образом показывая первую синхронизацию, законченную как ожидалось. несколько блогов и учебных пособий позже, и ....
JM Becker
0

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

kerolasa
источник
0

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

udevadm settle --exit-if-exists=/dev/sdb1
Сиби
источник
-3

Если вы прочитали 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.
user168717
источник
2
... он ничего не упоминал об использованииoracleasm-scandisks
voretaq7