Czy zresetować tabelę partycji bez ponownego uruchamiania?


71

Czasami, podczas zmiany rozmiaru lub w inny sposób z partycjami na dysku, cfdisk powie:

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

(Dzieje się tak również w przypadku innych narzędzi do partycjonowania, więc myślę, że jest to problem dotyczący Linuksa, a nie problem z dyskiem CD.) Dlaczego tak jest i dlaczego zdarza się to tylko czasami i co mogę zrobić, aby tego uniknąć?

Uwaga: Proszę założyć, że żadna z aktualnie edytowanych przeze mnie partycji nie jest otwarta, zamontowana lub używana w inny sposób.


Aktualizacja:

cfdisk używa, ioctl(fd, BLKRRPART, NULL)aby powiedzieć Linuksowi, aby ponownie przeczytał tablicę partycji. Dwa inne zalecane do tej pory narzędzia ( hdparm -z DEVICE, sfdisk -R DEVICE) robią dokładnie to samo. Z partprobe DEVICEdrugiej strony polecenie wydaje się używać nowego ioctl o nazwie BLKPG, co może być lepsze; Nie wiem (Powoduje także powrót do BLKRRPART, jeśli BLKPG zawiedzie.)

BLKPG wydaje się być operacją „ta partycja uległa zmianie; oto nowy rozmiar” i wyglądała, jakby była partprobenazywana indywidualnie na wszystkich partycjach przekazanego urządzenia, więc powinna działać, jeśli poszczególne partycje nie są używane. Nie miałem jednak okazji tego spróbować.


1
man sfdiskmówi: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.
Tom Hale,

Odpowiedzi:


66

IMHO najbardziej wiarygodna / najlepsza odpowiedź to

partprobe /dev/sdX

1
Właśnie rozwinąłem programistę pod Ubuntu Server, ten program jest rajdem sprzętowym. Po rozszerzeniu podstawowego raidu za pomocą raidcontroller odinstalowałem system plików i wypróbowałem „partprobe / dev / sda” - to nie zadziałało. „fdisk -l” nadal pokazywał stary rozmiar. Potem uruchomiłem „hdparm -z / dev / sda” i to załatwiło sprawę. Mógłbym wtedy zamontować i zmienić rozmiar mojego systemu plików bez restartu. Wiem, że nie dodam niczego innego niż YMMV.
Mwuanno

korzystam z centos 6.5; jądro 2.6.32. wszystkie następujące polecenia nie spowodowały ponownego odczytania partycji jądra: - partprobe / dev / sda (warnikg: jądro nie odczytało się ponownie)
Max

@ Max, zauważyłem również, że czasami nawet część sondy drukuje błąd, że to nie działa. Czasami ponowne uruchomienie jest jedyną pewną opcją. Wiele razy jednak wydaje mi się, że to działa.
Matt

Nie działało to dla mnie, ponieważ niektóre katalogi były jeszcze zamontowane przy pomocy --bind. Sama partycja była już odmontowana, ale podłączenia do powiązań wskazujące na tę partycję nadal tam były. Dziwne, że umount działał, a część nie sondował, ale po umountowaniu również opraw montowania bindów mogłem również sondować dysk.
Ethan Leroy,

Ten pracował dla mnie na CentOS 6 po flagellating wokół z kpartxi udevadm triggerdo 10 minut. Dziękuję Ci!
Mike Andrews,

19

Ponowne odczytanie informacji o tablicy partycji nie zawsze działa, ale spróbuj

hdparm -z /dev/sda

lub

sfdisk -R /dev/sda

Jeśli to zadziała, wartości w / proc / partitions zmienią się.


hdparm pracował dla mnie.
Prof. Falken,

3
opcja sfdisk -R nie istnieje.
Matt

Należy zauważyć, że hdparmpolecenie będzie działać tylko wtedy, gdy partycje nie zostaną zamontowane.

... rzeczywiście wygląda na to, że sfdisk -Rzostał usunięty gdzieś pomiędzy util-linux 2.24.2 i 2.26.1
Charles Duffy

1
man sfdiskmówi: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.
Tom Hale,


8

Uwaga: Proszę założyć, że żadna z aktualnie edytowanych przeze mnie partycji nie jest otwarta, zamontowana lub używana w inny sposób.

Biorąc pod uwagę to założenie, tablicę partycji można pomyślnie przeskanować ponownie, a problem się nie pojawi. Jeśli pojawia się ten błąd, to dlatego, że tablica partycji jest obecnie w użyciu i dlatego nie można go ponownie przeskanować bez tworzenia niespójności.


Niektóre partycje mogą być w użyciu, ale żadna z nich nie jest tym, co faktycznie zmieniam, chociaż mogą znajdować się w tej samej tabeli partycji.
Teddy

8
Jądro nie jest takie inteligentne. Jeśli używana jest jakaś partycja w tabeli, jądro nie skanuje ponownie. Zrozumienie tego w innym kierunku może być katastrofalne, więc jest bezpieczne. Jeśli chcesz korzystać z partycji do woli, użyj LVM.
womble

6

Nie jest oparty na edytowanej partycji.

Załóżmy, że masz tylko jeden dysk twardy ( /dev/sda) i dwie partycje ( /dev/sda1, /dev/sda2) i zamontowałeś tylko jedną partycję ( /dev/sda1). Jeśli usuniesz lub zmienisz coś o innej partycji, która nawet nie jest zamontowana ( /dev/sda2), pojawi się błąd, że ponowne odczytanie tablicy partycji nie powiodło się, a jądro użyje starej tabeli.

Ale jeśli masz dwa dyski twarde ( /dev/sda, /dev/sdb) i żadna z partycji ( /dev/sdb) nie jest używana. Następnie możesz dodać / usunąć / zmienić rozmiar / edytować partycje /dev/sdbi zostaną one ponownie przeczytane bez żadnego problemu. Ale nawet jeśli jedna partycja / dev / sdb została zamontowana podczas zmiany. Wtedy jądro będzie nadal używać starej tabeli.


5

Ja (pierwotny pytający) miałem kilka dni temu sytuację, w której żadna z pozostałych odpowiedzi (w tym partprobe /dev/sdXobecnie zaakceptowana i najlepiej głosowana) nie zadziałała. Co zrobił pracę, jednak było to:

blockdev --rereadpt /dev/sdX

(Nie wiem, dlaczego to zadziałało, a inne nie, ale cieszę się, że zadziałało, ponieważ uratowało mi ponowne uruchomienie na zajętym serwerze).


5

korzystam z centos 6,5 x 64; jądro 2.6.32. i testuję sztuczkę fdisk, aby zmienić rozmiar.

/dev/sda1 /boot
/dev/sda2 /

Wszystkie następujące polecenia nie spowodowały ponownego odczytu partycji jądra:

  • partprobe / dev / sda (ostrzeżenie: jądro nie może ponownie odczytać ....)
  • hdparm -z / dev / sda (BLKRRPART nie powiodło się: urządzenie lub zasób zajęte)
  • blockdev -rereadpt / dev / sda (BLKRRPART nie powiodło się: urządzenie lub zasób zajęte)
  • sfdisk -R / dev / sda (BLKRRPART nie powiodło się: urządzenie lub zasób zajęte)

wciąż potrzebuję restartu, aby działał


nic z tego też dla mnie nie działało (proxy VMX, centos 7, partycja xfs, brak lvm). Odpowiedź @ uus zadziałała: serverfault.com/a/722386/102252
NotGaeL

Wszystkie powyższe polecenia również dla mnie nie działały.
Fadi Asbih

Myślę, że jądro 2.6.32 ma problem, używałem ich wcześniej na innych komputerach, działało dobrze, nawet przy dodawaniu partycji o większej liczbie między starszymi partycjami. tj. sdb1 sdb2 sdb3 - usuń sdb2, a następnie sdb1 sdb4 sdb5 sdb3. Oprócz powyższego partx, kpartx, blockdev również nie działały.
sdkks

Nie sądzę, że to niezwykłe, że jeśli jedno polecenie nie wczyta ponownie partycji, wszystkie zawiodą - zobacz także moją odpowiedź, w jaki sposób wyeliminować niektóre przyczyny tego .
maxschlepzig

3

Po odłączeniu wszystkich punktów montowania, uruchomiony Yocto 2.4:

partprobe /dev/sda 

Nadal nie udało się ponownie załadować tabeli partycji po usunięciu partycji na urządzeniu. Również wypróbowane - i nie powiodły się:

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

Wszystkie zgłaszały podobne błędy „BLKRRPART nie powiodło się: urządzenie lub zasób zajęte ...” instruuje mnie do ponownego uruchomienia. Czy to niepowodzenie wcześniej działających metod może wynikać z faktu, że udev jest teraz pod kontrolą systemową? Myśląc w ten sposób, próbowałem:

systemctl restart systemd-udevd.service

I nagle mój dysk jest znów dostępny, bez ponownego uruchamiania!


Najczęściej akceptowana odpowiedź jest niepełna: we współczesnym systemdświecie TO jest poprawna odpowiedź. Pamiętaj, że musisz także ponownie uruchomić jeden z nich (lub oba) systemd-udev-settlei systemd-udev-trigger. Ponowne uruchomienie, tak systemd-udevdjak powiedział Camp, nie wystarczyło mi. Ale zrestartowanie również dwóch pozostałych załatwiło sprawę!
Costin Gușă

1

Gdy polecenie takie jak blockdev --rereadpt /dev/sdXnie powiedzie się z

blockdev: ioctl error on BLKRRPART: Device or resource busy

zwykle oznacza to, że jakaś (stara) partycja jest nadal w jakiś sposób używana przez jądro.

Możliwe przyczyny / poprawki:

  1. partycja sdX - powiedzmy sdX1- jest nadal zamontowana - sprawdź ją mounti zamontuj
  2. /dev/sdX1jest częścią nalotu na oprogramowanie - sprawdź cat /proc/mdstati ewentualnie zatrzymaj odpowiednie tablice, npmdadm --stop /dev/md126
  3. /dev/sdX1jest częścią woluminu fizycznego LVM - sprawdź za pomocą pvdisplay/ vgdisplayi ewentualnie dezaktywuj za pomocąvgchange
  4. /dev/sdX1są częścią pewnych mapowania urządzenia - na przykład za pomocą cryptsetup- sprawdzenia /dev/mapperi lsblki ewentualnie usunąć mapowanie (na przykład cryptsetup luksClose)
  5. Wyścig z pewnymi sondami udev - sprawdź uruchomione procesy psi prawdopodobnie zabij jeden

Jeśli jedno narzędzie - powiedzieć blockdev --rereadptnie tacy jak zwykle w podobnych ( partx -uv, kpartx, partprobe, kpartprobe) nie w podobny sposób aż przyczyną jest wyeliminowane.


0

Możesz także spróbować:

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

(Ale nie będzie działać, patrz komentarz poniżej)


3
Nie powoduje to ponownego odczytania tabeli partycji. Po prostu aktualizuje informacje o geometrii, tryb pamięci podręcznej itp. Wydaje się SCSI IDENTIFY_DRIVE.
Dmitrij Chubarow,

0

kpartx -a <partition> można uruchomić dwa razy na nowo utworzonej partycji .... zamiast ponownego uruchamiania systemu.


2
Dwa razy? Czy również biegasz „ sync; sync; sync”? Smell Czuję przesąd…
Teddy

1
Myślę, że ten przesąd wynikał z faktu, że sprawdzasz, czy twoja synchronizacja odbywa się przez drugą synchronizację. Z wyjątkiem tego, że drugi jest cenny tylko dla operatora, aby potwierdzić, że natychmiast wraca do monitu, wskazując w ten sposób pierwszą synchronizację zakończoną zgodnie z oczekiwaniami. kilka blogów i samouczków później i ...
JM Becker

0

Pamiętaj, aby sprawdzić, czy usługa udev działa. Jest to szczególnie przydatne, gdy partprobe, hdparm, blockdev i różne inne polecenia nie wydają się mieć znaczenia, jakie pliki urządzeń są dostępne w katalogu / dev /.


0

Dla mnie ani partprobeczy blockdevrozwiązanie działało. Chociaż ten działa:

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

-3

Jeśli przeczytasz stronę podręczną „man oracleasm-scandisks”, zwrócisz uwagę na poniższy tekst. oracleasm używa / proc / partitions jako źródła całego wykonywanego skanowania. Musisz umieścić swoje surowe urządzenia na liście w / proc / partitions, zanim będziesz mógł zrobić skandisk. Parametry Scanorder i Scanexclude, które umieszczasz w / etc / sysconfig / oracleasm, odnoszą się do nazw znalezionych w / proc / partitions (!!!!).

---------- człowiek, skandiski z oracleasm ------ ...

JAK DZIAŁA SKANOWANIE Skanowanie przebiega w czterech podstawowych etapach.

   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
... nic nie wspominał o używaniuoracleasm-scandisks
voretaq7 26.04.13
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.