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


71

Đô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 đôi khi nó chỉ xảy ra và tôi có thể làm gì để tránh?

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 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 -z DEVICE, sfdisk -R DEVICE) thực hiện chính xác điều tương tự. Mặt khác partprobe DEVICE, lệnh 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 trên 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ư partprobenó được gọi riêng lẻ trên tất cả các phân vùng trên thiết bị được thông qua, do đó, nó sẽ hoạt động nếu các phân vùng riêng lẻ không được sử dụng. Tuy nhiên, tôi chưa có cơ hội để thử nó.


1
man sfdisknói: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

Câu trả lời:


66

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

partprobe /dev/sdX

1
Tôi vừa mở rộng một dev trong Ubuntu Server, dev này là một cuộc đột kích phần cứng. Sau khi mở rộng cuộc đột kích cơ bản bằng cách sử dụng trình điều khiển đột kích, tôi đã gỡ bỏ hệ thống tập tin và thử "partprobe / dev / sda" - điều này không hoạt động. "fdisk -l" vẫn hiển thị kích thước cũ. Sau đó tôi đã chạy "hdparm -z / dev / sda" và điều này đã tạo ra mánh khóe. Sau đó tôi có thể gắn kết và thay đổi kích thước hệ thống tập tin của mình mà không cần khởi động lại. Tôi biết tôi không thêm bất cứ thứ gì thực sự ngoài YMMV.
Mwuanno

Tôi đang trên centos 6.5; hạt nhân 2.6.32. tất cả các lệnh sau không tạo phân vùng đọc lại kernel: - partprobe / dev / sda (warnikg: kernel không thể đọc lại)
Tối đa

@Max, tôi cũng nhận thấy rằng đôi khi ngay cả partprobe cũng in ra một lỗi mà nó không hoạt động. Đôi khi khởi động lại là lựa chọn duy nhất để chắc chắn. Nhiều lần nó dường như làm việc cho tôi mặc dù.
Matt

Điều này không làm việc cho tôi vì có một số thư mục vẫn được gắn với --bind. Bản thân phân vùng đã được ngắt kết nối nhưng các liên kết gắn kết chỉ vào phân vùng đó vẫn còn đó. Điều kỳ lạ là umount hoạt động và partprobe không, nhưng sau khi vượt qua các mount-mount, tôi cũng có thể partprobe đĩa.
Ethan Leroy

Điều này làm việc cho tôi trên CentOS 6 sau khi đánh dấu xung quanh kpartxudevadm triggertrong 10 phút. Cảm ơn bạn!
Mike Andrew

19

Đọ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.


hdparm làm việc cho tôi.
Giáo sư Falken

3
tùy chọn sfdisk -R không tồn tại.
Matt

Cần lưu ý rằng hdparmlệnh sẽ chỉ hoạt động nếu phân vùng không được gắn kết.

... thực sự, có vẻ như sfdisk -Rđã bị xóa ở đâu đó giữa produc-linux 2.24.2 và 2.26.1
Charles Duffy

1
man sfdisknói: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

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.

Với 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 nhận được lỗi rằng, đó là vì các bảng phân vùng hiện đang sử dụng, và do đó không thể được tái quét mà không cần tạo mâu thuẫn.


Một số phân vùng có thể đang được sử dụng, nhưng không ai trong số chúng là những phân vùng mà tôi thực sự đang thay đổi, mặc dù chúng có thể nằm trong cùng một bảng phân vùng.
Teddy

8
Hạt nhân không thông minh. Nếu bất kỳ phân vùng nào trong bảng đang được sử dụng, kernel không quét lại. Nhận sai điều đó theo hướng khác có thể là thảm họa, vì vậy nó an toàn. Nếu bạn muốn nhồi nhét các phân vùng theo ý muốn, hãy sử dụng LVM.
womble

6

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 /dev/sdbvà chúng sẽ được đọc lại mà không gặp 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ũ.


5

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, câu trả lời hiện được chấp nhận và được bình chọn cao nhất) hoạt động. Những gì đã làm việc, tuy nhiên, là đâ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

Tôi đang trên centos 6,5 x64; hạt 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 không tạo phân vùng đọc lại kernel:

  • partprobe / dev / sda (cảnh báo: kernel không đọc lại ....)
  • hdparm -z / dev / sda (BLKRRPART không thành công: bận thiết bị hoặc tài nguyê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


không ai trong số đó làm việc cho tôi cả (proxmox VM, centos 7, phân vùng xfs, không có lvm). @uus câu trả lời đã hoạt động, mặc dù: serverfault.com/a/722386/102252
NotGaeL

Tất cả các lệnh trên cũng không làm việc cho tôi.
Fadi Asbih

Tôi nghĩ kernel 2.6.32 có vấn đề, tôi đã sử dụng những cái này trước đây trên các máy khác, nó hoạt động rất tốt, ngay cả khi thêm các phân vùng có số cao hơn giữa các phân vùng cũ. tức là sdb1 sdb2 sdb3 - xóa sdb2, sau đó sdb1 sdb4 sdb5 sdb3. Ngoài ra, partx, kpartx, blockdev cũng không hoạt động.
sdkks

Tôi không nghĩ rằng điều bất thường là nếu một lệnh không đọc lại các phân vùng, tất cả đều thất bại - hãy xem câu trả lời của tôi để biết cách loại bỏ một số nguyên nhân cho việc này .
maxschlepzig

3

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, mà không cần khởi động lại!


Câu trả lời được chấp nhận hàng đầu là không đầy đủ: trong systemdthế giới hiện đại , ĐÂY là câu trả lời đúng. Xin lưu ý rằng bạn cũng cần khởi động lại một trong những (hoặc cả hai) systemd-udev-settlesystemd-udev-trigger. Khởi động lại systemd-udevdgiống như Camp nói là không đủ với tôi. Nhưng khởi động lại cũng hai người kia đã làm mánh khóe!
Costin Gușă

1

Khi một lệnh như blockdev --rereadpt /dev/sdXthấ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ó thể / sửa lỗi:

  1. một phân vùng sdX - giả sử sdX1- vẫn được gắn kết - kiểm tra mountvà bỏ qua nó
  2. /dev/sdX1là một phần của cuộc đột kích phần mềm - kiểm tra cat /proc/mdstatvà có thể dừng các mảng có liên quan, ví dụ:mdadm --stop /dev/md126
  3. /dev/sdX1là một phần của âm lượng vật lý LVM - kiểm tra với pvdisplay/ vgdisplayvà có thể hủy kích hoạt bằngvgchange
  4. /dev/sdX1là một phần của một số bản đồ thiết bị - ví dụ như thông qua cryptsetup- kiểm tra /dev/mapperlsblkvà có thể loại bỏ các bản đồ (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 quá trình đang chạy với psvà có thể giết chết một

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


0

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)


3
Điều này không đọc lại bảng phân vùng. Nó chỉ cập nhật thông tin hình học, chế độ bộ đệm, v.v. SCSI IDENTIFY_DRIVE đang được ban hành.
Dmitri Chubarov

0

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.


2
Hai lần? Bạn cũng chạy chạy LỪA sync; sync; sync? Tôi ngửi thấy sự mê tín
Teddy

1
Tôi nghĩ sự mê tín này xuất phát từ việc bạn kiểm tra xem có đồng bộ hóa hay không, bằng cách thực hiện đồng bộ hóa thứ hai. Ngoại trừ cái thứ hai chỉ có giá trị đối với toán tử, để xác nhận nó trở về dấu nhắc ngay lập tức, do đó chỉ ra đồng bộ hóa đầu tiên đã hoàn thành như mong đợi. một vài blog và hướng dẫn sau, và ....
JM Becker

0

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

Đối với tôi không partprobehoặc blockdevgiải pháp làm việc. Mặc dù, cái này hoạt động:

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

-3

Nếu bạn đọc trang này cho 'man oracleasm-scandisks', bạn sẽ ghi chú văn bản dưới đây. oracleasm đang sử dụng / Proc / phân vùng làm nguồn của tất cả các lần quét mà nó thực hiện. Bạn phải nhận được các thiết bị thô được liệt kê trong / Proc / phân vùng trước khi bạn có thể thực hiện scandisk. Các tham số Scanorder và Scanexclude bạn đặt trong / etc / sysconfig / oracleasm liên quan đến các tên được tìm thấy trong / Proc / phân vùng (!!!!).

---------- người đàn ông oracleasm-scandisks ------ ...

LÀM THẾ NÀO ĐỂ KIẾM ĐƯỢC HẠNH PHÚC Việc quét tiến hành theo bốn giai đoạn cơ bản.

   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
... anh ấy không đề cập gì về việc sử dụngoracleasm-scandisks
voretaq7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.