Bazen, bir diskteki bölümlerle yeniden boyutlandırırken veya başka bir şekilde mucking yaparken cfdisk şunları söyler:
Wrote partition table, but re-read table failed. Reboot to update table.
(Bu diğer bölümleme araçlarıyla da olur, bu yüzden bunun cfdisk sorunu yerine bir Linux sorunu olduğunu düşünüyorum.) Neden bu ve neden sadece bazen ve ne yapabilirim? önlemek için?
Not: Lütfen gerçekten düzenlemekte olduğum bölümlerin hiçbirinin açık, monte edilmiş veya kullanımda olmadığını varsayalım.
Güncelleme:
cfdisk, Linux'a bölüm tablosunu yeniden okumasını söylemek için ioctl(fd, BLKRRPART, NULL)
kullanır. Şimdiye kadar önerilen diğer araçlardan ikisi (hdparm -z
DEVICE
, sfdisk -R
DEVICE
) tamamen aynı şey. partprobe
DEVICE
komutu ise BLKPG adlı yeni bir ioctl kullanıyor gibi görünüyor ki bu daha iyi olabilir; Bilmiyorum. (BLKPG başarısız olursa da BLKRRPART'a geri döner.)
BLKPG "bu bölüm değişti; işte yeni boyut" işlemi gibi görünüyor ve partprobe
gibi görünüyordu, cihazdaki tüm bölümlerde ayrı ayrı çağırdı, bu yüzden ayrı bölümler kullanılmayan. Ancak, bunu deneme fırsatım olmadı.
IMHO en güvenilir/en iyi cevap
partprobe /dev/sdX
Bölüm tablosu bilgilerini yeniden okuma her zaman işe yaramaz, ancak deneyin
hdparm -z /dev/sda
veya
sfdisk -R /dev/sda
Çalışırsa/proc/bölümlerdeki değerler değişecektir.
Centos7'de:
https://access.redhat.com/solutions/19957
Denemelisin :
partx -u <partition>
Benim için çalıştı.
Not: Lütfen gerçekten düzenlemekte olduğum bölümlerin hiçbirinin açık, monte edilmiş veya kullanımda olmadığını varsayalım.
Bu varsayım dikkate alındığında, bölüm tablosu can başarıyla yeniden taranabilir ve sorun ortaya çıkmaz. Bu hatayı alıyorsanız, bölüm tablosu is şu anda kullanımdadır ve bu nedenle tutarsızlıklar oluşturulmadan yeniden taranamaz.
Düzenlemekte olduğunuz bölüme dayalı değildir.
Yalnızca bir sabit diskiniz (/dev/sda
) Ve iki bölümünüz (/dev/sda1
, /dev/sda2
) Olduğunu ve yalnızca bir disk bölümünüz olduğunu varsayalım (/dev/sda1
). Hatta bağlı olmayan diğer bölümle ilgili herhangi bir şeyi silerseniz veya değiştirirseniz (/dev/sda2
) Bölüm tablosunun yeniden okunmasında başarısız olur ve çekirdek eski tabloyu kullanır.
Ancak iki sabit diskiniz varsa (/dev/sda
, /dev/sdb
) Ve (/dev/sdb
) Bölümlerinin hiçbiri kullanılmıyor. Daha sonra /dev/sdb
Bölümlerini ekleyebilir/silebilir/yeniden boyutlandırabilir/düzenleyebilirsiniz; bunlar sorunsuz bir şekilde yeniden okunur. Ancak değişiklik sırasında/dev/sdb'nin bir bölümü monte edilmiş olsa bile. Sonra çekirdek eski tabloyu kullanmaya devam edecektir.
Ben (asıl soru soran) birkaç gün önce diğer cevaplardan hiçbirinin (partprobe /dev/sdX
, şu anda kabul edilen ve en çok oy verilen cevap) çalıştı. Ancak işe yarayan işe yarayan şuydu:
blockdev --rereadpt /dev/sdX
(Bunun neden işe yaradığını bilmiyorum ve diğerleri işe yaramadı, ancak meşgul bir sunucuda yeniden başlatmamı sağladığı için işe yaradığı için mutluyum.)
6.5 x64 centos üzerindeyim; çekirdek 2.6.32. ve yeniden boyutlandırmak için fdisk hilesini test ediyorum.
/dev/sda1 /boot
/dev/sda2 /
Aşağıdaki tüm komutlar değil çekirdeği yeniden okuma bölümü yaptı:
çalışması için hala yeniden başlatmaya ihtiyacım var
Tüm montaj noktaları sökülmüşken, Yocto 2.4'ü çalıştırın:
partprobe /dev/sda
Aygıtta bölümler silindikten sonra bölüm tablosunu yeniden yükleyemedim. Ayrıca denendi - ve başarısız oldu:
udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda
Tüm benzer "BLKRRPART başarısız oldu: aygıt veya kaynak meşgul ..." hataları yeniden başlatmamı bildiriyor. Daha önce çalışma yöntemlerinin başarısızlığı, muhtemelen udev'in şimdi systemd kontrolü altında olması nedeniyle mi? Denediğim bu çizgiler boyunca:
systemctl restart systemd-udevd.service
Ve aniden diskim tekrar kullanılabilir, yeniden başlatmadan!
Ayrıca deneyebilirsiniz:
echo 1 > /sys/block/sdX/device/rescan
(Ama işe yaramaz, aşağıdaki yoruma bakın)
blockdev --rereadpt /dev/sdX
Gibi bir komut başarısız olduğunda
blockdev: ioctl error on BLKRRPART: Device or resource busy
bu genellikle bazı (eski) bölümlerin çekirdek tarafından hala bir şekilde kullanıldığı anlamına gelir.
Olası nedenler/düzeltmeler:
sdX1
- hala bağlı - mount
ile kontrol edin ve onu ekleyin/dev/sdX1
Yazılım baskısının bir parçasıdır - cat /proc/mdstat
'U kontrol edin ve muhtemelen ilgili dizileri durdurun, ör. mdadm --stop /dev/md126
/dev/sdX1
Bir LVM fiziksel biriminin bir parçasıdır - pvdisplay
/vgdisplay
ile kontrol edin ve muhtemelen vgchange
ile devre dışı bırakın/dev/sdX1
Bazı cihaz eşlemelerinin bir parçasıdır - ör. cryptsetup
- /dev/mapper
ve lsblk
üzerinden kontrol edin ve muhtemelen eşlemeyi kaldırın (örneğin cryptsetup luksClose
)ps
ile çalışan işlemleri kontrol edin ve muhtemelen birini öldürünBir araç - blockdev --rereadpt
Genellikle (partx -uv
, kpartx
, partprobe
, kpartprobe
) gibi benzer araçlarda başarısız olursa kök neden ortadan kaldırılıncaya kadar.
kpartx -a <partition>
sistemi yeniden başlatmak yerine .... yeni oluşturulan bölüm üzerinde iki kez çalıştırılabilir.
Benim için partprobe
veya blockdev
çözümü işe yaramadı. Bununla birlikte, bu işe yarıyor:
udevadm settle --exit-if-exists=/dev/sdb1
Udev hizmetinin çalışıp çalışmadığını kontrol etmeyi unutmayın. Bu, özellikle partprobe, hdparm, blockdev ve diğer çeşitli komutların/dev/dizininde hangi aygıt dosyalarının kullanılabilir olduğunu fark etmediği durumlarda kullanışlıdır.