mkisofs/genisoimage를 사용하여 복사 가능한 iso 파일을 만드는 방법은 무엇입니까?

mkisofs/genisoimage를 사용하여 복사 가능한 iso 파일을 만드는 방법은 무엇입니까?

자동화 프로세스 중에 .iso 파일을 사용하여 ISO 파일이 생성됩니다 mkisofs. 심지어 원본 데이터가 완전히 동일하기 때문에 결과 iso 파일도 다릅니다( md5sum변경 사항). 내 결과 때문에 rsync --checksum매번 "동일한 ISO"를 재전송하는 것을 좋아하지 않습니다. 타임 스탬프가 주요 차이점이 될 것으로 예상했습니다.

동일한 방식으로 iso를 생성할 수 있는 내장 스위치가 있습니까 libfaketime?mkisofs

타임스탬프만 중요한지 궁금합니다. 생성된 iso 파일을 아래와 같이 출력과 xxd isofile비교했습니다 .

diff --side-by-side  --suppress-common-lines <(xxd a.iso) <(xxd b.iso )

동일한 파일에는 16바이트를 나타내는 줄이 51개만 있는 것으로 보입니다(약 800바이트 차이).

iso를 생성하는 데 사용되는 명령은 대략 다음과 같습니다.

genisoimage -o "file.iso" -b isolinux/isolinux.bin \
    -c isolinux/boot.cat -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -J -R -v -T -V 'CDLABEL' "datadir/"

rsyncBS: 내 경우 약 800바이트만 동시에 재전송되는 것을 방지하기 위해 약 1MB의 큰 파일 블록을 체크섬하는 명령줄 인수 스위치가 누락되었나요 ?

답변1

genisoimage첫 번째 중요한 참고 사항: 이 제품은 2004년 5월에 출시된 변형이므로 사용하지 마십시오 mkisofs.

2007년 5월 현재 데비안 특유의 버그가 대거 추가됐고 이후 사라졌다.

여기서 알아야 할 중요한 점은 genisoimage결함이 있는 파일 시스템 이미지 생성이 때때로 운영 체제에서 더 이상 허용되지 않을 수 있다는 것입니다.

그러나 mkisofs여전히 활발하게 유지관리되고 있으며 데비안에 국한되지 않은 수많은 버그가 2006년 8월에 수정되었습니다. 현재 알려진 버그가 없습니다.

이제 문제를 해결하려면 UNIX파일 메타데이터에 타임스탬프를 추가하는 -R(Rock Rigde)을 사용하고 있습니다. 질문 1 입니다....

또 다른 문제는 ISO-9660 파일 시스템 수퍼블록(공식적으로는 Primary_descriptor라고 함)에 생성 날짜와 수정 날짜가 포함되어 있다는 것입니다. 후자는 옵션을 통해 제어할 수 있습니다 -modification-date.

이것이 정말로 필요한 기능이라고 생각한다면 생성 날짜에 대해 비슷한 옵션을 추가할 수 있습니다. 그러나 마지막 읽기 액세스 시간이 아닌 파일 수정 날짜를 사용하도록 Rock Ridge 형식 지정 섹션에 지시하는 옵션이 여전히 필요합니다.

자주 업데이트되는 원본 소스 버전은 schilytoolstarball의 일부이며 다음에서 검색할 수 있습니다.http://sourceforge.net/projects/schilytools/files/

최신 schilytools tarball에는 이제 복사 가능한 ISO-9660 파일 시스템 이미지에 대한 지원이 도입되었습니다. schily-2020-03-27.tar.bz2를 획득/컴파일/설치하세요.

몇 가지 새로운 옵션이 있습니다:

  • -noatimemkisofs수정된 시간을 atime으로 아카이브하도록 지시합니다 .

  • -creation-datePVD에서 생성 날짜 설정

  • -expiration-datePVD에서 만료일 설정

  • -effective-datePVD에서 유효일 설정

  • -reproducible-date-effective-date및 추가를 제외한 모든 시간을 설정합니다 -noatime.

이는 일반 ISO-9660 파일 시스템 이미지와 Rock Ridge및 가 포함된 이미지 에 적용됩니다 UDF. 가장 최근 매뉴얼 페이지를 참조하십시오:http://schilytools.sourceforge.net/man/man8/mkisofs.8.html

업데이트된 명령줄은 다음과 같습니다.

mkisofs -b isolinux/isolinux.bin \
  -c isolinux/boot.cat -no-emul-boot \
  -boot-load-size 4 -boot-info-table \
  -J -R -v -T -V 'CDLABEL' \
  -reproducible-date=20200327 "datadir/" > file.iso

답변2

사람들은 전환하다소리조~처럼사람들은 mkisof를 피하고 싶어할 수도 있습니다.genisoimage는 더 이상 개발되지 않는 것 같습니다.

xorriso 출력을 재현 가능하게 만들려면 SOURCE_DATE_EPOCH라는 환경 변수를 1970년 1월 1일 이후의 초 수와 동일한 값으로 설정하십시오.

xorriso 또는 해당 제품을 직접 사용할 수 있습니다.mkisofs 호환 모드는 xorrisofs라고 합니다..

SOURCE_DATE_EPOCH=0 xorrisofs YOUR-MKISOFS-ARGS

답변3

제공된 답변은 저에게 효과적이지 않았지만 일부 친구의 도움으로 xorriso를 사용하여 임의 폴더에서 복사 가능한 ISO 이미지를 만드는 방법을 찾았습니다.

날짜는 환경 변수로 내보내야 합니다. 파일 권한은 사람마다 다를 수 있으므로 우리는 그들에게 뭔가를 하도록 강요합니다. preparer_id기본적으로 xorriso의 전체 이름과 버전이 포함되어 있기 때문에 다릅니다. uid/는 gid시스템마다 다를 수도 있습니다.

이 스크립트는 폴더 경로를 시작 매개변수 또는 프롬프트 입력으로 받아들입니다. 아직 OS 이미지 생성을 시도하지 않았습니다.

export SOURCE_DATE_EPOCH="$(date -d20010101 -u +%s)"
output_filename=result.iso
file_mode=0444

folder="$1"
while [ ! -d "$folder" ]; do
    [ -z "$folder" ] || printf "'%s' not a directory?\n" "$folder"
    read -p "Enter path to dir containing files to pack: " folder
done
list="$(mktemp)"
(cd "$folder"; for f in *; do printf "%s\n" "$f=$PWD/$f"; done) \
    | LC_ALL=C sort >"$list"

xorriso \
    -preparer_id xorriso \
    -volume_date 'all_file_dates' "=$SOURCE_DATE_EPOCH" \
    -as mkisofs \
    -iso-level 3 \
    -graft-points \
    -full-iso9660-filenames \
    -joliet \
    -file-mode $file_mode \
    -uid 0 \
    -gid 0 \
    -path-list "$list" \
    -output "$output_filename"

rm -f "$list"

관련 정보