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

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

자동화된 프로세스에서는 .iso 파일이 생성됩니다 mkisofs. 심지어 원본 데이터가 완전히 동일하기 때문에 결과 iso 파일도 동일하지 않습니다( md5sum변경 사항). 결과적 으로 rsync --checksum"동일한 iso"가 매번 다시 전송되는 것이 마음에 들지 않습니다. 대부분 타임스탬프가 주요 차이점이 될 것으로 예상합니다.

실제로 동일한 libfaketimeISO를 생성하는 내장 스위치가 있습니까 ?mkisofs

타임스탬프만 중요한지 모르겠습니다. 결과 iso 파일을 다음과 같은 출력과 비교했습니다 xxd isofile.

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

그리고 정확히 동일한 파일에는 16바이트(대략 800바이트의 차이)를 나타내는 51줄만 있는 것 같습니다.

문제의 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

먼저 중요한 사항: 2004년 5월에 genisoimage출시된 a의 결함이 있는 변형이므로 사용하지 마십시오 mkisofs.

2007년 5월까지 데비안 관련 버그가 많이 추가되었고 그 이후로는 사라졌습니다.

여기서 알아야 할 중요한 점은 genisoimage결함이 있는 파일 시스템 이미지가 생성되어 언젠가는 OS에서 더 이상 허용되지 않을 수 있다는 것입니다.

그러나 공식은 mkisofs2006년 8월에도 데비안이 아닌 특정 버그를 적극적으로 유지 관리하고 수정했습니다. 현재 알려진 버그는 없습니다.

이제 문제가 발생합니다. -R(Rock Rigde)을 사용하고 있으며 이는 UNIX파일 메타 데이터에 타임스탬프와 같은 추가를 제공합니다. 이것이 문제 1번입니다....

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

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

원본 소스의 자주 업데이트되는 버전은 schilytools다음에서 검색할 수 있는 tarball의 일부입니다.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 RidgeUDF. 다음 위치에서 최근 매뉴얼 페이지를 참조하십시오.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

사람들은 다음으로 전환했습니다.소리소~처럼mkisofs를 피하고 싶을 수도 있습니다genisoimage는 더 이상 개발되지 않는 것 같습니다.

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

xorriso를 직접 사용하거나xorrisofs라는 mkisofs 호환 모드.

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"

관련 정보