ostree_on_alt/rootfs_to_repo.sh

119 lines
4.0 KiB
Bash
Executable File

#!/bin/sh
set -e
if [ -z "$4" ]
then
echo "Help: $0 <rootfs archive> <directory of main ostree repository> <branch> <directory for output archives>"
echo "For example: $0 out/acos-20210824-x86_64.tar repo acos/x86_64/sisyphus out"
echo "You can change TMPDIR environment variable to set another directory where temporary files will be stored"
echo "If directory of main ostree repository doesn't exists, new repository will be created"
exit 1
fi
if [ `id -u` -ne 0 ]
then
echo "ERROR: $0 needs to be run as root (uid=0) only"
exit 1
fi
ROOTFS_ARCHIVE=$1
MAIN_REPO=$2
BRANCH=$3
OUT_DIR=$4
VAR_ARCH=$OUT_DIR/var.tar.xz
ROOT_ARCH=$OUT_DIR/acos_root.tar.xz
VERSION_DATE=`basename $ROOTFS_ARCHIVE | awk -F- '{print $2;}'`
echo "Date for version: $VERSION_DATE"
if ! [[ "$VERSION_DATE" =~ ^[0-9]{8}$ ]]
then
echo "ERROR: The name of the rootfs archive contains an incorrect date"
exit 1
fi
if [ ! -d $OUT_DIR ]
then
echo "ERROR: Directory for output archives must exist"
exit 1
fi
rm -f $VAR_ARCH $ROOT_ARCH
TMP_DIR=`mktemp --tmpdir -d rootfs_to_repo-XXXXXX`
MAIN_ROOT=$TMP_DIR/root
ACOS_ROOT=$TMP_DIR/acos_root
mkdir -p $MAIN_ROOT
tar xf $ROOTFS_ARCHIVE -C $MAIN_ROOT --exclude=./dev/tty --exclude=./dev/tty0 --exclude=./dev/console --exclude=./dev/urandom --exclude=./dev/random --exclude=./dev/full --exclude=./dev/zero --exclude=/dev/null --exclude=./dev/pts/ptmx --exclude=./dev/null
#Вынести в m-i-p
rm -f $MAIN_ROOT/etc/resolv.conf
ln -sf /run/systemd/resolve/resolv.conf $MAIN_ROOT/etc/resolv.conf
chroot $MAIN_ROOT systemctl enable ignition-firstboot-complete.service ostree-remount.service sshd docker
sed -i 's/^LABEL=ROOT\t/LABEL=boot\t/g' $MAIN_ROOT/etc/fstab
sed -i 's/^AcceptEnv /#AcceptEnv /g' $MAIN_ROOT/etc/openssh/sshd_config
sed -i 's/^# WHEEL_USERS ALL=(ALL) ALL$/WHEEL_USERS ALL=(ALL) ALL/g' $MAIN_ROOT/etc/sudoers
sed -i 's|^HOME=/home$|HOME=/var/home|g' $MAIN_ROOT/etc/default/useradd
echo "blacklist floppy" > $MAIN_ROOT/etc/modprobe.d/blacklist-floppy.conf
mkdir $MAIN_ROOT/sysroot
ln -s sysroot/ostree $MAIN_ROOT/ostree
mv -f $MAIN_ROOT/home $MAIN_ROOT/opt $MAIN_ROOT/srv $MAIN_ROOT/mnt $MAIN_ROOT/var/
mv -f $MAIN_ROOT/root $MAIN_ROOT/var/roothome
mv -f $MAIN_ROOT/usr/local $MAIN_ROOT/var/usrlocal
ln -sf var/home $MAIN_ROOT/home
ln -sf var/opt $MAIN_ROOT/opt
ln -sf var/srv $MAIN_ROOT/srv
ln -sf var/roothome $MAIN_ROOT/root
ln -sf ../var/usrlocal $MAIN_ROOT/usr/local
ln -sf var/mnt $MAIN_ROOT/mnt
chroot $MAIN_ROOT chgrp wheel /usr/bin/sudo /bin/su
chroot $MAIN_ROOT chmod 710 /usr/bin/sudo /bin/su
chroot $MAIN_ROOT chmod ug+s /usr/bin/sudo /bin/su
KERNEL=`find $MAIN_ROOT/boot/ -type f -name "vmlinuz-*"`
SHA=`sha256sum "$KERNEL" | awk '{print $1;}'`
mv "$KERNEL" "$KERNEL-$SHA"
rm -f $MAIN_ROOT/boot/vmlinuz
rm -f $MAIN_ROOT/boot/initrd*
cat <<EOF > $MAIN_ROOT/ostree.conf
d /run/ostree 0755 root root -
f /run/ostree/initramfs-mount-var 0755 root root -
EOF
chroot $MAIN_ROOT dracut --reproducible --gzip -v --no-hostonly \
-f /boot/initramfs-$SHA \
--add ignition --add ostree \
--include /ostree.conf /etc/tmpfiles.d/ostree.conf \
--include /etc/systemd/network/eth0.network /etc/systemd/network/eth0.network \
--omit-drivers=floppy --omit=nfs --omit=lvm --omit=iscsi \
--kver `ls $MAIN_ROOT/lib/modules`
rm -f $MAIN_ROOT/ostree.conf
rm -rf $MAIN_ROOT/usr/etc
mv $MAIN_ROOT/etc $MAIN_ROOT/usr/etc
tar -cJf $VAR_ARCH -C $MAIN_ROOT var
rm -rf $MAIN_ROOT/var/*
if [ ! -d $MAIN_REPO ]
then
#Создание главного ostree-репозитория
ostree init --repo=$MAIN_REPO --mode=bare
fi
ostree commit --repo=$MAIN_REPO --tree=dir=$MAIN_ROOT -b $BRANCH \
--no-xattrs --no-bindings --mode-ro-executables \
--add-metadata-string=version=sisyphus.$VERSION_DATE.0.0
mkdir $ACOS_ROOT
ostree admin init-fs --modern $ACOS_ROOT
ostree pull-local --repo $ACOS_ROOT/ostree/repo $MAIN_REPO $BRANCH
#Максимальное сжатие в многопоточном режиме
tar -cf - -C $ACOS_ROOT . | xz -9 -c -T0 - > $ROOT_ARCH
rm -rf $TMP_DIR