User:Quozl/Remastering

From OLPC
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Remastering a .zd file without having to make a build. Useful for XO-1.75 when no ARM build machinery is on your side of a slow pipe.

The script takes as input a .zd file, extracts the disk image, mounts the two filesystems, makes changes, then converts the result back to a .zd file.

#!/bin/bash
set -evx

# the build number to use as input
n=12

BUILD=$(printf %02d $n)
BUILD_AS_PATH=$(printf %d $n)

INPUT=210${BUILD}o2.zd
IMAGE=210${BUILD}o2.img
FINAL=fs.zd

if [[ ! -e $INPUT ]]; then
    echo no build
    exit 1
fi

# convert the .zd file into a disk image
zdextract < $INPUT > $IMAGE

# build a random fill pattern for later use
dd if=/dev/urandom of=$IMAGE.fill bs=4096 count=1 2>/dev/null

# grab the offsets from the partition table
P1=$(parted -m $IMAGE "unit B print"|grep '^1'|cut -f2 -d:|sed 's/B//g')
P2=$(parted -m $IMAGE "unit B print"|grep '^2'|cut -f2 -d:|sed 's/B//g')

# connect the partitions to loopback block devices
L1=$(losetup --show --find --offset $P1 $IMAGE)
L2=$(losetup --show --find --offset $P2 $IMAGE)

# mount the two filesystems
mkdir -p /mnt/root /mnt/boot
mount $L2 /mnt/root
mount $L1 /mnt/boot
ROOT=/mnt/root/versions/run/$BUILD_AS_PATH/
USER=/mnt/root/home/olpc/

# turn off runin fscheck, it will fail once we change things
touch $ROOT/runin/soiled

# provide local kernel
# rsync -av /tmp/xo/bootpart/boot/* /mnt/boot/boot/
# rsync -av /tmp/xo/lib/modules ${ROOT}/lib/

# force initial runin
# touch $ROOT/runin/quick

# open to your key
SSH_CONFIG=/mnt/root/home/root/.ssh
mkdir --mode=g-rwx,o-rwx $SSH_CONFIG
cat << EOF > $SSH_CONFIG/authorized_keys
(put your key here)
EOF
chmod o-rwx,g-rwx $SSH_CONFIG/authorized_keys

# save some space and therefore compression and fs-update time
# rm -rf $USER/Activities/Wikipedia*
# rm -rf $USER/Activities/Scratch*
# rm -rf $USER/Library/*

# enable sshd on start
cat <<EOF > $ROOT/etc/rc.local
#!/bin/sh
touch /var/lock/subsys/local
if [[ ! -f /etc/rc.local.quozl ]]; then
    service sshd start
    chkconfig sshd on
    touch /etc/rc.local.quozl
fi
EOF
chmod +x $ROOT/etc/rc.local

# associate to local wireless
mkdir -p $USER/.sugar/default/nm/
chown -R 500:500 $USER/.sugar
cat <<EOF > $USER/.sugar/default/nm/connections.cfg
[Auto qz]
type = 802-11-wireless
ssid = qz
uuid = 757dc7687efb4e7250f4eb6697568482ae948526
autoconnect = True
timestamp = 1321510400

EOF

# dismount the filesystem
umount /mnt/boot
umount /mnt/root
rmdir /mnt/root /mnt/boot

# fill the free blocks, to ensure sparse output
fill-free-blocks -v $L1 $IMAGE.fill
fill-free-blocks -v $L2 $IMAGE.fill

# discard the loopback
until losetup -d $L1; do sleep 0.1; done
until losetup -d $L2; do sleep 0.1; done

# compress back to .zd format
zhashfs 0x20000 sha256 $IMAGE fs.zsp fs.zd