저는 거대하고 복잡한 애플리케이션을 개발 중입니다. 디스크를 연결하고 버튼을 누르면 디스크를 분할 및 포맷하고 마운트하고 일부 파일을 복사합니다.
이 애플리케이션을 테스트하기 위해 디스크 이미지 마운트를 반복하고 동일한 프로세스를 실행하는 테스트 시스템이 있습니다. 애플리케이션 로직을 변경한 것을 제외하면 이제 테스트 시스템이 작동하지 않습니다. 프로그램을 주면진짜디스크, 다 괜찮아요. 그러나 루프 장치를 제공하면 실패합니다.
특히 응용 프로그램은 디스크를 분할하고 포맷한 다음 파티션을 탑재할 수 없다고 불평합니다. 정확한 명령어는
mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
( 여기서는 /dev/vda
단지 심볼릭 링크일 뿐입니다 /dev/loop0
. 직접 인용해도 아무런 차이가 없습니다 loop0
.)
명령을 수동으로 실행하면 다음과 같은 결과가 나타납니다.
root# mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
FUSE exfat 1.0.1
ERROR: exFAT file system is not found.
root# echo $?
1
이 명령을 계속해서 실행할 수 있지만 작동하지 않습니다. 이유도 없고 그냥 이유도 없습니다.
무서운 부분은 다음과 같습니다. 실행 cfdisk /dev/vda
한 다음 아무런 변경 사항도 적용하지 않고 즉시 종료하면이제 설치되었습니다!
무엇인가요지옥cfdisk
디스크가 갑자기 작동하기 시작합니까? 이 프로그램을 호출할 필요를 없애려면 어떻게 해야 합니까?
(나는 그것을 호출하려고 했지만 헛수고였습니다 sfdisk -R /dev/vda
. 단지 "잘못된 인수" 같은 것에 대해 불평했을 뿐입니다.)
전화를 걸거나 다른 일을 하기 위해 앱을 엮을 수도 있지만 cfdisk -Ps /dev/vda
실제로는 그렇게 하고 싶지 않습니다. 나는 알고 싶다왜이것들은 필요합니다. 애플리케이션을 변경하기 전까지는 모든 것이 잘 작동했습니다.
답변1
어둠 속에서 찌르는 것이지만 cfdisk
런타임에 커널 파티션 테이블을 업데이트할 수도 있습니까?
귀하의 애플리케이션 로직이 루프 장치와 호환됩니까?
디스크 이미지 파일을 포맷하고 필요한 파티션을 생성합니다.
-P
커널 파티션 테이블을 업데이트하는 옵션으로 루프백 장치를 설정합니다.losetup -P /dev/loop0 <image file>
마운트 파티션:
mount /dev/loop0p1 /mnt
이렇게 하면 오프셋에 대해 걱정할 필요가 없으며 mount
명령이 실제 디스크에서 사용하는 명령과 더 가까워집니다. 2와 3 사이에 다른 단계를 추가하여 심볼릭 링크를 만들 수도 있습니다.
답변2
커널은 먼저 분할을 이해해야 합니다. 루프 장치(예 /dev/loop0
: )를 분할한 후에는 실제로 마운트할 수 없습니다(분할은 분명히 장치 시작 부분에서 시작되지 않습니다). 물리적 드라이브의 경우 (적어도 (S)ATA 드라이브에서) 파티션 테이블을 다시 읽도록 커널에 지시할 수 있습니다 hdparm -z
.
또 다른 옵션은 장치에서 파티션 테이블(반드시 GPT 또는 MBR일 필요는 없음)을 검색하고 파티션 장치 파일을 생성하는 특수 유틸리티를 사용하는 것입니다. 그 중 하나는 partx
(util-linux와 함께 제공됨)입니다.
답변3
테스트 프레임워크를 약간 변경했더니 문제가 사라졌습니다.
kpartx -u /dev/vda
특히 장치를 다시 분할한 후에는 전화를 걸지 않지만 kpartx -d
이제 kpartx -a
모든 것이 정상입니다. 이상한...