it-swarm-vi.tech

Đọc lại bảng phân vùng mà không cần khởi động lại?

Đôi khi, khi thay đổi kích thước hoặc nói cách khác với các phân vùng trên đĩa, cfdisk sẽ nói:

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

(Điều này cũng xảy ra với các công cụ phân vùng khác, vì vậy tôi nghĩ đây là vấn đề của Linux chứ không phải là vấn đề cfdisk.) Tại sao lại như vậy và tại sao nó chỉ xảy ra đôi khi và tôi có thể làm gì để tránh nó?

Lưu ý: Vui lòng giả sử rằng không có phân vùng nào tôi thực sự chỉnh sửa được mở, gắn hoặc sử dụng.


Cập nhật:

cfdisk sử dụng ioctl(fd, BLKRRPART, NULL) để báo cho Linux đọc lại bảng phân vùng. Hai trong số các công cụ khác được đề xuất cho đến nay (hdparm -zDEVICE, sfdisk -RDEVICE) không chính xác điều tương tự Mặt khác, lệnh partprobeDEVICE dường như sử dụng một ioctl mới gọi là BLKPG, có thể tốt hơn; Tôi không biết. (Nó cũng rơi trở lại vào BLKRRPART nếu BLKPG không thành công.)

BLKPG dường như là một hoạt động "phân vùng này đã thay đổi, đây là kích thước mới" và có vẻ như partprobe đã gọi nó riêng lẻ trên tất cả các phân vùng trên thiết bị được thông qua, vì vậy nó sẽ hoạt động nếu các phân vùng riêng lẻ không sử dụng Tuy nhiên, tôi chưa có cơ hội để thử nó.

71
Teddy

IMHO câu trả lời đáng tin cậy nhất/tốt nhất là

partprobe /dev/sdX
68
knweiss

Đọc lại thông tin bảng phân vùng không phải lúc nào cũng hoạt động, nhưng hãy thử

hdparm -z /dev/sda

hoặc là

sfdisk -R /dev/sda

Nếu nó hoạt động, các giá trị trong/Proc/phân vùng sẽ thay đổi.

19
ko-dos

Trên Centos7:

Theo https://access.redhat.com/solutions/19957

Bạn nên thử :

partx -u <partition>

Nó làm việc cho tôi.

10
uus

Lưu ý: Vui lòng giả sử rằng không có phân vùng nào tôi thực sự chỉnh sửa được mở, gắn hoặc sử dụng.

Giả định đó, bảng phân vùng có thể được giải cứu thành công và vấn đề sẽ không phát sinh. Nếu bạn gặp phải lỗi đó, đó là do bảng phân vùng is hiện đang được sử dụng và do đó không thể quét lại mà không tạo ra sự không nhất quán.

8
womble

Nó không dựa trên phân vùng mà bạn đang chỉnh sửa.

Giả sử bạn chỉ có một ổ cứng (/dev/sda) và hai phân vùng (/dev/sda1, /dev/sda2) và bạn chỉ gắn một phân vùng (/dev/sda1). Nếu bạn xóa hoặc thay đổi bất cứ điều gì về phân vùng khác thậm chí không được gắn kết (/dev/sda2) bạn sẽ gặp lỗi khi đọc lại bảng phân vùng không thành công và kernel sẽ sử dụng bảng cũ.

Nhưng nếu bạn có hai ổ cứng (/dev/sda, /dev/sdb) và không có phân vùng nào của (/dev/sdb) đang được sử dụng. Sau đó, bạn có thể thêm/xóa/thay đổi kích thước/chỉnh sửa phân vùng của /dev/sdb và chúng sẽ được đọc lại mà không có vấn đề gì. Nhưng ngay cả khi một phân vùng của/dev/sdb được gắn kết trong khi thay đổi. Sau đó kernel sẽ tiếp tục sử dụng bảng cũ.

6
Saurabh Barjatiya

Tôi (người hỏi ban đầu) đã có một tình huống vài ngày trước khi không có câu trả lời nào khác (bao gồm partprobe /dev/sdX, hiện tại câu trả lời được chấp nhận và được bình chọn cao nhất) đã hoạt động. Cái gì đã công việc, tuy nhiên, là thế này:

blockdev --rereadpt /dev/sdX

(Tôi không biết tại sao điều này hoạt động và những người khác thì không, nhưng tôi rất vui vì nó đã hoạt động, vì nó đã giúp tôi khởi động lại trên một máy chủ bận rộn.)

5
Teddy

tôi đang trên centos 6,5 x64; nhân 2.6.32. và tôi đang thử nghiệm thủ thuật fdisk để thay đổi kích thước.

/dev/sda1 /boot
/dev/sda2 /

Tất cả các lệnh sau đã làm không tạo phân vùng đọc lại kernel:

  • partprobe/dev/sda (cảnh báo: kernel không thể đọc lại ....)
  • hdparm -z/dev/sda (BLKRRPART không thành công: thiết bị hoặc tài nguyên bận)
  • blockdev -rereadpt/dev/sda (BLKRRPART không thành công: thiết bị hoặc tài nguyên bận)
  • sfdisk -R/dev/sda (BLKRRPART không thành công: thiết bị hoặc tài nguyên bận)

tôi vẫn cần khởi động lại để làm cho nó hoạt động

5
Max

Với tất cả các điểm gắn kết chưa từng có, chạy Yocto 2.4:

partprobe /dev/sda 

Vẫn không thể tải lại bảng phân vùng sau khi phân vùng đã bị xóa trên thiết bị. Cũng đã thử - và thất bại là:

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

Tất cả đều báo cáo lỗi "BLKRRPART tương tự: lỗi thiết bị hoặc tài nguyên bận ..." hướng dẫn tôi khởi động lại. Có phải sự thất bại của các phương pháp làm việc trước đây có thể là do thực tế là udev hiện đang nằm dưới sự kiểm soát của systemd? Suy nghĩ theo những dòng tôi đã cố gắng:

systemctl restart systemd-udevd.service

Và đột nhiên đĩa của tôi có sẵn một lần nữa, không cần khởi động lại!

3
Camp Waub-O-Jeeg

Bạn cũng có thể thử:

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

(Nhưng sẽ không hoạt động, xem bình luận bên dưới)

1
bogdano

Khi một lệnh như blockdev --rereadpt /dev/sdX thất bại với

blockdev: ioctl error on BLKRRPART: Device or resource busy

điều này thường có nghĩa là một số phân vùng (cũ) thực sự vẫn được sử dụng bởi kernel.

Nguyên nhân/cách khắc phục có thể:

  1. phân vùng sdX - nói sdX1 - vẫn được gắn kết - kiểm tra với mount và bỏ qua nó
  2. /dev/sdX1 là một phần của cuộc đột kích phần mềm - kiểm tra cat /proc/mdstat và có thể dừng các mảng có liên quan, ví dụ: mdadm --stop /dev/md126
  3. /dev/sdX1 là một phần của âm lượng vật lý LVM - kiểm tra với pvdisplay/vgdisplay và có thể hủy kích hoạt bằng vgchange
  4. /dev/sdX1 là một phần của một số ánh xạ thiết bị - ví dụ: thông qua cryptsetup - kiểm tra /dev/mapperlsblk và có thể xóa ánh xạ (ví dụ: cryptsetup luksClose)
  5. Điều kiện cuộc đua với một số thăm dò udev - kiểm tra các quy trình đang chạy với ps và có thể giết chết một

Nếu một công cụ - nói blockdev --rereadpt thất bại thường tương tự như (partx -uv, kpartx, partprobe, kpartprobe) thất bại theo cách tương tự cho đến khi nguyên nhân gốc được loại bỏ.

1
maxschlepzig

kpartx -a <partition> có thể chạy hai lần trên phân vùng mới được tạo .... thay vì khởi động lại hệ thống.

0
Kailas Kadam

Đối với tôi, giải pháp partprobe hoặc blockdev không hoạt động. Mặc dù, cái này hoạt động:

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

Hãy nhớ kiểm tra dịch vụ udev đang chạy. Điều này đặc biệt hữu ích khi partprobe, hdparm, blockdev và nhiều lệnh khác dường như không tạo ra bất kỳ sự khác biệt nào về các tập tin thiết bị có sẵn trong thư mục/dev /.

0
kerolasa