init
This commit is contained in:
commit
67fef643f5
7
README.md
Normal file
7
README.md
Normal 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
50
iso_build.sj
Normal 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
62
phase5_tools.sh
Normal 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
80
phase6_8_chroot.sh
Normal 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
57
prepare_and_download.sh
Normal 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 "宿主准备 + 下载源码完成"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user