summaryrefslogtreecommitdiff
path: root/zfssetup/stage2.sh
blob: 90e4e566f920dd6f2182c5df717f4c168632c42e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#!/usr/bin/env bash
# install arch linux on zfs root, stage two
#

set -e # halt on any error

password="welcome" # root password; will force change after login
hostname="velox"
disk=/dev/nvme0n1

yay_repo="https://aur.archlinux.org/yay.git"
source_dir="/usr/src"
logfile=/root/zfsarch_stage2.log

cd # go home

#  --------------------- Add ArchZFS Repository --------------------

pacman-key --init
pacman-key --refresh-keys
pacman-key --populate

curl --fail-early --fail -L https://archzfs.com/archzfs.gpg \
|  pacman-key -a - --gpgdir /etc/pacman.d/gnupg

pacman-key \
--lsign-key \
--gpgdir /etc/pacman.d/gnupg \
DDF7DB817396A49B2A2723F7403BD972F75D9D76

tee -a /etc/pacman.d/mirrorlist-archzfs <<- 'EOF'
## See https://github.com/archzfs/archzfs/wiki
## France
#,Server = https://archzfs.com/$repo/$arch

## Germany
#,Server = https://mirror.sum7.eu/archlinux/archzfs/$repo/$arch
#,Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/$arch

## India
#,Server = https://mirror.in.themindsmaze.com/archzfs/$repo/$arch

## United States
#,Server = https://zxcvfdsa.com/archzfs/$repo/$arch
EOF

tee -a /etc/pacman.conf <<- 'EOF'

#[archzfs-testing]
#Include = /etc/pacman.d/mirrorlist-archzfs

#,[archzfs]
#,Include = /etc/pacman.d/mirrorlist-archzfs
EOF

# this #, prefix is a workaround for ci/cd tests
# remove them
sed -i 's|#,||' /etc/pacman.d/mirrorlist-archzfs
sed -i 's|#,||' /etc/pacman.conf
sed -i 's|^#||' /etc/pacman.d/mirrorlist

#  ---------- Install Packages And Linux Compatible Kernel ---------
pacman -Sy

kernel_compatible_with_zfs="$(pacman -Si zfs-linux \
| grep 'Depends On' \
| sed "s|.*linux=||" \
| awk '{ print $1 }')"
pacman -U --noconfirm https://america.archive.pkgbuild.com/packages/l/linux/linux-"${kernel_compatible_with_zfs}"-x86_64.pkg.tar.zst

pacman -S --noconfirm zfs-linux zfs-utils

#  ---------------------- Configure Mkinitcpio ---------------------

sed -i 's|filesystems|zfs filesystems|' /etc/mkinitcpio.conf
mkinitcpio -P

#  ------------------------- General Hostid ------------------------

zgenhostid -f -o /etc/hostid

#  ---------------------- Apply Grub Workaround ----------------------
# Note: This workaround needs to be applied for every GRUB update, as the update will overwrite the changes.

echo 'export ZPOOL_VDEV_NAME_PATH=YES' >> /etc/profile.d/zpool_vdev_name_path.sh
# shellcheck disable=SC1091
. /etc/profile.d/zpool_vdev_name_path.sh

# GRUB fails to detect rpool name, hard code as "rpool"
sed -i "s|rpool=.*|rpool=rpool|"  /etc/grub.d/10_linux

#  -------------------------- Install Grub -------------------------

mkdir -p /boot/efi/archlinux/grub-bootdir/i386-pc/
mkdir -p /boot/efi/archlinux/grub-bootdir/x86_64-efi/
for i in ${DISK}; do
 grub-install --target=i386-pc --boot-directory \
     /boot/efi/archlinux/grub-bootdir/i386-pc/  "${i}"
done
grub-install --target x86_64-efi --boot-directory \
 /boot/efi/archlinux/grub-bootdir/x86_64-efi/ --efi-directory \
 /boot/efi --bootloader-id archlinux --removable
if test -d /sys/firmware/efi/efivars/; then
   grub-install --target x86_64-efi --boot-directory \
    /boot/efi/archlinux/grub-bootdir/x86_64-efi/ --efi-directory \
    /boot/efi --bootloader-id archlinux
fi

# Import both bpool and rpool at boot:
echo 'GRUB_CMDLINE_LINUX="zfs_import_dir=/dev/"' >> /etc/default/grub

# Generate GRUB menu:
mkdir -p /boot/grub
grub-mkconfig -o /boot/grub/grub.cfg
cp /boot/grub/grub.cfg \
 /boot/efi/archlinux/grub-bootdir/x86_64-efi/grub/grub.cfg
cp /boot/grub/grub.cfg \
 /boot/efi/archlinux/grub-bootdir/i386-pc/grub/grub.cfg

# For both legacy and EFI booting: mirror ESP content:
espdir=$(mktemp -d)
find /boot/efi/ -maxdepth 1 -mindepth 1 -type d -print0 \
| xargs -t -0I '{}' cp -r '{}' "${espdir}"
find "${espdir}" -maxdepth 1 -mindepth 1 -type d -print0 \
    | xargs -t -0I '{}' sh -vxc "find /boot/efis/ -maxdepth 1 -mindepth 1 -type d -print0 | xargs -t -0I '[]' cp -r '{}' '[]'"


###  ----------------------- Config Environment ---------------------

# required software
pacman -S --noconfirm sed networkmanager reflector
systemctl enable NetworkManager
systemctl enable reflector.timer

# parallel downloads
sed -i "s/^#ParallelDownloads = 5$/ParallelDownloads = 15/" /etc/pacman.conf

# aur config
sed -i '/^CFLAGS=/s/-march=x86-64 -mtune=generic/-march=native/' /etc/makepkg.conf
sed -i 's/^#RUSTFLAGS="-C opt-level=2"/RUSTFLAGS="-C opt-level=2 -C target-cpu=native"/g'  /etc/makepkg.conf
sed -i 's/^#MAKEFLAGS="-j2"/MAKEFLAGS="-j$(nproc)"/g' /etc/makepkg.conf
sed -i 's/^COMPRESSXZ=(xz -c -z -)/COMPRESSXZ=(xz -c -z --threads=0 -)/g' /etc/makepkg.conf
sed -i 's/^COMPRESSZST=(zstd -c -z -q -)/COMPRESSZST=(zstd -c -z -q --threads=0 -)/g' /etc/makepkg.conf

# set up local time
sudo ln -sf /usr/share/zoneinfo/US/Central /etc/localtime
hwclock --systohc

# set up locale
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

# set up hostname
echo "$hostname" > /etc/hostname
echo "127.0.0.1       localhost" >> /etc/hosts
echo "::1             localhost" >> /etc/hosts
echo "127.0.1.1       $hostname.localdomain $hostname" >> /etc/hosts

# console settings
echo "KEYMAP=us" > /etc/vconsole.conf

#  ------------------------ Enable AUR Helper ------------------------

pacman -Syy
pacman -S --needed --noconfirm base-devel git openssh wget
build_dir="$source_dir/yay"
mkdir -p "$build_dir"
chown "$username:$username" -R "/home/$username"
sudo -u "$username" git clone --depth 1 "$yay_repo" "$build_dir"
cd "$build_dir" && sudo -u "$username" makepkg --noconfirm -si

###  ------------------------- Enable ZFS Services ----------------------
# add kernel modules
pacman -S --noconfirm zfs-dkms

# enable zfs services
systemctl enable zfs-import-cache
systemctl enable zfs-import.target
systemctl enable zfs-mount.service
systemctl enable zfs-share
systemctl enable zfs-zed
systemctl enable zfs.target

###  ----------------------------- Wrap Up --------------------------

# set root password; must change first login
echo "root:$password" | chpasswd
chage -d 0 root

#  --------------------------- Exit Chroot ---------------------------
exit