producing parabola images now
This commit is contained in:
parent
282f805d6d
commit
ced9aa0de9
7
.gitignore
vendored
7
.gitignore
vendored
@ -2,6 +2,13 @@
|
|||||||
# image files
|
# image files
|
||||||
*.qcow2
|
*.qcow2
|
||||||
*.raw
|
*.raw
|
||||||
|
*.img
|
||||||
|
|
||||||
# tarballs
|
# tarballs
|
||||||
*.tar.*
|
*.tar.*
|
||||||
|
|
||||||
|
# build dirs
|
||||||
|
build/
|
||||||
|
|
||||||
|
# generated ssh keys
|
||||||
|
keys/*
|
||||||
|
66
create.sh
66
create.sh
@ -2,63 +2,29 @@
|
|||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# this script prepares an archlinuxarm image for use with start.sh
|
# this script prepares an armv7h parabola image for use with start.sh
|
||||||
|
|
||||||
OUTFILE=${OUTFILE:-armv7h.raw}
|
export OUTFILE=${OUTFILE:-armv7h.img}
|
||||||
SIZE=${SIZE:-64G}
|
export SIZE=${SIZE:-64G}
|
||||||
|
export ARCHTARBALL=${ARCHTARBALL:-ArchLinuxARM-armv7-latest.tar.gz}
|
||||||
_builddir=build
|
|
||||||
_outfile=$_builddir/$(basename $OUTFILE)
|
|
||||||
|
|
||||||
|
export _builddir=build
|
||||||
mkdir -p $_builddir
|
mkdir -p $_builddir
|
||||||
|
|
||||||
# create an empty image
|
export _outfile=$_builddir/$(basename $OUTFILE)
|
||||||
rm -f $_outfile
|
|
||||||
qemu-img create -f raw $_outfile $SIZE
|
|
||||||
|
|
||||||
# setup an available loop device
|
# prepare the empty image
|
||||||
_loopdev=$(losetup -f --show $_outfile)
|
./src/stage0.sh
|
||||||
|
|
||||||
# setup an error exit handler for cleanup
|
# install archlinuxarm in the empty image
|
||||||
function cleanup {
|
./src/stage1.sh
|
||||||
echo "exiting due to earlier errors..." >&2
|
|
||||||
for part in p1 p2; do
|
|
||||||
umount $_loopdev$part || true
|
|
||||||
done
|
|
||||||
losetup -d $_loopdev || true
|
|
||||||
rm -rf $_builddir/boot $_builddir/root
|
|
||||||
rm -f $_outfile
|
|
||||||
}
|
|
||||||
trap cleanup ERR
|
|
||||||
|
|
||||||
# fetch latest archlinuxarm tarball
|
# migrate the installed image to parabola
|
||||||
wget -nc http://os.archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
|
./src/stage2.sh
|
||||||
|
|
||||||
# following are the installation instructions provided on
|
# cleanup
|
||||||
# https://archlinuxarm.org/platforms/armv7/arm/versatile-express
|
chown $(logname) $_outfile
|
||||||
dd if=/dev/zero of=$_loopdev bs=1M count=8
|
|
||||||
parted -s $_loopdev \
|
|
||||||
mklabel gpt \
|
|
||||||
mkpart ESP fat32 1MiB 513MiB \
|
|
||||||
set 1 boot on \
|
|
||||||
mkpart primary ext4 513MiB 100%
|
|
||||||
mkfs.vfat -F 32 ${_loopdev}p1
|
|
||||||
mkdir -p $_builddir/boot
|
|
||||||
mount ${_loopdev}p1 $_builddir/boot
|
|
||||||
mkfs.ext4 ${_loopdev}p2
|
|
||||||
mkdir $_builddir/root
|
|
||||||
mount ${_loopdev}p2 $_builddir/root
|
|
||||||
bsdtar -vxpf ArchLinuxARM-armv7-latest.tar.gz -C $_builddir/root
|
|
||||||
sync
|
|
||||||
mv -v $_builddir/root/boot/* $_builddir/boot
|
|
||||||
cat >> $_builddir/root/etc/fstab << EOF
|
|
||||||
/dev/mmcblk0p1 /boot vfat defaults 0 0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# tie up any loose ends
|
|
||||||
for part in p1 p2; do
|
|
||||||
umount $_loopdev$part
|
|
||||||
done
|
|
||||||
losetup -d $_loopdev
|
|
||||||
mv -v $_outfile $OUTFILE
|
mv -v $_outfile $OUTFILE
|
||||||
rm -rf $_builddir
|
rm -rf $_builddir
|
||||||
|
|
||||||
|
echo "all done :)"
|
||||||
|
7
src/stage0.sh
Executable file
7
src/stage0.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# create an empty qemu image
|
||||||
|
rm -f $_outfile
|
||||||
|
qemu-img create -f raw $_outfile $SIZE
|
65
src/stage1.sh
Executable file
65
src/stage1.sh
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# setup an available loop device
|
||||||
|
_loopdev=$(losetup -f --show $_outfile)
|
||||||
|
|
||||||
|
# setup an error exit handler for cleanup
|
||||||
|
function cleanup {
|
||||||
|
echo "exiting due to earlier errors..." >&2
|
||||||
|
for part in p1 p2; do
|
||||||
|
umount $_loopdev$part || true
|
||||||
|
done
|
||||||
|
losetup -d $_loopdev || true
|
||||||
|
rm -rf $_builddir/boot $_builddir/root
|
||||||
|
rm -f $_outfile
|
||||||
|
}
|
||||||
|
trap cleanup ERR
|
||||||
|
|
||||||
|
# fetch latest archlinuxarm tarball
|
||||||
|
wget -nc http://os.archlinuxarm.org/os/$ARCHTARBALL
|
||||||
|
|
||||||
|
# the following installation instructions are taken from
|
||||||
|
# https://archlinuxarm.org/platforms/armv7/arm/versatile-express
|
||||||
|
dd if=/dev/zero of=$_loopdev bs=1M count=8
|
||||||
|
parted -s $_loopdev \
|
||||||
|
mklabel gpt \
|
||||||
|
mkpart ESP fat32 1MiB 513MiB \
|
||||||
|
set 1 boot on \
|
||||||
|
mkpart primary ext4 513MiB 100%
|
||||||
|
mkfs.vfat -F 32 ${_loopdev}p1
|
||||||
|
mkdir -p $_builddir/boot
|
||||||
|
mount ${_loopdev}p1 $_builddir/boot
|
||||||
|
mkfs.ext4 ${_loopdev}p2
|
||||||
|
mkdir $_builddir/root
|
||||||
|
mount ${_loopdev}p2 $_builddir/root
|
||||||
|
bsdtar -vxpf $ARCHTARBALL -C $_builddir/root
|
||||||
|
sync
|
||||||
|
mv -v $_builddir/root/boot/* $_builddir/boot
|
||||||
|
cat >> $_builddir/root/etc/fstab << EOF
|
||||||
|
/dev/mmcblk0p1 /boot vfat defaults 0 0
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# create and install root ssh keys for access
|
||||||
|
mkdir -p keys
|
||||||
|
test -f keys/id_rsa || ssh-keygen -N '' -f keys/id_rsa
|
||||||
|
chown $(logname) keys/id_rsa*
|
||||||
|
mkdir -m 700 $_builddir/root/root/.ssh
|
||||||
|
install -m 600 -o 0 -g 0 keys/id_rsa.pub $_builddir/root/root/.ssh/authorized_keys
|
||||||
|
|
||||||
|
# create and install ssh host keys
|
||||||
|
for cipher in dsa ecdsa ed25519 rsa; do
|
||||||
|
if [ ! -f keys/ssh_host_${cipher}_key ]; then
|
||||||
|
ssh-keygen -N '' -t ${cipher} -f keys/ssh_host_${cipher}_key
|
||||||
|
fi
|
||||||
|
install -m 600 -o 0 -g 0 keys/ssh_host_${cipher}_key $_builddir/root/etc/ssh
|
||||||
|
install -m 644 -o 0 -g 0 keys/ssh_host_${cipher}_key.pub $_builddir/root/etc/ssh
|
||||||
|
done
|
||||||
|
|
||||||
|
# tie up any loose ends
|
||||||
|
for part in p1 p2; do
|
||||||
|
umount $_loopdev$part
|
||||||
|
done
|
||||||
|
losetup -d $_loopdev
|
||||||
|
rm -rf $_builddir/boot $_builddir/root
|
98
src/stage2.sh
Executable file
98
src/stage2.sh
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
_scriptfile=$_builddir/migrate.sh
|
||||||
|
_pidfile=$_builddir/qemu.pid
|
||||||
|
|
||||||
|
_loopdev=$(sudo losetup -f --show $_outfile)
|
||||||
|
_bootdir=.boot
|
||||||
|
|
||||||
|
# register cleanup handler to stop the started VM
|
||||||
|
function cleanup {
|
||||||
|
test -f $_pidfile && (kill -9 $(cat $_pidfile) || true)
|
||||||
|
rm -f $_pidfile
|
||||||
|
umount ${_loopdev}p1
|
||||||
|
losetup -d $_loopdev
|
||||||
|
rm -rf $_bootdir
|
||||||
|
rm -f $_scriptfile
|
||||||
|
}
|
||||||
|
trap cleanup ERR
|
||||||
|
|
||||||
|
# create the migration script, adapted from
|
||||||
|
# https://wiki.parabola.nu/Migration_from_Arch_ARM
|
||||||
|
cat > $_scriptfile << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
sed -i 's/^SigLevel.*/SigLevel = Never/' /etc/pacman.conf
|
||||||
|
|
||||||
|
pacman --noconfirm -U https://www.parabola.nu/packages/libre/any/parabola-keyring/download/
|
||||||
|
pacman --noconfirm -U https://www.parabola.nu/packages/libre/any/archlinux32-keyring/download/
|
||||||
|
pacman --noconfirm -U https://www.parabola.nu/packages/core/any/archlinux-keyring/download/
|
||||||
|
pacman --noconfirm -U https://www.parabola.nu/packages/libre/any/pacman-mirrorlist/download/
|
||||||
|
pacman --noconfirm -S archlinuxarm-keyring
|
||||||
|
|
||||||
|
sed -i 's/^SigLevel.*/SigLevel = Required DatabaseOptional/' /etc/pacman.conf
|
||||||
|
|
||||||
|
pacman-key --init
|
||||||
|
pacman-key --populate archlinuxarm archlinux archlinux32 parabola
|
||||||
|
|
||||||
|
test -f /etc/pacman.d/mirrorlist.pacnew && mv /etc/pacman.d/mirrorlist{.pacnew,}
|
||||||
|
|
||||||
|
sed -i '/^\[core\]/i \
|
||||||
|
[libre] \
|
||||||
|
Include = /etc/pacman.d/mirrorlist \
|
||||||
|
' /etc/pacman.conf
|
||||||
|
sed -Ei '/^\[alarm\]|\[aur\]/,+2d' /etc/pacman.conf
|
||||||
|
|
||||||
|
yes | pacman -Scc
|
||||||
|
|
||||||
|
sed -i 's/^Architecture.*/Architecture = armv7h/' /etc/pacman.conf
|
||||||
|
|
||||||
|
pacman --noconfirm -Syy
|
||||||
|
|
||||||
|
pacman --noconfirm -S pacman
|
||||||
|
mv /etc/pacman.conf{.pacnew,}
|
||||||
|
pacman --noconfirm -Syuu
|
||||||
|
|
||||||
|
pacman --noconfirm -S your-freedom
|
||||||
|
EOF
|
||||||
|
chmod +x $_scriptfile
|
||||||
|
|
||||||
|
# start the VM
|
||||||
|
mkdir -p $_bootdir
|
||||||
|
mount ${_loopdev}p1 $_bootdir
|
||||||
|
QEMU_AUDIO_DRV=none qemu-system-arm \
|
||||||
|
-M vexpress-a9 \
|
||||||
|
-m 1G \
|
||||||
|
-dtb $_bootdir/dtbs/vexpress-v2p-ca9.dtb \
|
||||||
|
-kernel $_bootdir/zImage \
|
||||||
|
--append "root=/dev/mmcblk0p2 rw roottype=ext4 console=ttyAMA0" \
|
||||||
|
-drive if=sd,driver=raw,cache=writeback,file=$_outfile \
|
||||||
|
-display none \
|
||||||
|
-net user,hostfwd=tcp::2022-:22 \
|
||||||
|
-net nic \
|
||||||
|
-daemonize \
|
||||||
|
-pidfile $_pidfile
|
||||||
|
|
||||||
|
# wait for ssh to be up
|
||||||
|
while ! ssh -p 2022 -i keys/id_rsa root@localhost -o StrictHostKeyChecking=no true 2>/dev/null; do
|
||||||
|
echo -n . && sleep 5
|
||||||
|
done && echo
|
||||||
|
|
||||||
|
# copy and execute the migration script
|
||||||
|
scp -P 2022 -i keys/id_rsa $_scriptfile root@localhost:
|
||||||
|
ssh -p 2022 -i keys/id_rsa root@localhost "./$(basename $_scriptfile)"
|
||||||
|
|
||||||
|
# stop the VM
|
||||||
|
ssh -p 2022 -i keys/id_rsa root@localhost "nohup shutdown -h now &>/dev/null & exit"
|
||||||
|
while kill -0 $(cat $_pidfile) 2> /dev/null; do echo -n . && sleep 5; done && echo
|
||||||
|
rm -f $_pidfile
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
umount ${_loopdev}p1
|
||||||
|
losetup -d $_loopdev
|
||||||
|
rm -rf $_bootdir
|
||||||
|
rm $_scriptfile
|
50
start.sh
50
start.sh
@ -1,25 +1,59 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
IMAGE=${IMAGE:-armv7h.raw}
|
set -eu
|
||||||
|
|
||||||
_loopdev=$(sudo losetup -f --show $IMAGE)
|
|
||||||
|
_builddir=build
|
||||||
|
mkdir -p $_builddir
|
||||||
|
|
||||||
|
_imagefile=$1
|
||||||
|
_pidfile=$_builddir/qemu.pid
|
||||||
|
|
||||||
|
_loopdev=$(sudo losetup -f --show $_imagefile)
|
||||||
_bootdir=.boot
|
_bootdir=.boot
|
||||||
|
|
||||||
|
# register a cleanup error handler
|
||||||
function cleanup {
|
function cleanup {
|
||||||
|
test -f $_pidfile && (sudo kill -9 $(cat $_pidfile) || true)
|
||||||
|
rm -f $_pidfile
|
||||||
sudo umount ${_loopdev}p1
|
sudo umount ${_loopdev}p1
|
||||||
sudo losetup -d $_loopdev
|
sudo losetup -d $_loopdev
|
||||||
rm -rf $_bootdir
|
rm -rf $_bootdir
|
||||||
}
|
}
|
||||||
trap cleanup EXIT
|
trap cleanup ERR
|
||||||
|
|
||||||
|
# start the VM
|
||||||
mkdir -p $_bootdir
|
mkdir -p $_bootdir
|
||||||
sudo mount ${_loopdev}p1 $_bootdir
|
sudo mount ${_loopdev}p1 $_bootdir
|
||||||
|
QEMU_AUDIO_DRV=none qemu-system-arm \
|
||||||
qemu-system-arm \
|
|
||||||
-M vexpress-a9 \
|
-M vexpress-a9 \
|
||||||
|
-m 1G \
|
||||||
-dtb $_bootdir/dtbs/vexpress-v2p-ca9.dtb \
|
-dtb $_bootdir/dtbs/vexpress-v2p-ca9.dtb \
|
||||||
-kernel $_bootdir/zImage \
|
-kernel $_bootdir/zImage \
|
||||||
--append "root=/dev/mmcblk0p2 rw roottype=ext4 console=ttyAMA0" \
|
--append "root=/dev/mmcblk0p2 rw roottype=ext4 console=ttyAMA0" \
|
||||||
-drive if=sd,driver=raw,cache=writeback,file=$IMAGE \
|
-drive if=sd,driver=raw,cache=writeback,file=$_imagefile \
|
||||||
--nographic \
|
-display none \
|
||||||
-snapshot
|
-net user,hostfwd=tcp::2022-:22 \
|
||||||
|
-net nic \
|
||||||
|
-daemonize \
|
||||||
|
-snapshot \
|
||||||
|
-pidfile $_pidfile
|
||||||
|
|
||||||
|
# wait for ssh to be up
|
||||||
|
_sshopts="-o StrictHostKeyChecking=no -o ConnectTimeout=5"
|
||||||
|
while ! ssh -p 2022 -i keys/id_rsa root@localhost $_sshopts true 2>/dev/null; do
|
||||||
|
echo -n . && sleep 5
|
||||||
|
done && echo
|
||||||
|
|
||||||
|
# open a session
|
||||||
|
ssh -p 2022 -i keys/id_rsa root@localhost
|
||||||
|
|
||||||
|
# shutdown the VM
|
||||||
|
ssh -p 2022 -i keys/id_rsa root@localhost "nohup shutdown -h now &>/dev/null & exit"
|
||||||
|
while sudo kill -0 $(cat $_pidfile) 2> /dev/null; do echo -n . && sleep 5; done && echo
|
||||||
|
rm -f $_pidfile
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
sudo umount ${_loopdev}p1
|
||||||
|
sudo losetup -d $_loopdev
|
||||||
|
rm -rf $_bootdir
|
||||||
|
Loading…
Reference in New Issue
Block a user