Convert Raspian Images to lvm + xfs and installs some usefull defaults.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

132 lines
3.2 KiB

#!/usr/bin/env bash
die() {
>&2 printf '\e[1;31mdied: '"$*"'\e[0m\n'
all_umounts
exit 1
}
l() {
>&2 printf '\e[1m'"$*"'\e[0m\n'
}
d() {
>&2 printf '\e[1;34m# '"$*"'\e[0m\n'
"$@" || die "$*"
}
baseimg="$1"
unpack_zip() {
zip -p "$1" > "$2"
}
unzip_xz() {
xz -d < "$1" > "$2"
}
unpack_bzip2() {
bzip2 -d < "$1" > "$2"
}
unpack_gzip() {
gzip -d < "$1" > "$2"
}
unpack_plain() {
ln -sf "$1" "$2"
}
all_umounts() {
umount base/root
umount base/boot
umount dest/root
umount dest/boot
vgchange -an raspi
kpartx -d dest/image
kpartx -d base/image
}
pii_mounts() {
local dir="${1:-murks}"
local img="${2:-$dir/image}"
set -- `kpartx -l "$img" | sed -e 's/ : .*//'`
local bootdev="/dev/mapper/$1"
local rootdev="/dev/mapper/$2"
[ -e "$bootdev" -a -e "$rootdev" ] || die "Cannot find devs [$bootdev] [$rootdev]"
d mount "$bootdev" "$dir/boot"
d mount "$rootdev" "$dir/root"
}
pii_mkfs() {
local img="${1:-murks}"
set -- `kpartx -l "$img" | sed -e 's/ : .*//'`
local bootdev="/dev/mapper/$1"
local rootdev="/dev/mapper/$2"
[ -e "$bootdev" -a -e "$rootdev" ] || die "Cannot find devs [$bootdev] [$rootdev]"
l format destination-boot
d mkfs.fat -n boot -F 32 "$bootdev"
l format destination-root
d mkfs.xfs -L root "$rootdev"
}
case "$baseimg" in
*.zip) alias unpack=d\ unpack_zip ;;
*.xz) alias unpack=d\ unpack_xz ;;
*.bz2) alias unpack=d\ unpack_bz2 ;;
*.gz) alias unpack=d\ unpack_gz ;;
*) alias unpack=d\ unpack_plain ;;
esac
# let's go...
d mkdir -p base/root base/boot dest/root dest/boot
l setup base-image-access
#[ -e base/image ] && die "base/image already exists"
#unpack "$baseimg" base/image
d kpartx -sar base/image
l mount base-partitions
pii_mounts base
l create destination image
d dd if=/dev/zero of=dest/image seek=$((4800*256-1)) count=1 bs=4096
d parted dest/image -- \
mklabel msdos \
mkpart primary fat32 4MB 132MB \
mkpart primary lvm 133MB -1s \
set 2 lba off \
print
d kpartx -sa dest/image
pii_mkfs dest/image
d parted dest/image print
l mount destination-partitions
pii_mounts dest
l install it
d rsync -aHAX base/boot/ dest/boot/
d rsync -aHAX base/root/ dest/root/
d rsync kernel7.img initrd7.img dest/boot
if grep -q '^initramfs ' dest/boot/config.txt
then
d sed -i -e 's!^initramfs .*!initramfs initrd7.img followkernel!' dest/boot/config.txt
else
l "# echo initramfs initrd7.img followkernel >> dest/boot/config.txt"
echo initramfs initrd7.img followkernel >> dest/boot/config.txt || die "echo initramfs initrd7.img followkernel >> dest/boot/config.txt"
fi
d sed -i -e 's!\<root=[^ ]*!root=/dev/raspi/root!;s!\<rootfstype=[^ ]*!rootfstype=xfs!;s!\<init=[^ ]* *!!' dest/boot/cmdline.txt
d touch dest/boot/ssh
l setup initramfs for updates in future
d sed -i -e 's!^COMPRESS=!COMPRESS=xz!' dest/root/etc/initramfs-tools/initramfs.conf
l deactivate resize2fs-init-script
d rm dest/root/etc/rc*.d/*resize2fs_once
l change user pi to deac
d sed -i -e 's!^pi:.*!deac:x:1000:1000:Denis Knauf,,,:/home/deac:/bin/bash!' dest/root/etc/passwd
d sed -i -e 's!^pi:.*!deac:$6$aZRhIfbP$6ELyvhfjXP2wiIuq5gIsDPFXFWM1E8KwGhKFWKtFwJZ8CLwHXmZECzpxslwLbvgtYCScTZBJBTjp.hVjd6.2l1:16958:0:99999:7:::!' dest/root/etc/shadow
d sed -i -e 's!\<pi\>!deac!' dest/root/etc/group
d mv dest/root/home/pi dest/root/home/deac
all_umounts