add devbyid dependency
[automated-distro-installer] / arch-init
1 #!/bin/bash -x
2 # Copyright (C) 2016 Ian Kelling
3
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 set -eE -o pipefail
19 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
20
21 cd $(dirname $(readlink -f "$BASH_SOURCE"))
22
23 export HOSTNAME="$1"
24 mirror=$2
25 TPPASS="$(cat /root/shadow/traci-simple)"
26
27 (( $# >= 1 )) || { echo "$0: error: need 1 or 2 arguments"; exit 1; }
28
29 mv /root/devbyid /usr/bin
30
31 rm -f /etc/pacman.d/mirrorlist
32 # https://wiki.archlinux.org/index.php/Mirrors#Sorting_mirrors
33
34 if [[ $mirror ]]; then
35 echo "Server = $mirror" >> /etc/pacman.d/mirrorlist
36 fi
37 curl -s 'https://www.archlinux.org/mirrorlist/?country=US&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on' |
38 sed -r 's/^[ #]*(Server *=)/\1/' >> /etc/pacman.d/mirrorlist
39
40 . /a/bin/fai/fai-wrapper
41 export LUKS_DIR=/root/luks
42 export DISTRO=arch
43 partition_script=/a/bin/fai/fai/config/hooks/partition.DEFAULT
44 chmod +x $partition_script
45
46 export PARTITION_PROMPT=true
47
48 # to be idempotent if we fail after partitioning
49 already_partitioned=true
50 mount_out=$(mount)
51 for dir in /mnt{,/home,/boot,/q}; do
52 regex=" on $dir "
53 if [[ ! $mount_out =~ $regex ]]; then
54 already_partitioned=false
55 break
56 fi
57 done
58
59 if ! $already_partitioned; then
60 /a/bin/fai/fai/config/hooks/partition.DEFAULT
61 fi
62
63 . /tmp/fai/disk_var.sh
64
65
66 # arch doesn't need crypttab entries for initramfs crypt partititions
67 export rootn=1
68 export bootn=3
69 export swapn=2
70 export BOOT_DEVICE
71 export ROOT_PARTITIONS
72 sed -ri --follow-symlinks "/^crypt_dev_\S+$rootn /d" /tmp/fai/crypttab
73
74 if ! $already_partitioned; then
75 mount -o subvol=root_$DISTRO $ROOT_PARTITION /mnt
76 mkdir -p /mnt/{q,home,boot}
77 mount -o subvol=q $ROOT_PARTITION /mnt/q
78 mount -o subvol=boot_$DISTRO $BOOT_PARTITION /mnt/boot
79 fi
80
81 # https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Keyfiles
82 cp /root/luks/host-$HOSTNAME /mnt/crypto_keyfile.bin
83 chmod 600 /mnt/crypto_keyfile.bin
84
85
86 if [[ $mirror ]]; then
87 echo "$0: 404 errors about core.db etc are normal,
88 they will succeed using the secodary mirror"
89 fi
90 pacstrap /mnt base
91 cp /tmp/fai/{fstab,crypttab} /mnt/etc
92 cp /a/bin/fai/encrypt /mnt/usr/lib/initcpio/hooks
93 # not needed anymore
94 #cp /usr/bin/devbyid /mnt/root
95
96 cp -r /root/.ssh /mnt/root
97
98 bindmount() {
99 local mountpoint=$2
100 local source=$1
101 mkdir -p $mountpoint
102 mount -o bind $source $mountpoint
103 }
104 bindmount /a /mnt/a
105 bindmount /root/shadow /mnt/q/root/shadow
106
107 mkdir -p /mnt/etc/ssh
108 cp /etc/ssh/ssh_host_* /mnt/etc/ssh
109
110 cp /a/bin/fai/arch-init-chroot /mnt/root
111 # for manual commands, arch-chroot /mnt bash
112 arch-chroot /mnt /root/arch-init-chroot
113
114 # this gets mounted in chroot so we have to do it outside
115 rm -f /mnt/etc/resolv.conf
116 ln -s /run/systemd/resolve/resolv.conf /mnt/etc/resolv.conf
117
118 # not necsesary, but makes reboot go fast.
119 umount -R /mnt; sleep 1
120
121 # causes 255 exit code, so doing this from the caller script.
122 # reboot now