contrib/mkimage-arch.sh
b1953bab
 #!/usr/bin/env bash
d94a027d
 # Generate a minimal filesystem for archlinux and load it into the local
 # docker as "archlinux"
 # requires root
 set -e
 
787ff552
 hash pacstrap &>/dev/null || {
e72f8161
 	echo "Could not find pacstrap. Run pacman -S arch-install-scripts"
 	exit 1
d94a027d
 }
c138c335
 
de5f3020
 hash expect &>/dev/null || {
e72f8161
 	echo "Could not find expect. Run pacman -S expect"
 	exit 1
de5f3020
 }
 
824ae856
 
9e9adf80
 export LANG="C.UTF-8"
 
287e604a
 ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/rootfs-archlinux-XXXXXXXXXX)
736bf3f7
 chmod 755 $ROOTFS
d94a027d
 
c6535d27
 # packages to ignore for space savings
9f59b057
 PKGIGNORE=(
     cryptsetup
     device-mapper
     dhcpcd
     iproute2
     jfsutils
     linux
     lvm2
     man-db
     man-pages
     mdadm
     nano
     netctl
     openresolv
     pciutils
     pcmciautils
     reiserfsprogs
     s-nail
     systemd-sysvcompat
     usbutils
     vi
     xfsprogs
 )
 IFS=','
 PKGIGNORE="${PKGIGNORE[*]}"
 unset IFS
da4ba807
 
824ae856
 case "$(uname -m)" in
 	armv*)
 		if pacman -Q archlinuxarm-keyring >/dev/null 2>&1; then
 			pacman-key --init
 			pacman-key --populate archlinuxarm
 		else
 			echo "Could not find archlinuxarm-keyring. Please, install it and run pacman-key --populate archlinuxarm"
 			exit 1
 		fi
 		PACMAN_CONF='./mkimage-archarm-pacman.conf'
 		PACMAN_MIRRORLIST='Server = http://mirror.archlinuxarm.org/$arch/$repo'
 		PACMAN_EXTRA_PKGS='archlinuxarm-keyring'
 		EXPECT_TIMEOUT=120
 		ARCH_KEYRING=archlinuxarm
 		DOCKER_IMAGE_NAME=archlinuxarm
 		;;
 	*)
 		PACMAN_CONF='./mkimage-arch-pacman.conf'
 		PACMAN_MIRRORLIST='Server = https://mirrors.kernel.org/archlinux/$repo/os/$arch'
 		PACMAN_EXTRA_PKGS=''
 		EXPECT_TIMEOUT=60
 		ARCH_KEYRING=archlinux
 		DOCKER_IMAGE_NAME=archlinux
 		;;
 esac
 
 export PACMAN_MIRRORLIST
 
de5f3020
 expect <<EOF
e72f8161
 	set send_slow {1 .1}
 	proc send {ignore arg} {
 		sleep .1
 		exp_send -s -- \$arg
 	}
824ae856
 	set timeout $EXPECT_TIMEOUT
e72f8161
 
824ae856
 	spawn pacstrap -C $PACMAN_CONF -c -d -G -i $ROOTFS base haveged $PACMAN_EXTRA_PKGS --ignore $PKGIGNORE
e72f8161
 	expect {
 		-exact "anyway? \[Y/n\] " { send -- "n\r"; exp_continue }
 		-exact "(default=all): " { send -- "\r"; exp_continue }
 		-exact "installation? \[Y/n\]" { send -- "y\r"; exp_continue }
 	}
de5f3020
 EOF
d94a027d
 
18c0b415
 arch-chroot $ROOTFS /bin/sh -c 'rm -r /usr/share/man/*'
824ae856
 arch-chroot $ROOTFS /bin/sh -c "haveged -w 1024; pacman-key --init; pkill haveged; pacman -Rs --noconfirm haveged; pacman-key --populate $ARCH_KEYRING; pkill gpg-agent"
d94a027d
 arch-chroot $ROOTFS /bin/sh -c "ln -s /usr/share/zoneinfo/UTC /etc/localtime"
da4ba807
 echo 'en_US.UTF-8 UTF-8' > $ROOTFS/etc/locale.gen
d94a027d
 arch-chroot $ROOTFS locale-gen
824ae856
 arch-chroot $ROOTFS /bin/sh -c 'echo $PACMAN_MIRRORLIST > /etc/pacman.d/mirrorlist'
d94a027d
 
 # udev doesn't work in containers, rebuild /dev
c6535d27
 DEV=$ROOTFS/dev
 rm -rf $DEV
 mkdir -p $DEV
 mknod -m 666 $DEV/null c 1 3
 mknod -m 666 $DEV/zero c 1 5
 mknod -m 666 $DEV/random c 1 8
 mknod -m 666 $DEV/urandom c 1 9
 mkdir -m 755 $DEV/pts
 mkdir -m 1777 $DEV/shm
 mknod -m 666 $DEV/tty c 5 0
 mknod -m 600 $DEV/console c 5 1
 mknod -m 666 $DEV/tty0 c 4 0
 mknod -m 666 $DEV/full c 1 7
 mknod -m 600 $DEV/initctl p
 mknod -m 666 $DEV/ptmx c 5 2
e6b794e5
 ln -sf /proc/self/fd $DEV/fd
d94a027d
 
824ae856
 tar --numeric-owner --xattrs --acls -C $ROOTFS -c . | docker import - $DOCKER_IMAGE_NAME
 docker run --rm -t $DOCKER_IMAGE_NAME echo Success.
d94a027d
 rm -rf $ROOTFS