From 67fef643f5229023cc5897d23195b980adb5b0d8 Mon Sep 17 00:00:00 2001 From: xiuyuansoftware Date: Mon, 20 Oct 2025 10:02:23 +0100 Subject: [PATCH] init --- README.md | 7 ++++ iso_build.sj | 50 ++++++++++++++++++++++++++ phase5_tools.sh | 62 ++++++++++++++++++++++++++++++++ phase6_8_chroot.sh | 80 +++++++++++++++++++++++++++++++++++++++++ prepare_and_download.sh | 57 +++++++++++++++++++++++++++++ 5 files changed, 256 insertions(+) create mode 100644 README.md create mode 100644 iso_build.sj create mode 100644 phase5_tools.sh create mode 100644 phase6_8_chroot.sh create mode 100644 prepare_and_download.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc6bd5d --- /dev/null +++ b/README.md @@ -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 + diff --git a/iso_build.sj b/iso_build.sj new file mode 100644 index 0000000..e208ff7 --- /dev/null +++ b/iso_build.sj @@ -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" </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 临时工具链构建完成" + diff --git a/phase6_8_chroot.sh b/phase6_8_chroot.sh new file mode 100644 index 0000000..d0722f5 --- /dev/null +++ b/phase6_8_chroot.sh @@ -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完整系统构建完成" + diff --git a/prepare_and_download.sh b/prepare_and_download.sh new file mode 100644 index 0000000..c07401c --- /dev/null +++ b/prepare_and_download.sh @@ -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 "宿主准备 + 下载源码完成" +