Перечитати таблицю розділів без перезавантаження?


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

1
Я щойно розширив розробник під Ubuntu Server, цей розробник - це апаратний рейд. Після розширення базового рейду за допомогою raidcontroller я зняв файлову систему і спробував "partprobe / dev / sda" - це не вийшло. "fdisk -l" все ще показував старий розмір. Потім я побіг "hdparm -z / dev / sda", і це зробило трюк. Тоді я міг змонтувати та змінити розмір файлової системи без перезавантаження. Я знаю, що не додаю нічого, крім YMMV.
Mwuanno

я на центос 6,5; ядро 2.6.32. всі наступні команди не змусили ядро ​​перечитувати розділ: - partprobe / dev / sda (warnikg: ядро ​​не вдалося перечитати)
Max

@Max, я також зауважив, що іноді навіть partprobe видає помилку, що вона не працює. Іноді перезавантаження є єдиним варіантом, який потрібно бути певним. Багато разів це, здається, працює для мене.
Метт

Це не спрацювало для мене, тому що були ще деякі каталоги, змонтовані з --bind. Сам розділ був уже відключений, але кріплення, що вказують на цей розділ, все ще були. Дивно, що umount спрацював, а partprobe - ні, але після придумування Bind-mount теж я міг би частково перевірити диск.
Етан Лерой

Це працювало для мене на CentOS 6 після того, як махав навколо kpartxі udevadm triggerпротягом 10 хвилин. Дякую!
Майк Ендрюс

19

Перечитати інформацію таблиці розділів не завжди працює, але спробуйте

hdparm -z /dev/sda

або

sfdisk -R /dev/sda

Якщо він працює, значення в / proc / розділах змінюватимуться.


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.
Том Хейл,


8

Примітка. Будь ласка, припустіть, що жодна з розділів, які я фактично редагую, не відкрита, змонтована або використовується іншим чином.

Враховуючи це припущення, таблицю розділів можна успішно змінити, і проблема не виникне. Якщо ви отримуєте цю помилку, це тому , що таблиця розділів в даний час використовується, і , отже , не може бути повторно просканувати , не створюючи невідповідності.


Можливо, деякі розділи використовуються, але жоден з них не є тим, що я фактично змінюю, хоча вони можуть бути в одній таблиці розділів.
Тедді

8
Ядро не таке розумне. Якщо використовується будь-який розділ у таблиці, ядро ​​не перезавантажується. Отримати помилку в іншому напрямку може бути катастрофічно, тому це безпечно. Якщо ви хочете зайнятися розділами за бажанням, використовуйте LVM.
живіт

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

я на центосах 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: пристрій чи ресурс зайнятий ...", що вказували мені перезавантажити. Чи може ця помилка раніше працюючих методів пов'язана з тим, що удев зараз знаходиться під системним контролем? Роздумуючи над цими напрямками, я спробував:

systemctl restart systemd-udevd.service

І раптом мій диск знову доступний, без перезавантаження!


Верхня прийнята відповідь неповна: у сучасному 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) НЕ в змозі так само , поки основна причина не буде усунута.


0

Ви також можете спробувати:

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

(Але не вийде, дивіться коментар нижче)


3
Це не перечитає таблицю розділів. Він просто оновлює інформацію про геометрію, режим кешу тощо. SCSI IDENTIFY_DRIVE видається.
Дмитро Чубаров

0

kpartx -a <partition> можна запустити два рази на щойно створеному розділі .... замість перезавантаження системи.


2
Два рази? Ви також запускаєте " sync; sync; sync"? ☺ Я відчуваю запах забобонів…
Тедді

1
Думаю, це забобони виникли через те, що ви перевіряєте, чи синхронізується, здійснюючи другу синхронізацію. За винятком того, що другий є цінним лише для оператора, щоб підтвердити, він повертається до підказки негайно, тим самим вказуючи, що перша синхронізація завершена, як очікувалося. кілька блогів та навчальних посібників пізніше, і ....
Дж. М. Бекер

0

Не забудьте перевірити, чи працює служба udev. Це особливо корисно, коли partprobe, hdparm, blockdev та інші інші команди, здається, не мають різниці, які файли пристроїв доступні в / dev / каталозі.


0

Для мене ні partprobeабо blockdevрішень працювали. Хоча ця працює:

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

-3

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

---------- людина-оракалізм-скандики ------ ...

ЯК СКАНІЗАЦІЯ НАДАЄТЬСЯ Сканування проходить у чотири основні етапи.

   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.

2
... він нічого не згадував про використанняoracleasm-scandisks
voretaq7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.