재부팅하지 않고 파티션 테이블을 다시 읽습니까?


71

때때로 디스크의 파티션 크기를 조정하거나 다른 방식으로 뭉개면 cfdisk는 다음과 같이 말합니다.

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

(이것은 다른 파티셔닝 도구에서도 발생하므로 이것이 cfdisk 문제가 아닌 Linux 문제라고 생각합니다.) 이것이 왜 발생하는 이유는 무엇이며 가끔 발생하는 이유는 무엇이며,이를 피하기 위해 어떻게해야합니까?

참고 : 실제로 편집중인 파티션이 열려 있거나 마운트되어 있거나 사용중인 것으로 가정하지 마십시오.


최신 정보:

cfdisk는 ioctl(fd, BLKRRPART, NULL)파티션 테이블을 다시 읽도록 Linux에 지시 하는 데 사용 됩니다. 지금까지 권장 된 다른 도구 중 두 개 ( hdparm -z DEVICE, sfdisk -R DEVICE)는 정확히 동일한 기능을 수행합니다. 반면이 partprobe DEVICE명령은 BLKPG라는 새로운 ioctl을 사용하는 것 같습니다. 모르겠어요 (BLKPG가 실패하면 BLKRRPART로 대체됩니다.)

BLKPG는 "이 파티션이 변경되었습니다. 여기에 새로운 크기입니다"작업 인 것 같습니다. partprobe전달 된 장치의 모든 파티션에서 개별적으로 호출 된 것처럼 보이 므로 개별 파티션을 사용하지 않으면 작동해야합니다. 그러나 나는 그것을 시도 할 기회가 없었습니다.


1
man sfdisk말한다 :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.
톰 헤일

답변:


66

가장 신뢰할 수있는 최고의 답변은 다음과 같습니다.

partprobe /dev/sdX

1
방금 Ubuntu Server에서 개발자를 확장했습니다.이 개발자는 하드웨어 공격입니다. raidcontroller를 사용하여 기본 공격을 확장 한 후 파일 시스템을 분리하고 "partprobe / dev / sda"를 시도했지만 작동하지 않았습니다. "fdisk -l"은 여전히 ​​이전 크기를 보여줍니다. 그런 다음 "hdparm -z / dev / sda"를 실행하여 트릭을 수행했습니다. 그런 다음 재부팅하지 않고도 파일 시스템을 마운트하고 크기를 조정할 수 있습니다. YMMV 이외의 다른 것을 추가하지 않는다는 것을 알고 있습니다.
Mwuanno

나는 centos 6.5에있다; 커널 2.6.32. 다음 명령은 모두 커널 다시 읽기 파티션을 만들지 않았습니다.-partprobe / dev / sda (warnikg : 커널을 다시 읽지 못했습니다)
Max

@Max, 때로는 partprobe조차도 작동하지 않는 오류를 인쇄한다는 것을 알았습니다. 때로는 재부팅이 확실한 유일한 옵션 일 수 있습니다. 여러 번 그것은 나를 위해 작동하는 것 같습니다.
Matt

여전히 --bind로 마운트 된 일부 디렉토리가 있기 때문에이 기능이 작동하지 않았습니다. 파티션 자체는 이미 마운트 해제되었지만 해당 파티션을 가리키는 바인드 마운트는 여전히 존재합니다. umount가 작동하고 partprobe가 이상하지는 않지만, bind-mount를 마운트 해제 한 후에도 디스크를 partprobe 할 수 있습니다.
Ethan Leroy

이 주변에 flagellating 이후에 CentOS 6 나를 위해 일 kpartxudevadm trigger10 분. 감사합니다!
Mike Andrews

19

파티션 테이블 정보를 다시 읽는 것이 항상 작동하는 것은 아니지만 시도해보십시오.

hdparm -z /dev/sda

또는

sfdisk -R /dev/sda

작동하면 / proc / partitions의 값이 변경됩니다.


hdparm이 나를 위해 일했습니다.
교수 Falken

3
sfdisk -R 옵션이 존재하지 않습니다.
Matt

주목해야한다 hdparm파티션이 설치되어 있지 않은 경우 명령은 작동합니다.

... 실제로 그것은 sfdisk -Rutil-linux 2.24.2와 2.26.1 사이에서 제거 된 것 같습니다
Charles Duffy

1
man sfdisk말한다 :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.
톰 헤일

10

Centos7에서 :

https://access.redhat.com/solutions/199573 에 따르면

시도해야합니다 :

partx -u <partition>

그것은 나를 위해 일했다.


1
그것은 나를 위해 일하는 유일한 사람이었습니다. 공유해 주셔서 감사합니다 !! 오늘 최고입니다.
NotGaeL

8

참고 : 실제로 편집중인 파티션이 열려 있거나 마운트되어 있거나 사용중인 것으로 가정하지 마십시오.

이 가정이 주어지면 파티션 테이블 성공적으로 다시 스캔 할 수 있으며 문제가 발생하지 않습니다. 해당 오류가 발생하면 파티션 테이블 현재 사용 중이므로 불일치가 발생하지 않으면 다시 스캔 할 수 없기 때문입니다.


일부 파티션은 사용 중일 수 있지만 동일한 파티션 테이블에있을 수 있지만 실제로 변경중인 파티션은 없습니다.
Teddy

8
커널은 그렇게 똑똑하지 않습니다. 테이블의 파티션이 사용 중이면 커널이 다시 검색되지 않습니다. 다른 방향으로 잘못 이해하는 것은 치명적일 수 있으므로 안전합니다. 파티션을 마음대로 사용하려면 LVM을 사용하십시오.
womble

6

편집중인 파티션을 기반으로하지 않습니다.

하나의 하드 디스크 ( /dev/sda)와 두 개의 파티션 ( /dev/sda1, /dev/sda2) 만 있고 하나의 파티션 ( /dev/sda1) 만 마운트 했다고 가정하십시오 . 마운트되지 않은 다른 파티션 ( /dev/sda2) 을 삭제하거나 변경 하면 파티션 테이블을 다시 읽지 못하고 커널이 이전 테이블을 사용한다는 오류가 발생합니다.

그러나 두 개의 하드 디스크 ( /dev/sda, /dev/sdb)가 있고 ( /dev/sdb) 의 파티션이 사용 중이 아닌 경우. 그런 다음 파티션을 추가 / 삭제 / 크기 조정 / 편집 /dev/sdb할 수 있으며 아무런 문제없이 다시 읽습니다. 그러나 변경 중에 / dev / sdb의 하나의 파티션이 마운트 된 경우에도 마찬가지입니다. 그런 다음 커널은 이전 테이블을 계속 사용합니다.


5

나는 (원래 질문자) 며칠 전에 다른 답변 ( partprobe /dev/sdX현재 허용되고 가장 투표가 높은 답변 포함)이 작동 하지 않은 상황이있었습니다 . 어떤 작업을하지만,이 있었다 :

blockdev --rereadpt /dev/sdX

(이것이 왜 효과가 있었는지, 다른 것들이 왜 효과가 없는지는 모르겠지만, 바쁜 서버에서 재부팅을 저장했기 때문에 제대로 작동했습니다.)


5

나는 centos 6.5 x64에 있습니다. 커널 2.6.32. fdisk 트릭을 테스트하여 크기를 조정하고 있습니다.

/dev/sda1 /boot
/dev/sda2 /

다음 명령은 모두 커널 다시 읽기 파티션을 만들지 않았습니다 .

  • partprobe / dev / sda (경고 : 커널을 다시 읽지 못했습니다 ....)
  • hdparm -z / dev / sda (BLKRRPART 실패 : 장치 또는 리소스 사용 중)
  • blockdev -rereadpt / dev / sda (BLKRRPART 실패 : 장치 또는 자원 사용 중)
  • sfdisk -R / dev / sda (BLKRRPART 실패 : 장치 또는 자원 사용 중)

여전히 작동하려면 재부팅이 필요합니다


그중 어느 것도 나를 위해 일하지 않았습니다 (proxmox VM, centos 7, xfs partition, no lvm). @uus 답변은 작동했지만 serverfault.com/a/722386/102252
NotGaeL

위의 모든 명령이 나에게도 효과가 없었습니다.
Fadi Asbih

커널 2.6.32에 문제가 있다고 생각합니다. 다른 머신에서 이전에 사용했지만 이전 파티션 사이에 더 많은 수의 파티션을 추가 할 때도 정상적으로 작동했습니다. 즉 sdb1 sdb2 sdb3-sdb2를 삭제 한 다음 sdb1 sdb4 sdb5 sdb3을 삭제하십시오. 위의 내용 외에도 partx, kpartx, blockdev는 작동하지 않았습니다.
sdkks 2016 년

하나의 명령으로 파티션을 다시 읽지 못하면 모든 것이 실패한다는 것은 드문 일이 아닙니다 . 이것에 대한 원인을 제거하는 방법에 대한 내 대답도 참조하십시오 .
maxschlepzig

3

모든 마운트 포인트가 마운트 해제 된 상태에서 Yocto 2.4를 실행하십시오.

partprobe /dev/sda 

장치에서 파티션을 삭제 한 후에도 여전히 파티션 테이블을 다시로드하지 못했습니다. 또한 시도했지만 실패했습니다.

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

모두 재부팅하라는 "BLKRRPART 실패 : 장치 또는 리소스 사용 중 ..."오류가보고되었습니다. udev가 이제 시스템 제어하에 있다는 사실 때문에 이전에 작동했던 방법의 실패일까요? 내가 시도한 그 라인을 따라 생각 :

systemctl restart systemd-udevd.service

그리고 갑자기 내 디스크를 다시 부팅하지 않고 다시 사용할 수 있습니다 !


가장 널리 받아 들여지는 답은 불완전합니다. 현대 systemd에서는 이것이 정답입니다. 당신은 또한 그 중 하나 (또는 둘 다) 다시 시작해야 할주의 사항 systemd-udev-settle등을 systemd-udev-trigger. systemd-udevd캠프처럼 다시 시작하는 것만으로 는 충분하지 않습니다. 그러나 다른 두 개를 다시 시작하면 트릭이되었습니다!
Costin Gușă

1

다음과 같은 명령이 blockdev --rereadpt /dev/sdX실패 할 때

blockdev: ioctl error on BLKRRPART: Device or resource busy

이것은 일반적으로 일부 (오래된) 파티션이 여전히 커널에 의해 여전히 사용됨을 의미합니다.

가능한 원인 / 수정 :

  1. sdX 파티션-예 sdX1-여전히 마운트되어 있습니다-확인 mount하고 마운트 해제하십시오
  2. /dev/sdX1소프트웨어 급습의 일부입니다- cat /proc/mdstat예를 들어 관련 어레이를 확인 하고 중지하십시오.mdadm --stop /dev/md126
  3. /dev/sdX1LVM 물리 볼륨의 일부입니다. pvdisplay/로 확인 vgdisplay하고 가능하면 비활성화하십시오vgchange
  4. /dev/sdX1예를 통해 - 일부 장치 매핑의 일부입니다 cryptsetup- 확인 /dev/mapper하고 lsblk가능성이 매핑을 제거 (예를 들어 cryptsetup luksClose)
  5. 일부 udev 프로빙으로 경쟁 조건-실행중인 프로세스 확인 ps및 프로세스 종료 가능

하나의 도구가있는 경우 - 말은 blockdev --rereadpt일반적으로 유사한 같은 것 (실패 partx -uv, kpartx, partprobe,을 kpartprobe) 근본 원인이 제거 될 때까지 유사한 방법으로 실패합니다.


0

시도해 볼 수도 있습니다 :

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

(그러나 작동하지 않습니다. 아래 주석을 참조하십시오)


3
파티션 테이블을 다시 읽지 않습니다. 지오메트리 정보, 캐시 모드 등 만 업데이트합니다. SCSI IDENTIFY_DRIVE가 발행되고 있습니다.
Dmitri Chubarov

0

kpartx -a <partition> 시스템을 재부팅하는 대신 새로 생성 된 파티션에서 두 번 실행할 수 있습니다.


2
번? " sync; sync; sync" 도 실행 합니까? ☺ 미신 냄새가 난다…
Teddy

1
이 미신은 두 번째 동기화를 수행하여 동기화 여부를 확인한다는 사실에서 비롯된 것 같습니다. 두 번째 것은 운영자에게만 가치가있는 것을 제외하고는 즉시 프롬프트로 돌아가서 첫 번째 동기화가 예상대로 완료되었음을 나타냅니다. 나중에 몇 가지 블로그와 자습서를 ....
JM Becker

0

udev 서비스가 실행 중인지 확인하십시오. partprobe, hdparm, blockdev 및 기타 다양한 명령이 / dev / 디렉토리에서 사용 가능한 장치 파일을 변경하지 않는 경우에 특히 유용합니다.


0

나를 위해 partprobe또는 blockdev솔루션이 작동 하지 않았습니다 . 그러나 이것은 작동합니다.

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

-3

'man oracleasm-scandisks'에 대한 맨 페이지를 읽으면 아래 텍스트를 참고하십시오. oracleasm은 수행하는 모든 스캔의 소스로 / proc / partitions를 사용하고 있습니다. 디스크 검사를 수행하기 전에 / proc / partitions에 원시 장치가 나열되어 있어야합니다. / etc / sysconfig / oracleasm에있는 Scanorder 및 Scanexclude 매개 변수는 / proc / partitions (!!!!)에있는 이름과 관련이 있습니다.

---------- 남자 oracleasm-scandisks ------ ...

스캔 발생 방법 스캔은 네 가지 기본 단계로 진행됩니다.

   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
... 그는 사용에 대해 언급하지 않았습니다oracleasm-scandisks
voretaq7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.