mirror of
https://github.com/bin456789/reinstall.git
synced 2026-10-04 22:47:45 +08:00
@@ -117,6 +117,16 @@ show_url_in_args() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
killall() {
|
||||||
|
# killall 是异步的,要等一下
|
||||||
|
local ret=0
|
||||||
|
if ! command killall "$@"; then
|
||||||
|
ret=$?
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
|
||||||
# 在没有设置 set +o pipefail 的情况下,限制下载大小:
|
# 在没有设置 set +o pipefail 的情况下,限制下载大小:
|
||||||
# retry 5 command wget | head -c 1048576 会触发 retry,下载 5 次
|
# retry 5 command wget | head -c 1048576 会触发 retry,下载 5 次
|
||||||
# command wget "$@" --tries=5 | head -c 1048576 不会触发 wget 自带的 retry,只下载 1 次
|
# command wget "$@" --tries=5 | head -c 1048576 不会触发 wget 自带的 retry,只下载 1 次
|
||||||
@@ -214,6 +224,34 @@ create_alpine_rootfs() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
create_alpine_rootfs_with_arch_install_scripts() {
|
||||||
|
local os_dir=$1
|
||||||
|
local init_now=${2:-false}
|
||||||
|
local parent_os_dir=$3
|
||||||
|
|
||||||
|
create_alpine_rootfs "$os_dir" $init_now
|
||||||
|
|
||||||
|
# 将 alpine-base 的依赖写入 world,再删除 alpine-base alpine-conf
|
||||||
|
# --installed --depends 顺序不能错
|
||||||
|
# 不添加 --installed 则会同时显示已安装的和最新版的
|
||||||
|
alpine_base_depends=$(chroot "$os_dir" apk info --installed --depends alpine-base | sed '/depends on:/d')
|
||||||
|
chroot "$os_dir" apk add $alpine_base_depends
|
||||||
|
chroot "$os_dir" apk del alpine-base alpine-conf
|
||||||
|
chroot "$os_dir" apk add arch-install-scripts
|
||||||
|
|
||||||
|
if [ -n "$parent_os_dir" ]; then
|
||||||
|
mkdir -p "$os_dir/parent"
|
||||||
|
mount --rbind "$parent_os_dir" "$os_dir/parent"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_alpine_rootfs() {
|
||||||
|
local os_dir=$1
|
||||||
|
|
||||||
|
umount_pseudo_fs "$os_dir"
|
||||||
|
rm -rf "$os_dir"
|
||||||
|
}
|
||||||
|
|
||||||
download_via_browser() {
|
download_via_browser() {
|
||||||
local url=$1
|
local url=$1
|
||||||
local path=$2
|
local path=$2
|
||||||
@@ -242,8 +280,7 @@ download_via_browser() {
|
|||||||
cp "$os_dir/work/download_file" "$path"
|
cp "$os_dir/work/download_file" "$path"
|
||||||
|
|
||||||
# 清理
|
# 清理
|
||||||
umount_pseudo_fs "$os_dir"
|
remove_alpine_rootfs "$os_dir"
|
||||||
rm -rf "$os_dir"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
download() {
|
download() {
|
||||||
@@ -380,7 +417,7 @@ setup_websocketd() {
|
|||||||
wget $confhome/logviewer.html -O /tmp/index.html
|
wget $confhome/logviewer.html -O /tmp/index.html
|
||||||
apk add coreutils
|
apk add coreutils
|
||||||
|
|
||||||
pkill websocketd || true
|
killall -q websocketd || true
|
||||||
# websocketd 遇到 \n 才推送,因此要转换 \r 为 \n
|
# websocketd 遇到 \n 才推送,因此要转换 \r 为 \n
|
||||||
websocketd --port "$web_port" --loglevel=fatal --staticdir=/tmp \
|
websocketd --port "$web_port" --loglevel=fatal --staticdir=/tmp \
|
||||||
stdbuf -oL -eL sh -c "tail -fn+0 /reinstall.log | tr '\r' '\n' | grep -Fiv -e password -e token" &
|
stdbuf -oL -eL sh -c "tail -fn+0 /reinstall.log | tr '\r' '\n' | grep -Fiv -e password -e token" &
|
||||||
@@ -569,9 +606,8 @@ clear_previous() {
|
|||||||
fi
|
fi
|
||||||
disconnect_qcow
|
disconnect_qcow
|
||||||
# 安装 arch 有 gpg-agent 进程驻留
|
# 安装 arch 有 gpg-agent 进程驻留
|
||||||
killall gpg-agent || true
|
|
||||||
# 在 aria2c 下载时手动中止脚本,aria2c 还会在后台下载
|
# 在 aria2c 下载时手动中止脚本,aria2c 还会在后台下载
|
||||||
killall aria2c || true
|
killall -q gpg-agent aria2c || true
|
||||||
rc-service -q --ifexists --ifstarted nix-daemon stop
|
rc-service -q --ifexists --ifstarted nix-daemon stop
|
||||||
swapoff -a
|
swapoff -a
|
||||||
umount_all
|
umount_all
|
||||||
@@ -2242,35 +2278,41 @@ install_arch_gentoo_aosc() {
|
|||||||
# 添加 swap
|
# 添加 swap
|
||||||
create_swap_if_ram_less_than 1024 $os_dir/swapfile
|
create_swap_if_ram_less_than 1024 $os_dir/swapfile
|
||||||
|
|
||||||
apk add arch-install-scripts
|
if false; then
|
||||||
|
local alpine_rootfs=/
|
||||||
|
apk add arch-install-scripts
|
||||||
|
else
|
||||||
|
local alpine_rootfs=$os_dir/alpine
|
||||||
|
create_alpine_rootfs_with_arch_install_scripts "$alpine_rootfs" true "$os_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
# 为了二次运行时 /etc/pacman.conf 未修改
|
# 为了二次运行时 /etc/pacman.conf 未修改
|
||||||
if [ -f /etc/pacman.conf.orig ]; then
|
if [ -f $alpine_rootfs/etc/pacman.conf.orig ]; then
|
||||||
cp /etc/pacman.conf.orig /etc/pacman.conf
|
cp $alpine_rootfs/etc/pacman.conf.orig $alpine_rootfs/etc/pacman.conf
|
||||||
else
|
else
|
||||||
cp /etc/pacman.conf /etc/pacman.conf.orig
|
cp $alpine_rootfs/etc/pacman.conf $alpine_rootfs/etc/pacman.conf.orig
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 设置 repo
|
# 设置 repo
|
||||||
insert_into_file /etc/pacman.conf before '\[core\]' <<EOF
|
insert_into_file $alpine_rootfs/etc/pacman.conf before '\[core\]' <<EOF
|
||||||
SigLevel = Never
|
SigLevel = Never
|
||||||
ParallelDownloads = 5
|
ParallelDownloads = 5
|
||||||
EOF
|
EOF
|
||||||
cat <<EOF >>/etc/pacman.conf
|
cat <<EOF >>$alpine_rootfs/etc/pacman.conf
|
||||||
[core]
|
[core]
|
||||||
Include = /etc/pacman.d/mirrorlist
|
Include = /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
[extra]
|
[extra]
|
||||||
Include = /etc/pacman.d/mirrorlist
|
Include = /etc/pacman.d/mirrorlist
|
||||||
EOF
|
EOF
|
||||||
mkdir -p /etc/pacman.d
|
mkdir -p $alpine_rootfs/etc/pacman.d
|
||||||
# shellcheck disable=SC2016
|
# shellcheck disable=SC2016
|
||||||
case "$(uname -m)" in
|
case "$(uname -m)" in
|
||||||
x86_64) dir='$repo/os/$arch' ;;
|
x86_64) dir='$repo/os/$arch' ;;
|
||||||
aarch64) dir='$arch/$repo' ;;
|
aarch64) dir='$arch/$repo' ;;
|
||||||
esac
|
esac
|
||||||
# shellcheck disable=SC2154
|
# shellcheck disable=SC2154
|
||||||
echo "Server = $mirror/$dir" >/etc/pacman.d/mirrorlist
|
echo "Server = $mirror/$dir" >$alpine_rootfs/etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
# 安装系统
|
# 安装系统
|
||||||
# 要安装分区工具(包含 fsck.xxx),用于 initramfs 检查分区数据
|
# 要安装分区工具(包含 fsck.xxx),用于 initramfs 检查分区数据
|
||||||
@@ -2295,7 +2337,17 @@ EOF
|
|||||||
pkgs="$pkgs sudo"
|
pkgs="$pkgs sudo"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pacstrap -K $os_dir $pkgs
|
# retry 防止网络问题
|
||||||
|
if [ "$alpine_rootfs" = / ]; then
|
||||||
|
retry 5 pacstrap -K "$os_dir" $pkgs
|
||||||
|
killall -q gpg-agent || true
|
||||||
|
apk del arch-install-scripts
|
||||||
|
else
|
||||||
|
retry 5 chroot "$alpine_rootfs" pacstrap -K "/parent" $pkgs
|
||||||
|
killall -q gpg-agent || true
|
||||||
|
umount -R "$alpine_rootfs/parent"
|
||||||
|
remove_alpine_rootfs "$alpine_rootfs"
|
||||||
|
fi
|
||||||
|
|
||||||
# dns
|
# dns
|
||||||
cp_resolv_conf $os_dir
|
cp_resolv_conf $os_dir
|
||||||
@@ -2511,7 +2563,7 @@ EOF
|
|||||||
install_$distro
|
install_$distro
|
||||||
|
|
||||||
# 安装 arch 有 gpg-agent 进程驻留
|
# 安装 arch 有 gpg-agent 进程驻留
|
||||||
pkill gpg-agent || true
|
killall -q gpg-agent || true
|
||||||
|
|
||||||
# 初始化
|
# 初始化
|
||||||
if false; then
|
if false; then
|
||||||
@@ -2591,9 +2643,13 @@ EOF
|
|||||||
# fstab
|
# fstab
|
||||||
# fstab 可不写 efi 条目, systemd automount 会自动挂载
|
# fstab 可不写 efi 条目, systemd automount 会自动挂载
|
||||||
# fstab 头部有使用说明,因此用 >>
|
# fstab 头部有使用说明,因此用 >>
|
||||||
apk add arch-install-scripts
|
local alpine_rootfs=$os_dir/alpine
|
||||||
genfstab -U $os_dir | sed '/swap/d' >>$os_dir/etc/fstab
|
create_alpine_rootfs_with_arch_install_scripts "$alpine_rootfs" true "$os_dir"
|
||||||
apk del arch-install-scripts
|
# genfstab 会用到 findmnt 等工具
|
||||||
|
retry 5 chroot "$alpine_rootfs" apk add util-linux
|
||||||
|
chroot "$alpine_rootfs" genfstab -U /parent | sed '/swap/d' >>$os_dir/etc/fstab
|
||||||
|
umount -R "$alpine_rootfs/parent"
|
||||||
|
remove_alpine_rootfs "$alpine_rootfs"
|
||||||
|
|
||||||
# 删除 resolv.conf,不然 systemd-resolved 无法创建软链接
|
# 删除 resolv.conf,不然 systemd-resolved 无法创建软链接
|
||||||
rm_resolv_conf $os_dir
|
rm_resolv_conf $os_dir
|
||||||
|
|||||||
Reference in New Issue
Block a user