This commit is contained in:
xiuyuansoftware 2025-10-20 10:02:23 +01:00
commit 67fef643f5
5 changed files with 256 additions and 0 deletions

7
README.md Normal file
View File

@ -0,0 +1,7 @@
chmod +x *.sh
sudo ./prepare_and_download.sh
sudo ./phase5_tools.sh
sudo ./phase6_8_chroot.sh
sudo ./iso_build.sh

50
iso_build.sj Normal file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env bash
# iso_build.sh
# 内核编译 + initramfs/live.squashfs + GRUB ISO + 无人值守安装器
set -euo pipefail
IFS=$'\n\t'
LFS_WORKDIR="$PWD/lfs_build"
ISO_NAME="lfs12_custom_x86_64.iso"
CPU_CORES="$(nproc)"
ROOTFS="$LFS_WORKDIR/rootfs"
info(){ echo -e "\e[34m[INFO]\e[0m $*"; }
# 生成 live.squashfs
info "生成 live.squashfs ..."
mkdir -p "$LFS_WORKDIR/iso/live"
mksquashfs "$ROOTFS" "$LFS_WORKDIR/iso/live/rootfs.squashfs" -e boot
# 生成 initramfs
info "生成 initramfs ..."
cd "$LFS_WORKDIR/iso"
mkdir -p initramfs
cd initramfs
mkdir -p {bin,sbin,etc,proc,sys,usr}
cp -a "$ROOTFS"/bin/* bin/
cp -a "$ROOTFS"/sbin/* sbin/
cp -a "$ROOTFS"/etc/* etc/
find . | cpio -H newc -o | gzip > "$LFS_WORKDIR/iso/boot/initrd.img"
# GRUB 配置
info "生成 GRUB 配置 ..."
mkdir -p "$LFS_WORKDIR/iso/boot/grub"
cat > "$LFS_WORKDIR/iso/boot/grub/grub.cfg" <<EOF
set timeout=3
set default=0
menuentry "LFS 12.2 Live" {
linux /boot/vmlinuz
initrd /boot/initrd.img
}
EOF
# 生成 ISO
info "生成 ISO 文件 $ISO_NAME ..."
grub-mkrescue -o "$LFS_WORKDIR/$ISO_NAME" "$LFS_WORKDIR/iso"
# 提示
info "ISO 生成完成: $LFS_WORKDIR/$ISO_NAME"
info "测试: qemu-system-x86_64 -m 4096 -boot d -cdrom $ISO_NAME"
info "无人值守安装: 内核参数 install=/dev/sdX 或 /usr/sbin/lfs_installer --target=/dev/sdX"

62
phase5_tools.sh Normal file
View File

@ -0,0 +1,62 @@
#!/usr/bin/env bash
# phase5_tools.sh
# LFS 12.2 阶段5 临时工具链全自动化
set -euo pipefail
IFS=$'\n\t'
LFS_WORKDIR="$PWD/lfs_build"
CPU_CORES="$(nproc)"
LFS_SRC="$LFS_WORKDIR/sources"
LFS_BUILD="$LFS_WORKDIR/build"
info(){ echo -e "\e[34m[INFO]\e[0m $*"; }
cd "$LFS_BUILD"
# 阶段5官方包顺序
PACKAGES=(
"binutils"
"gcc"
"glibc"
"libstdc++"
"bash"
"coreutils"
"diffutils"
"file"
"findutils"
"gawk"
"grep"
"gzip"
"make"
"patch"
"sed"
"tar"
"xz"
)
# 自动解压、编译、安装
for pkg in "${PACKAGES[@]}"; do
info "处理阶段5包: $pkg"
src=$(ls "$LFS_SRC" | grep "$pkg")
[ -f "$src" ] || { echo "源码 $pkg 未找到"; exit 1; }
rm -rf "$pkg-build"
mkdir "$pkg-build"
tar xf "$LFS_SRC/$src" -C "$pkg-build" --strip-components=1
cd "$pkg-build"
# 自动 patch
for patchf in "$LFS_SRC"/*.patch; do
patch -Np1 < "$patchf" 2>/dev/null || true
done
# 编译安装
./configure --prefix=/tools --disable-multilib || true
make -j"$CPU_CORES"
make install
cd "$LFS_BUILD"
rm -rf "$pkg-build"
done
info "阶段5 临时工具链构建完成"

80
phase6_8_chroot.sh Normal file
View File

@ -0,0 +1,80 @@
#!/usr/bin/env bash
# phase6_8_chroot.sh
# LFS 12.2 阶段6~8完整系统自动构建
set -euo pipefail
IFS=$'\n\t'
LFS_WORKDIR="$PWD/lfs_build"
CPU_CORES="$(nproc)"
LFS_SRC="$LFS_WORKDIR/sources"
ROOTFS="$LFS_WORKDIR/rootfs"
info(){ echo -e "\e[34m[INFO]\e[0m $*"; }
# 挂载虚拟文件系统
info "挂载 /proc /sys /dev ..."
mkdir -p "$ROOTFS"/{proc,sys,dev}
mount --bind /dev "$ROOTFS"/dev
mount --bind /dev/pts "$ROOTFS"/dev/pts
mount -t proc proc "$ROOTFS"/proc
mount -t sysfs sys "$ROOTFS"/sys
# 阶段6~8官方包顺序部分示例
PACKAGES=(
"bash"
"coreutils"
"diffutils"
"file"
"findutils"
"gawk"
"grep"
"gzip"
"make"
"patch"
"sed"
"tar"
"xz"
"perl"
"tcl"
"vim"
)
for pkg in "${PACKAGES[@]}"; do
info "构建阶段6~8包: $pkg"
src=$(ls "$LFS_SRC" | grep "$pkg")
[ -f "$src" ] || { echo "源码 $pkg 未找到"; exit 1; }
rm -rf "$pkg-build"
mkdir "$pkg-build"
tar xf "$LFS_SRC/$src" -C "$pkg-build" --strip-components=1
cd "$pkg-build"
# Patch
for patchf in "$LFS_SRC"/*.patch; do
patch -Np1 < "$patchf" 2>/dev/null || true
done
# chroot 编译
chroot "$ROOTFS" /bin/bash -c "
cd /tmp/$pkg-build
./configure --prefix=/usr
make -j$CPU_CORES
make install
"
cd "$LFS_BUILD"
rm -rf "$pkg-build"
done
# 安装内核 & grub
info "安装内核和 grub ..."
chroot "$ROOTFS" /bin/bash -c "
cd /tmp
tar xf /build/linux-6.6.10.tar.xz
cd linux-6.6.10
make defconfig
make -j$CPU_CORES
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz
"
chroot "$ROOTFS" grub-install /dev/sda
info "阶段6~8完整系统构建完成"

57
prepare_and_download.sh Normal file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env bash
# prepare_and_download.sh
# 宿主环境准备 + LFS 12.2 源码/补丁下载
set -euo pipefail
IFS=$'\n\t'
LFS_WORKDIR="$PWD/lfs_build"
LFS_VERSION="12.2"
CPU_CORES="$(nproc)"
HOST_PKGS=(build-essential bison flex libssl-dev libncurses-dev \
xorriso grub-pc-bin grub-efi-amd64-bin mtools dosfstools \
gcc g++ make wget xz-utils squashfs-tools rsync cpio bc \
perl git parted util-linux kmod syslinux-utils)
info(){ echo -e "\e[34m[INFO]\e[0m $*"; }
# 安装宿主依赖
info "安装宿主依赖..."
apt-get update -y
apt-get install -y "${HOST_PKGS[@]}"
# 创建工作目录
info "创建工作目录 $LFS_WORKDIR ..."
rm -rf "$LFS_WORKDIR"
mkdir -p "$LFS_WORKDIR"/{sources,build,iso,rootfs,tmp}
# 下载 LFS 源码
cd "$LFS_WORKDIR/sources"
info "下载 LFS wget-list 和 patch-list ..."
wget -c "http://www.linuxfromscratch.org/lfs/view/stable/wget-list" -O wget-list
wget -c "http://www.linuxfromscratch.org/lfs/view/stable/patch-list" -O patch-list
info "下载 LFS 源码包..."
while read -r line; do
[[ "$line" =~ ^# ]] && continue
pkg=$(echo "$line"|awk '{print $1}')
[ -f "$pkg" ] || wget -c "http://www.linuxfromscratch.org/lfs/view/stable/$pkg"
done < wget-list
info "下载补丁..."
while read -r line; do
[[ "$line" =~ ^# ]] && continue
patch=$(echo "$line"|awk '{print $1}')
[ -f "$patch" ] || wget -c "http://www.linuxfromscratch.org/lfs/view/stable/$patch"
done < patch-list
# 下载内核与 BusyBox
cd "$LFS_WORKDIR/build"
KERNEL_VER="6.6.10"
BUSYBOX_VER="1.36.1"
info "下载 Linux 内核 $KERNEL_VER 和 BusyBox $BUSYBOX_VER ..."
wget -c "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$KERNEL_VER.tar.xz"
wget -c "https://busybox.net/downloads/busybox-$BUSYBOX_VER.tar.bz2"
info "宿主准备 + 下载源码完成"