iso 디스크 이미지는 디스크의 할당되지 않은 여유 공간에 숨겨져 있다고 가정합니다. 할당되지 않은 공간에 숨겨져 있으므로 파일 시스템에서 인식하지 못합니다. 이미지의 특정 위치와 크기가 주어진다고 가정하면 이미지를 어떻게 마운트합니까?
나는 두 가지 다른 솔루션을 원합니다. 한 가지 해결책은 이미지가 저장된 디스크가 쓰기 금지되어* 있어 디스크의 파티션 테이블을 수정하거나 생성할 수 없는 상황을 위한 것입니다.
또 다른 해결책은 이미지가 저장된 디스크가 쓰기 가능하고 디스크의 처음 몇 GB에 amd64 버전 9.2.1용 데비안 설치 DVD-1 이미지의 부팅 가능한 아이소하이브리드가 있다고 가정하고 디스크의 파티션 테이블을 수정하는 것입니다.
다음은 내가 원하는 것이 아닙니다. 명령을 사용하여 dd
숨겨진 공간에서 할당된 공간으로 이미지를 복사하여 결과 중복 이미지가 파일 시스템에서 볼 수 있는 일반 파일이 되도록 한 다음 결과 이미지 파일을 마운트합니다. 이미지가 저장된 위치에서 직접 이미지를 설치하고 싶습니다.
이 문제는 다음과 같은 상황으로 인해 발생합니다. 데비안 9.2.1 설치 프로그램은 세 개의 DVD 세트에 포함되어 있습니다. DVD-1은 부팅 가능한 아이소하이브리드 이미지이므로 USB 스틱에 구우면 이미지가 USB 스틱을 부팅 가능하게 만들고 DVD를 부팅 가능하게 만듭니다. 나는 확실히 DVD보다 USB 스틱을 선호합니다. DVD-2 및 DVD-3은 일반 DVD 이미지이므로 부팅할 수 없습니다. 이러한 이미지의 크기와 현재 시중에서 판매되는 USB 스틱의 크기를 고려하면 세 개의 DVD 이미지를 모두 16GB USB 스틱에 저장하는 것이 이상적입니다.
DVD-1 3.7GiB 4GB
DVD-2 4.3GiB 4.65GB
DVD-3 4.4GiB 4.7GB
현재 USB 플래시 드라이브는 8GB, 16GB, 32GB 또는 64GB 용량으로 제공됩니다. USB 메모리 스틱은 USB 플래시 드라이브 또는 USB 메모리라고도 합니다.
dd
(또는 ) 명령을 사용하면 cp
DVD-1 이미지를 USB 스틱의 섹터 0부터 시작하여 USB 스틱에 구워야 합니다. 그러면 USB 스틱에 4GB의 파티션이 생기고 USB 스틱에 12GB가 사용되지 않은 채로 남게 됩니다. 자유 공간. USB 메모리 스틱. 이렇게 하면 dd
DVD-2와 DVD-3은 파일 시스템에서 숨겨지는 할당되지 않은 공간에 쓸 수 있습니다.
다음 bash 스크립트는 amd64용 데비안 9.2.1의 DVD 이미지 3개를 다운로드할 때 이미지를 /dev/sdb
일반적으로 USB 플래시 드라이브에 직접 굽습니다. 쓰기가 완료된 후 생성된 이미지를 읽어 sha1 및 sha256에서 체크섬을 계산합니다. 샤512. USB 스틱이 /dev/sdb
. DVD-2 및 DVD-3은 할당되지 않은 여유 공간에 저장되며 파일 시스템에 표시되지 않습니다.
경고: 이 스크립트는 장치 이름으로 디스크를 덮어쓰며 /dev/sdb
디스크의 기존 데이터는 삭제됩니다. 따라서 초보자는 실수로 중요한 데이터를 삭제하는 것을 방지하기 위해 이 스크립트를 멀리해야 합니다.
준비하다:
curl
, 이미 설치되어 있어야 합니다 dd
. openssl
( curl
다운로드하고 dd
디스크 이미지를 USB 스틱에 쓴 다음 openssl
체크섬을 계산합니다. 모든 Mac OS X에 제공됩니다. curl
일부 Linux 배포판에는 제공되지만 curl
다른 배포판에는 제공되지 않습니다. Debian 9.2.1의 경우 curl
DVD와 함께 제공됩니다. - 2. ) openssl
sha1뿐만 아니라 sha256 및 sha512도 지원해야 합니다.
USB 스틱을 마운트 해제해야 하지만 여전히 연결되어 있고 꺼내서는 안 됩니다.
장치 이름이 명령 /dev/sdb
에 전달됩니다 . dd
DVD 이미지를 구우려는 USB 스틱의 장치 이름이 올바르지 않은 경우 /dev/sdb
스크립트를 수정하여 /dev/sdb
올바른 장치 이름으로 바꾸십시오. Linux에서 부팅 디스크는 일반적으로 /dev/sda
, 데이터 디스크는 일반적으로 /dev/sdb
, /dev/sdc
, /dev/sdd
등입니다. Mac OS X에서 부팅 디스크는 일반적으로 /dev/disk0
, 데이터 디스크는 일반적으로 /dev/disk1
, /dev/disk2
, /dev/disk3
등입니다.
Linux에서 장치 이름을 찾는 parted -l
데 유용합니다 . MacOSX에서 장치 이름을 찾으려면 diskutil list
및 를 수행하십시오 Disk Utility > Info > Disk Identifier
.
이 스크립트는 dd
4K
블록 크기로 전달됩니다. 여기서 접미사 K
(킬로)는 1024바이트를 의미합니다. Mac OS X에서는 대문자 대신 dd
소문자를 사용해야 합니다 . 따라서 Mac OS X에서 이 스크립트를 실행하려면 .k
K
K
k
이 스크립트는 DVD에서 DVD 이미지를 다운로드합니다 cdimage.debian.org
. 거리가 멀면 속도가 느려질 수 있습니다. 당신에게 더 가까운 거울로 교체하고 싶을 수도 있습니다.
#!/bin/bash
par="https://cdimage.debian.org/debian-cd/9.2.1/amd64/iso-dvd/"
# par for the parent directory of the DVD images on the server.
ua='Mozilla/5.0 ()' # UserAgent string to be used by curl.
vAry=() # an array to hold the number of 4K-blocks, which is obtained
# as the file size of the DVD image divided by 4096,
# for each of the three DVD images.
# HTTP header
echo "Reading the HTTP header to obtain the file size"
for (( i = 1 ; i <= 3 ; i++ )) ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
url="$par$f"
header=$(curl -ILRA "$ua" "$url") # HTTP header
echo "$header"
nBytes=$(echo "$header" | grep -E 'Content-Length: [1-9][0-9]*' | grep -oE '[1-9][0-9]*')
# nBytes is the file size in bytes
if [[ -z $nBytes ]]; then
echo "${f}: curl failed. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
elif [[ $((nBytes%4096)) -ne 0 ]]; then
echo "${f}: nBytes is not divisible by 4096. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
fi
((nBlk=nBytes/4096)) # the number of 4K-blocks
vAry+=($nBlk)
echo "$f $nBytes $nBlk"
echo "${vAry[@]}"
printf %b '----------------------------------------\n\n\n'
done
if [[ ${#vAry[@]} -eq 0 ]] # the number of elements of the array
then
echo "The array of nBlk's is empty. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
fi
printf %b '========================================\n\n\n'
# The file sizes of DVD-1, DVD-2 and DVD-3 of Debian 9.2.1 for amd64 are
# supposed to be 3964551168, 4649189376 and 4692422656 bytes respectively,
# and the number of 4K-blocks to be 967908, 1135056 and 1145611.
# If this is the case, vAry should be (967908 1135056 1145611).
# Download
echo "Downloading to the USB stick"
unset nBlk
i=1; sk=0; for nBlk in "${vAry[@]}" ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
url="$par$f"
echo "$f $nBlk $sk"
curl -LRA "$ua" "$url" | dd bs=4K seek=$sk of=/dev/sdb ; sync
((i++))
((sk+=nBlk))
printf %b '--------------------\n\n\n'
done
printf %b '========================================\n\n\n'
# Checksum
echo "Reading from the USB stick to calculate the checksum"
i=1; sk=0; for nBlk in "${vAry[@]}" ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
echo "$f $sk $nBlk"
dd bs=4K skip=$sk count=$nBlk if=/dev/sdb | tee >(openssl sha256 | perl -pe 's/^(\(stdin\)= )?/# sha256: /' >&2) >(openssl sha1 | perl -pe 's/^(\(stdin\)= )?/# sha1: /' >&2) | openssl sha512 | perl -pe 's/^(\(stdin\)= )?/# sha512: /'
((i++))
((sk+=nBlk))
printf %b '--------------------\n\n\n'
done
스크립트가 DVD 이미지(amd64용 Debian 9.2.1)를 USB 스틱에 기록한 후 DVD-1은 바이트 0에서 시작하여 3964551168바이트를 차지하고 DVD-2는 바이트 3964551168에서 시작하여 4649189376바이트를 차지하며 DVD -3은 다음에서 시작하여 4649189376바이트를 차지합니다. 바이트 0. 8613740544 바이트 중 4692422656바이트입니다. 여기서 8613740544 = 3964551168+4649189376입니다. 세 개의 이미지가 연속적으로 저장됩니다. USB 스틱은 부팅 가능하고 DVD-1로 인식되는 반면 DVD-2 및 DVD-3은 파일 시스템에 표시되지 않습니다.
숨겨진 이미지 DVD-2 및 DVD-3을 설치하는 방법은 무엇입니까?
나는 두 가지 다른 솔루션을 원합니다.
(1) 한 가지 해결책은 USB 드라이브가 쓰기 금지*되어 디스크의 파티션 테이블을 수정하거나 생성할 수 없는 상황을 위한 것입니다.
(2) 또 다른 해결책은 DVD-2와 DVD-3이 DVD-1 파티션과 별도의 파티션으로 인식되도록 USB 스틱의 파티션 테이블을 조정하는 것입니다. 또는 두 개의 추가 파티션을 생성하는 대신 DVD-2 및 DVD-3을 수용할 수 있을 만큼 큰 DVD-1을 포함하는 파티션을 확장하고 파일 시스템이 DVD-2 및 DVD-3을 일반 iso 파일로 인식하도록 합니다.
세 이미지의 연속성이 (2)를 방해하고 이미지 사이에 파티션 헤더를 위한 공간을 남겨 두는 것이 더 낫다면 이미지 사이에 공간이 생기도록 스크립트를 수정할 수 있습니다.
* 쓰기 방지: 대부분의 USB 플래시 드라이브에는 쓰기 방지 라벨이 없습니다. 그러나 모든 SD 카드에는 쓰기 방지 라벨이 있습니다. SD 카드를 담는 USB SD 카드 리더/라이터는 USB 플래시 드라이브처럼 보이지만 실제로는 USB 플래시 드라이브로 작동하며 쓰기 방지 기능도 있습니다.
답변1
질문이 너무 길어서 끝까지 읽었다고는 할 수 없습니다.
디스크를 편집하지 않는 솔루션의 경우:
기본적으로 말씀하신 내용은 디스크 파티션 테이블에 나열되지 않은 디스크 파티션입니다.
디스크를 삽입하면 Linux는 디스크에 장치를 할당합니다 /dev
(예: ) /dev/sda
. Linux는 파티션 테이블을 읽고 각 파티션에 장치를 추가합니다 /dev/sda1/
.
실제로 자동으로 설정되지 않은 파티션을 수동으로 추가하는 것이 가능합니다. 이는 디스크의 파티션 테이블에 추가되지 않고 커널 테이블에만 추가됩니다.
addpart
방법을 찾아보세요https://linux.die.net/man/8/addpart
디스크 편집 솔루션입니다. 디스크의 올바른 위치(올바른 크기 오프셋에서 시작)에 파티션을 추가하기만 하면 됩니다. 테이블 편집을 위한 다양한 프로그램이 있습니다. 예를 들어 fdisk
. 이 이외의 다른 것을 사용하는 경우 fdisk
파티션을 생성할 때 파티션을 포맷하지 않도록 주의하세요. 이는 파티션 테이블에만 기록되며 데이터는 편집되지 않습니다.
답변2
루프 장치를 설치할 때 오프셋과 치수를 지정할 수 있습니다. 예를 들어
sudo mount -r /dev/sdb /mnt/dvd2 -o loop,offset=3964551168,sizelimit=4649189376