Baca ulang tabel partisi tanpa me-reboot?


71

Terkadang, ketika mengubah ukuran atau mucking dengan partisi pada disk, cfdisk akan mengatakan:

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

(Ini juga terjadi dengan alat partisi lain, jadi saya pikir ini adalah masalah Linux daripada masalah cfdisk.) Mengapa ini, dan mengapa itu hanya terjadi kadang-kadang , dan apa yang bisa saya lakukan untuk menghindarinya?

Catatan: Harap asumsikan bahwa tidak ada partisi yang sedang saya edit yang dibuka, dipasang atau digunakan.


Memperbarui:

cfdisk digunakan ioctl(fd, BLKRRPART, NULL)untuk memberitahu Linux untuk membaca ulang tabel partisi. Dua alat lain yang direkomendasikan sejauh ini ( hdparm -z DEVICE, sfdisk -R DEVICE) melakukan hal yang persis sama. The partprobe DEVICEperintah, di sisi lain, tampaknya menggunakan ioctl baru yang disebut BLKPG, yang mungkin lebih baik; Saya tidak tahu (Itu juga jatuh kembali pada BLKRRPART jika BLKPG gagal.)

BLKPG tampaknya menjadi operasi "partisi ini telah berubah; ini adalah ukuran baru", dan sepertinya partprobedisebut secara individual pada semua partisi pada perangkat yang dilewati, jadi itu akan berfungsi jika partisi individual tidak digunakan. Namun, saya belum berkesempatan mencobanya.


1
man sfdiskmengatakan: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

Jawaban:


66

IMHO jawaban yang paling dapat diandalkan / terbaik adalah

partprobe /dev/sdX

1
Saya baru saja mengembangkan dev di bawah Ubuntu Server, dev ini adalah serangan perangkat keras. Setelah memperluas raid yang mendasarinya menggunakan raidcontroller, saya turun dari filesystem dan mencoba "partprobe / dev / sda" - ini tidak berhasil. "fdisk -l" masih menunjukkan ukuran yang lama. Saya kemudian menjalankan "hdparm -z / dev / sda" dan ini berhasil. Saya kemudian bisa memasang dan mengubah ukuran sistem file saya tanpa reboot. Saya tahu saya tidak menambahkan apa pun selain YMMV.
Mwuanno

Saya menggunakan centos 6.5; kernel 2.6.32. semua perintah berikut ini tidak membuat partisi kernel baca ulang: - partprobe / dev / sda (warnikg: kernel gagal membaca ulang)
Max

@ Max, saya juga memperhatikan bahwa terkadang partprobe mencetak kesalahan yang tidak berhasil. Kadang-kadang reboot adalah satu-satunya pilihan untuk memastikan. Namun, sering kali hal itu berhasil bagi saya.
Mat

Ini tidak berhasil bagi saya karena ada beberapa direktori yang masih terpasang dengan --bind. Partisi itu sendiri sudah di-unmount tetapi bind-mounts yang menunjuk ke partisi itu masih ada. Aneh bahwa umount berfungsi dan partprobe tidak, tetapi setelah umounting bind-mounts juga, saya juga bisa partprobe disk.
Ethan Leroy

Ini bekerja untuk saya di CentOS 6 setelah flagellating dengan kpartxdan udevadm triggerselama 10 menit. Terima kasih!
Mike Andrews

19

Membaca ulang informasi tabel partisi tidak selalu berhasil, tetapi cobalah

hdparm -z /dev/sda

atau

sfdisk -R /dev/sda

Jika berfungsi, nilai-nilai di / proc / partisi akan berubah.


hdparm bekerja untuk saya.
Prof. Falken

3
opsi sfdisk -R tidak ada.
Matt

Perlu dicatat bahwa hdparmperintah hanya akan berfungsi jika partisi tidak di-mount.

... memang, sepertinya sfdisk -Rdihapus di suatu tempat antara util-linux 2.24.2 dan 2.26.1
Charles Duffy

1
man sfdiskmengatakan: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

Catatan: Harap asumsikan bahwa tidak ada partisi yang sedang saya edit yang dibuka, dipasang atau digunakan.

Dengan asumsi itu, tabel partisi dapat berhasil di-scan ulang, dan masalah tidak akan muncul. Jika Anda mendapatkan kesalahan itu, itu karena tabel partisi saat ini sedang digunakan, dan karenanya tidak dapat dipindai ulang tanpa membuat ketidakkonsistenan.


Beberapa partisi mungkin sedang digunakan, tetapi tidak ada satupun yang benar-benar saya ubah, meskipun mereka mungkin berada di tabel partisi yang sama.
Teddy

8
Kernelnya tidak sepintar itu. Jika ada partisi dalam tabel yang digunakan, kernel tidak memindai ulang. Melakukan kesalahan di arah lain bisa jadi bencana besar, jadi itu aman. Jika Anda ingin mencari-cari partisi sesuka hati, gunakan LVM.
womble

6

Itu tidak didasarkan pada partisi yang sedang Anda edit.

Misalkan Anda hanya memiliki satu harddisk ( /dev/sda) dan dua partisi ( /dev/sda1, /dev/sda2) dan Anda telah memasang hanya satu partisi ( /dev/sda1). Jika Anda menghapus atau mengubah sesuatu tentang partisi lain yang bahkan tidak di-mount ( /dev/sda2) Anda akan mendapatkan kesalahan karena pembacaan ulang tabel partisi gagal dan kernel akan menggunakan tabel lama.

Tetapi jika Anda memiliki dua harddisk ( /dev/sda, /dev/sdb) dan tidak ada partisi dari ( /dev/sdb) yang digunakan. Kemudian Anda dapat menambah / menghapus / mengubah ukuran / mengedit partisi /dev/sdbdan mereka akan dibaca kembali tanpa masalah. Tetapi bahkan jika satu partisi / dev / sdb dipasang selama perubahan. Kemudian kernel akan tetap menggunakan tabel lama.


5

Saya (si penanya asli) memiliki situasi beberapa hari yang lalu ketika tidak ada jawaban lain (termasuk partprobe /dev/sdX, saat ini jawaban yang diterima dan yang dipilih dengan suara tertinggi) bekerja. Apa yang melakukan pekerjaan, bagaimanapun, adalah ini:

blockdev --rereadpt /dev/sdX

(Saya tidak tahu mengapa ini berhasil dan yang lain tidak, tapi saya senang itu berhasil, karena menyelamatkan saya dari reboot pada server yang sibuk.)


5

Saya menggunakan centos 6.5 x64; kernel 2.6.32. dan saya sedang menguji trik fdisk untuk mengubah ukuran.

/dev/sda1 /boot
/dev/sda2 /

Semua perintah berikut ini tidak membuat partisi ulang kernel:

  • partprobe / dev / sda (peringatan: kernel gagal membaca ulang ....)
  • hdparm -z / dev / sda (BLKRRPART gagal: perangkat atau sumber daya sibuk)
  • blockdev -rereadpt / dev / sda (BLKRRPART gagal: perangkat atau sumber daya sibuk)
  • sfdisk -R / dev / sda (BLKRRPART gagal: perangkat atau sumber daya sibuk)

saya masih membutuhkan reboot untuk membuatnya berfungsi


tidak ada yang bekerja untuk saya juga (proxmox VM, centos 7, partisi xfs, no lvm). @uus jawaban berhasil, serverfault.com/a/722386/102252
NotGaeL

Semua perintah di atas juga tidak bekerja untuk saya.
Fadi Asbih

Saya pikir kernel 2.6.32 memiliki masalah, saya menggunakan ini sebelumnya pada komputer lain, itu berfungsi dengan baik, bahkan ketika menambahkan partisi dengan angka yang lebih tinggi antara partisi yang lebih tua. yaitu sdb1 sdb2 sdb3 - hapus sdb2, lalu sdb1 sdb4 sdb5 sdb3. Selain di atas, partx, kpartx, blockdev juga tidak berfungsi.
sdkks

Saya tidak berpikir bahwa itu tidak biasa bahwa jika satu perintah gagal membaca ulang partisi, semua gagal - lihat juga jawaban saya untuk cara menghilangkan beberapa penyebab untuk ini .
maxschlepzig

3

Dengan semua mount poin dilepas, jalankan Yocto 2.4:

partprobe /dev/sda 

Masih gagal memuat ulang tabel partisi setelah partisi dihapus pada perangkat. Juga mencoba - dan gagal adalah:

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

Semua yang dilaporkan serupa "BLKRRPART gagal: kesalahan perangkat atau sumber daya ..." menginstruksikan saya untuk reboot. Apakah kegagalan metode yang sebelumnya berfungsi ini mungkin disebabkan oleh fakta bahwa udev sekarang berada di bawah kendali systemd? Berpikir seperti itu saya mencoba:

systemctl restart systemd-udevd.service

Dan tiba-tiba disk saya tersedia lagi, tanpa reboot!


Jawaban teratas yang diterima tidak lengkap: di systemddunia modern , INI adalah jawaban yang benar. Harap perhatikan bahwa Anda juga harus memulai ulang salah satu (atau keduanya) systemd-udev-settledan systemd-udev-trigger. Memulai kembali systemd-udevdseperti yang Camp katakan tidak cukup untukku. Tetapi memulai kembali juga dua lainnya berhasil!
Costin Gușă

1

Ketika perintah suka blockdev --rereadpt /dev/sdXgagal dengan

blockdev: ioctl error on BLKRRPART: Device or resource busy

ini biasanya berarti bahwa beberapa partisi (lama) memang masih digunakan oleh kernel.

Kemungkinan penyebab / perbaikan:

  1. partisi sdX - katakan sdX1- masih terpasang - periksa mountdan umount
  2. /dev/sdX1merupakan bagian dari serangan perangkat lunak - periksa cat /proc/mdstatdan mungkin hentikan array yang relevan, mismdadm --stop /dev/md126
  3. /dev/sdX1adalah bagian dari volume fisik LVM - periksa dengan pvdisplay/ vgdisplaydan mungkin nonaktifkan denganvgchange
  4. /dev/sdX1adalah bagian dari beberapa pemetaan perangkat - misalnya via cryptsetup- centang /dev/mapperdan lsblkdan mungkin menghapus pemetaan (misalnya cryptsetup luksClose)
  5. Kondisi balapan dengan beberapa udev probing - periksa proses yang berjalan dengan psdan mungkin bunuh satu

Jika salah satu alat - mengatakan blockdev --rereadptgagal yang biasanya mirip seperti ( partx -uv, kpartx, partprobe, kpartprobe) gagal dengan cara yang sama sampai akar penyebab dihilangkan.


0

Anda juga dapat mencoba:

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

(Tetapi tidak akan berhasil, lihat komentar di bawah)


3
Ini tidak membaca ulang tabel partisi. Itu hanya memperbarui informasi geometri, mode cache, dll. SCSI IDENTIFY_DRIVE sedang dikeluarkan.
Dmitri Chubarov

0

kpartx -a <partition> dapat dijalankan dua kali pada partisi yang baru dibuat .... bukannya me-reboot sistem.


2
Dua kali? Apakah Anda juga menjalankan " sync; sync; sync"? ☺ Aku mencium takhayul ...
Teddy

1
Saya pikir takhayul ini berasal dari fakta bahwa Anda memeriksa apakah sinkronisasi Anda, dengan melakukan sinkronisasi kedua. Kecuali bahwa yang kedua hanya berharga bagi operator, untuk mengonfirmasi itu kembali ke prompt segera, sehingga menunjukkan sinkronisasi pertama selesai seperti yang diharapkan. beberapa blog dan tutorial kemudian, dan ....
JM Becker

0

Ingatlah untuk memeriksa layanan udev sedang berjalan. Ini sangat berguna ketika partprobe, hdparm, blockdev, dan berbagai perintah lain tampaknya tidak membuat perbedaan apa pun file perangkat yang tersedia di direktori / dev /.


0

Bagi saya tidak ada solusi partprobeatau blockdevbekerja. Meskipun, yang ini berfungsi:

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

-3

Jika Anda membaca halaman manual untuk 'man oracleasm-scandisks' Anda akan mencatat teks di bawah ini. oracleasm menggunakan / proc / partisi sebagai sumber dari semua pemindaian yang dilakukannya. Anda harus mendapatkan perangkat mentah Anda terdaftar di / proc / partisi sebelum Anda dapat melakukan scandisk. Parameter Scanorder dan Scanexclude yang Anda tempatkan di / etc / sysconfig / oracleasm berhubungan dengan nama-nama yang ditemukan di / proc / partisi (!!!!).

---------- lelaki oracleasm-scandisks ------ ...

BAGAIMANA SCANNING HAPPENS Scan berlangsung dalam empat tahap dasar.

   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
... dia tidak menyebutoracleasm-scandisks
nyebut
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.