mirror of https://github.com/archzfs/archzfs
parent
27bf7e595b
commit
5e6dfda31d
@ -1 +1 @@ |
|||||||
Subproject commit eba0f547c1d129d827401929bb75b09c1aeecb72 |
Subproject commit 1cce4b4a484d30cc122ebe1e34764aee0d100f08 |
@ -1 +1 @@ |
|||||||
Subproject commit e41569df2793f734111442654d952a45b317da79 |
Subproject commit 7f47b0ffa04dc6887e9a5e373c9d9266dc432f4a |
@ -1 +1 @@ |
|||||||
Subproject commit e73a9171e1d2b7e3f2b62f761f5dfc17349bfedd |
Subproject commit 77993191d671b291e78f97333e1e62bd43b72cd7 |
@ -1 +1 @@ |
|||||||
Subproject commit cb6d59fb1ddec40f7621600084827105f8abfe6a |
Subproject commit e3bfc77fdfe10a743e5c7c57f8586db16dfeaf61 |
@ -1 +1 @@ |
|||||||
Subproject commit bf1b396a48b2d71becc29d85cc8d051ca07bae4c |
Subproject commit 9dd804a2e3e94933b28830807ccc0265ea20af49 |
@ -1 +1 @@ |
|||||||
Subproject commit 0ad7394670dce0386e2a3a629b7bcbc13e57dbf7 |
Subproject commit 74f7fbfbc7eac92faec961ca136b345bea4db616 |
@ -1 +1 @@ |
|||||||
Subproject commit 2ef2188b531dc392764eb52e24b12c910996700d |
Subproject commit dc03e721968f89e3ca86bb7aeedc858950034a20 |
@ -1 +1 @@ |
|||||||
Subproject commit ddc9b7e0751b31103a6078212564db097b348b8f |
Subproject commit a50b57ce6954c207d69a92a06e1db13672f6dc75 |
@ -0,0 +1,52 @@ |
|||||||
|
========================================= |
||||||
|
Test archzfs-qemu-lts-test-01-root-bootfs |
||||||
|
========================================= |
||||||
|
|
||||||
|
Tests all the steps required for archzfs-linux-lts to be used as a boot filesystem. |
||||||
|
|
||||||
|
-------- |
||||||
|
Overview |
||||||
|
-------- |
||||||
|
|
||||||
|
Builds a custom archiso with the linux-lts kernel used by packer to create a Qemu base image. Syslinux is used as the boot |
||||||
|
loader. |
||||||
|
|
||||||
|
--- |
||||||
|
How |
||||||
|
--- |
||||||
|
|
||||||
|
1. The archzfs-linux-lts packages are built for the linux-lts kernel and added to a package repository named "archzfs-testing". |
||||||
|
|
||||||
|
#. The archzfs-testing repo is shared over NFS. |
||||||
|
|
||||||
|
#. A custom archiso is built that boots into the linux-lts kernel. See `Archiso customization`_ |
||||||
|
|
||||||
|
#. The test files are compressed into a tar archive. |
||||||
|
|
||||||
|
#. Packer is used to build a qemu base image using the custom archiso. |
||||||
|
|
||||||
|
#. `setup.sh` is ran in the archiso to install arch on ZFS. |
||||||
|
|
||||||
|
#. After installation of Arch on ZFS, the VM is rebooted and packer finalizes the base image. |
||||||
|
|
||||||
|
#. The qemu base image created by packer is booted, if the boot is successful, the test is considered passed. |
||||||
|
|
||||||
|
--------------------- |
||||||
|
Archiso customization |
||||||
|
--------------------- |
||||||
|
|
||||||
|
At the time of putting this test together (2016.09.03), there was no stable ZFSonLinux release that supported kernel 4.7 and |
||||||
|
the archiso release at the time shipped with kernel 4.7. In order to install Arch on ZFS for test, I needed an archiso with |
||||||
|
the linux-lts kernel. Thus, the archzfs-archiso was born! |
||||||
|
|
||||||
|
The archiso is built by `test.sh` and used by packer to create a Qemu base image with ZFS as the root filesystem for testing. |
||||||
|
|
||||||
|
The archiso comes with a bunch of features that are not needed in test, so they have been stripped out or modified. This |
||||||
|
includes: |
||||||
|
|
||||||
|
* boot straight into the linux-lts kernel to speed up the testing cycle. |
||||||
|
* ZFS does not support arch-i686, so it was stripped. |
||||||
|
* iPXE was not needed. |
||||||
|
|
||||||
|
The archiso sources are copied from `/usr/share/archiso/configs/releng` after installation of the "archiso" package. The |
||||||
|
modifed code is contained in the `testing/archiso-linux-lts` directory of this project. |
@ -0,0 +1,12 @@ |
|||||||
|
# We need an archiso with the lts kernel used by default |
||||||
|
test_build_archiso() { |
||||||
|
msg "Building archiso" |
||||||
|
cd ${test_root_dir}/../../../archiso/ &> /dev/null |
||||||
|
if [[ -d ${packer_work_dir}/out ]] && [[ $(ls -1 | wc -l) -gt 0 ]]; then |
||||||
|
run_cmd "rm -rf ${test_root_dir}/archiso/out/archlinux*" |
||||||
|
fi |
||||||
|
run_cmd "./build.sh -v" |
||||||
|
msg2 "Coping archiso to packer_work_dir" |
||||||
|
run_cmd "cp ${test_root_dir}/../../../archiso/out/archlinux* ${packer_work_dir} && rm -rf ${test_root_dir}/archiso/work" |
||||||
|
cd - &> /dev/null |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
test_bootloader_install() { |
||||||
|
# Setup the boot loader |
||||||
|
run_cmd "mkdir -p ${arch_target_dir}/boot/syslinux; cp -f /root/syslinux.cfg '${arch_target_dir}/boot/syslinux/syslinux.cfg'" |
||||||
|
run_cmd "arch-chroot ${arch_target_dir} /usr/bin/syslinux-install_update -i -a -m" |
||||||
|
run_cmd_check 1 |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
test_chroot_setup() { |
||||||
|
# $1 arch-chroot target dir |
||||||
|
msg "Setting up arch install..." |
||||||
|
export arch_target_dir="${test_target_dir}" |
||||||
|
if [[ -n $1 ]]; then |
||||||
|
arch_target_dir="${1}" |
||||||
|
fi |
||||||
|
msg2 "Setting base image pacman mirror" |
||||||
|
run_cmd "/usr/bin/cp /etc/pacman.d/mirrorlist ${arch_target_dir}/etc/pacman.d/mirrorlist" |
||||||
|
|
||||||
|
msg2 "generating the filesystem table" |
||||||
|
run_cmd "/usr/bin/genfstab -p ${arch_target_dir} >> '${arch_target_dir}/etc/fstab'" |
||||||
|
|
||||||
|
# http://comments.gmane.org/gmane.linux.arch.general/48739 |
||||||
|
msg2 "Adding workaround for shutdown race condition" |
||||||
|
run_cmd "/usr/bin/install --mode=0644 poweroff.timer '${arch_target_dir}/etc/systemd/system/poweroff.timer'" |
||||||
|
|
||||||
|
msg2 "Create config.sh" |
||||||
|
run_cmd "/usr/bin/install --mode=0755 /dev/null '${arch_target_dir}/usr/bin/config.sh'" |
||||||
|
|
||||||
|
# Special filesystem configure script |
||||||
|
source_safe /root/test-config.sh |
||||||
|
|
||||||
|
msg2 "Entering chroot and configuring system" |
||||||
|
run_cmd "/usr/bin/arch-chroot ${arch_target_dir} /usr/bin/config.sh" |
||||||
|
|
||||||
|
msg2 "Deleting config.sh" |
||||||
|
rm ${arch_target_dir}/usr/bin/config.sh |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
export test_root_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
||||||
|
debug "test_root_dir='${test_root_dir}'" |
||||||
|
|
||||||
|
export test_target_dir='/mnt' |
||||||
|
|
||||||
|
export test_archzfs_repo_name="archzfs-testing" |
||||||
|
|
||||||
|
# Additional packages to install in the archiso |
||||||
|
export test_archiso_packages="archzfs-linux-lts" |
||||||
|
|
||||||
|
# Additional packages to install in the archiso |
||||||
|
export test_chroot_packages="$(<packages) archzfs-linux-git" |
||||||
|
|
||||||
|
export fqdn='test.archzfs.test' |
||||||
|
export keymap='us' |
||||||
|
export language='en_US.UTF-8' |
||||||
|
export password=$(/usr/bin/openssl passwd -crypt 'azfstest') |
||||||
|
export timezone='UTC' |
@ -0,0 +1,26 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
cat <<-EOF > "${arch_target_dir}/usr/bin/config.sh" |
||||||
|
echo '${fqdn}' > /etc/hostname |
||||||
|
/usr/bin/ln -s /usr/share/zoneinfo/${timezone} /etc/localtime |
||||||
|
echo 'KEYMAP=${keymap}' > /etc/vconsole.conf |
||||||
|
/usr/bin/sed -i 's/#${language}/${language}/' /etc/locale.gen |
||||||
|
/usr/bin/locale-gen |
||||||
|
|
||||||
|
/usr/bin/sed -i 's/filesystems/zfs filesystems/' /etc/mkinitcpio.conf |
||||||
|
|
||||||
|
/usr/bin/mkinitcpio -p linux |
||||||
|
|
||||||
|
/usr/bin/usermod --password ${password} root |
||||||
|
|
||||||
|
# https://wiki.archlinux.org/index.php/Network_Configuration#Device_names |
||||||
|
/usr/bin/ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules |
||||||
|
/usr/bin/ln -s '/usr/lib/systemd/system/dhcpcd@.service' '/etc/systemd/system/multi-user.target.wants/dhcpcd@eth0.service' |
||||||
|
|
||||||
|
# Configure ssh |
||||||
|
sed -e '/^#PermitRootLogin prohibit-password$/c PermitRootLogin yes' \ |
||||||
|
-e '/^#UseDNS no$/c UseDNS no' \ |
||||||
|
-i /etc/ssh/sshd_config |
||||||
|
|
||||||
|
/usr/bin/systemctl enable sshd.service |
||||||
|
EOF |
@ -0,0 +1,85 @@ |
|||||||
|
test_fs_config_nfs() { |
||||||
|
# $1 arch-chroot directory |
||||||
|
# prefix="${test_target_dir}" |
||||||
|
if [[ -n $1 ]]; then |
||||||
|
prefix="${1}" |
||||||
|
fi |
||||||
|
|
||||||
|
msg "Create NFS mount points" |
||||||
|
run_cmd "/usr/bin/mkdir -p ${prefix}/repo" |
||||||
|
|
||||||
|
msg "Setting the package cache (nfs mount)" |
||||||
|
run_cmd "mount -t nfs4 -o rsize=32768,wsize=32768,timeo=3 10.0.2.2:/var/cache/pacman/pkg ${prefix}/var/cache/pacman/pkg" |
||||||
|
|
||||||
|
msg "Mounting the AUR package repo" |
||||||
|
run_cmd "mount -t nfs4 -o rsize=32768,wsize=32768,timeo=3 10.0.2.2:/mnt/data/pacman/repo ${prefix}/repo" |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
test_fs_config_root_preinstall() { |
||||||
|
msg "Configuring root filesystem!" |
||||||
|
|
||||||
|
export disk='/dev/vda' |
||||||
|
export root_partition="${disk}1" |
||||||
|
|
||||||
|
msg2 "Clearing partition table on ${disk}" |
||||||
|
run_cmd "sgdisk --zap ${disk}" |
||||||
|
|
||||||
|
msg2 "Destroying magic strings and signatures on ${disk}" |
||||||
|
run_cmd "dd if=/dev/zero of=${disk} bs=512 count=2048" |
||||||
|
run_cmd "wipefs --all ${disk}" |
||||||
|
|
||||||
|
# See http://www.rodsbooks.com/gdisk/sgdisk-walkthrough.html |
||||||
|
# http://www.rodsbooks.com/gdisk/sgdisk.htm |
||||||
|
msg2 "Creating boot partition on ${disk}" |
||||||
|
run_cmd "sgdisk --new=1:0:512M --typecode=1:8300 ${disk}" |
||||||
|
|
||||||
|
msg2 "Creating root partition on ${disk}" |
||||||
|
run_cmd "sgdisk --new=2:0:0 --typecode=2:bf00 ${disk}" |
||||||
|
|
||||||
|
msg2 "The disk" |
||||||
|
run_cmd "sgdisk -p ${disk}" |
||||||
|
|
||||||
|
msg2 "Creating root filesystem" |
||||||
|
run_cmd "zpool create -m ${test_target_dir} -f zroot /dev/vda2" |
||||||
|
run_cmd "zfs create -o mountpoint=none zroot/ROOT" |
||||||
|
run_cmd "zfs create -o compression=lz4 -o mountpoint=${test_target_dir}/ROOT zroot/ROOT/default" |
||||||
|
run_cmd "zfs create -o mountpoint=none zroot/data" |
||||||
|
run_cmd "zfs create -o compression=lz4 -o mountpoint=${test_target_dir}/ROOT/home zroot/data/home" |
||||||
|
run_cmd "zfs set mountpoint=legacy zroot/data/home" |
||||||
|
|
||||||
|
msg2 "Mounting /home" |
||||||
|
run_cmd "mount -t zfs -o default,noatime zroot/data/home ${test_target_dir}/ROOT/home" |
||||||
|
|
||||||
|
msg2 "Create boot directory" |
||||||
|
run_cmd "mkdir -p ${test_target_dir}/ROOT/boot" |
||||||
|
|
||||||
|
msg2 "Creating /boot filesystem (ext4)" |
||||||
|
run_cmd "mkfs.ext4 -F -m 0 -q -L boot /dev/vda1" |
||||||
|
|
||||||
|
msg2 "Mounting boot filesystem" |
||||||
|
run_cmd "mount -o noatime,errors=remount-ro /dev/vda1 ${test_target_dir}/ROOT/boot" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
test_fs_config_root_postinstall() { |
||||||
|
msg "Performing final filesystem operations" |
||||||
|
|
||||||
|
msg2 "Unmounting boot partition" |
||||||
|
run_cmd "umount ${test_target_dir}/ROOT/boot" |
||||||
|
|
||||||
|
msg2 "Unmounting nfs partitions" |
||||||
|
run_cmd "umount -a -t nfs4" |
||||||
|
|
||||||
|
msg2 "Unmounting home partition" |
||||||
|
run_cmd "umount ${test_target_dir}/ROOT/home" |
||||||
|
|
||||||
|
msg2 "Setting flags and exporting ZFS root" |
||||||
|
run_cmd "zfs umount -a" |
||||||
|
run_cmd "zpool set bootfs=zroot/ROOT/default zroot" |
||||||
|
run_cmd "zfs set mountpoint=none zroot" |
||||||
|
run_cmd "zfs set mountpoint=/ zroot/ROOT/default" |
||||||
|
run_cmd "zfs set mountpoint=/home zroot/data/home" |
||||||
|
run_cmd "zfs set mountpoint=legacy zroot/data/home" |
||||||
|
run_cmd "zpool export zroot" |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
|
||||||
|
test_setup_exit() { |
||||||
|
msg "Installation complete!" |
||||||
|
systemctl reboot |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
test_met_acceptance_criteria() { |
||||||
|
return 1 |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
# Requires the pacman cache and pacman package repos be mounted via NFS |
||||||
|
test_pacman_config() { |
||||||
|
# $1 arch-chroot target directory |
||||||
|
arch_target_dir="" |
||||||
|
arch_packages="${test_archiso_packages}" |
||||||
|
if [[ -n $1 ]]; then |
||||||
|
arch_target_dir="${1}" |
||||||
|
arch_chroot="/usr/bin/arch-chroot ${1}" |
||||||
|
fi |
||||||
|
|
||||||
|
msg "Installing archzfs repo into chroot" |
||||||
|
printf "\n%s\n%s\n" "[${test_archzfs_repo_name}]" "Server = file:///repo/\$repo/\$arch" >> ${arch_target_dir}/etc/pacman.conf |
||||||
|
|
||||||
|
msg2 "Setting up gnupg" |
||||||
|
run_cmd "${arch_chroot} dirmngr < /dev/null" |
||||||
|
|
||||||
|
msg2 "Installing the signer key" |
||||||
|
run_cmd "${arch_chroot} pacman-key -r 0EE7A126" |
||||||
|
run_cmd_check 1 |
||||||
|
|
||||||
|
run_cmd "${arch_chroot} pacman-key --lsign-key 0EE7A126" |
||||||
|
run_cmd_check 1 |
||||||
|
|
||||||
|
if [[ ! -n $1 ]]; then |
||||||
|
msg2 "Installing test packages" |
||||||
|
# Install the required packages in the image |
||||||
|
run_cmd "${arch_chroot} pacman -Sy --noconfirm ${arch_packages}" |
||||||
|
run_cmd_check 1 |
||||||
|
msg2 "Loading zfs modules" |
||||||
|
run_cmd "modprobe zfs" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
test_pacman_pacstrap() { |
||||||
|
msg "bootstrapping the base installation" |
||||||
|
run_cmd "/usr/bin/pacstrap -c '${test_target_dir}/ROOT' base base-devel ${test_chroot_packages}" |
||||||
|
run_cmd_check 1 |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
DEFAULT arch |
||||||
|
TIMEOUT 0.1 |
||||||
|
|
||||||
|
LABEL arch |
||||||
|
MENU LABEL Arch Linux |
||||||
|
LINUX ../vmlinuz-linux |
||||||
|
APPEND zfs=zroot/ROOT/default rw |
||||||
|
INITRD ../initramfs-linux.img |
Loading…
Reference in new issue