Files
UniXNU/scripts
smeng9andClaude Opus 5.5 0f85bc2378 feat(userdata): build the userdata image on Linux
The userdata step read each IPSW disk image through macOS hdiutil, so it
stopped on Linux with "hdiutil not found on PATH". It only needs the raw
disk bytes, so on hosts other than macOS it now decodes them with
scripts/unixnu/udif.py.

udif.py reads the koly trailer and the blkx (mish) tables of a UDIF
image and yields the disk in sector order: raw chunks are copied,
zero-fill and ignored chunks read as zeros, and zlib, bzip2 and LZFSE
chunks are decompressed (LZFSE with the lzfse tool the Linux toolchain
installs). It refuses gaps, unsupported chunk types and chunks that do
not decode to their size. A file without a koly trailer is a raw image
and is copied: the SystemOS cryptex is one, while the OS image is UDIF
with LZFSE chunks. test_udif.py checks this with synthetic images.

The window layout, hashes, SHNGROOT manifest and report are unchanged,
and macOS keeps hdiutil. For iPadOS 17.7.11 (21H461) the image built on
Linux and the one built on macOS from the same disk images are byte
for byte identical (9382658048 bytes, sha256 fd43ee7035ce185c...), as
are the window hashes (OS e5634d04..., SystemOS b4908cde...).

The lzfse lookup that ipsw.py had for the kernelcache moves to util.py,
which both use. The Linux notice now names --skip-setup and
seed-data-grow as the steps that need macOS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 07:02:39 +08:00
..
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00
2026-10-19 18:49:31 +08:00