-
Notifications
You must be signed in to change notification settings - Fork 1
Building Guide
📂 构建指南 — 从源码构建 Tsukine OS
前置要求
在开始构建之前,你需要准备以下环境:
· 操作系统:Linux(推荐 Ubuntu 22.04 LTS 或更新版本,或 WSL 2 上的 Ubuntu) · 磁盘空间:至少 10GB 可用空间 · 内存:建议 4GB 以上 · 网络:需要访问 kernel.org 和 GitHub
安装必要的构建工具:
sudo apt update
sudo apt install -y build-essential libncurses-dev flex bison libelf-dev \
libssl-dev bc cpio gzip wget git xz-utils \
extlinux syslinux-common grub-pc-bin xorriso第一步:获取 Linux 内核源码
Tsukine OS 基于 Linux 6.6 LTS 内核。推荐使用长期支持版本以保证稳定性。
cd ~
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar -xf linux-6.6.tar.xz
mv linux-6.6 TsukineOS-build
cd TsukineOS-build注意:版本号 6.6.x 可能会更新。请访问 kernel.org 确认最新的 6.6 LTS 版本号。
第二步:配置并编译内核
使用默认配置,开启必要的网络和模块支持。
cd ~/TsukineOS-build
make defconfig
make LOCALVERSION= bzImage编译完成后,内核镜像位于 arch/x86/boot/bzImage。
第三步:构建 BusyBox(基础用户空间)
BusyBox 提供 /bin/sh、/bin/ls、/bin/ps 等基础命令。必须静态编译,否则无法在精简系统中运行。
cd ~
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
make menuconfig在配置界面中:
· 进入 Settings → 勾选 Build static binary (no shared libs) · 进入 Networking Utilities → 勾选 udhcpc(支持 DHCP) · 进入 Login/Password Management Utilities → 勾选 login、su、passwd · 保存退出
编译并安装到 rootfs:
make
make CONFIG_PREFIX=~/TsukineOS-build/rootfs install第四步:构建 dash(默认 shell)
Tsukine OS 使用 dash 作为 /bin/sh,比 BusyBox 自带的 shell 更轻量、更标准。
cd ~
wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.12.tar.gz
tar -xzf dash-0.5.12.tar.gz
cd dash-0.5.12
./configure --enable-static
make
cp src/dash ~/TsukineOS-build/rootfs/bin/第五步:构建自研工具
Tsukine OS 的核心工具包括任务管理器、网络配置工具、ICMP 测试工具等。这些工具需要和你的系统配套编译。
在 ~/TsukineOS-build/ 目录下,依次编译每个工具:
cd ~/TsukineOS-build
gcc -static -o tsukine_top tsukine_top.c
gcc -static -o tsukine_net tsukine_net.c
gcc -static -o tsukine_net_ui tsukine_net_ui.c
gcc -static -o tsukine_ping tsukine_ping.c
gcc -static -o tsukine_iwr tsukine_iwr.c
gcc -static -o tsukine_reboot tsukine_reboot.c
gcc -static -o tsukine_shutdown tsukine_shutdown.c将编译好的工具复制到 rootfs:
cp tsukine_* rootfs/bin/tsukine_top 的编译需要 ncurses 静态库:
sudo apt install libncurses-dev
gcc -static -o tsukine_top tsukine_top.c -lncurses -ltinfo第六步:构建 nano(文本编辑器)
cd ~
wget https://www.nano-editor.org/dist/v8/nano-8.3.tar.xz
tar -xf nano-8.3.tar.xz
cd nano-8.3
./configure --enable-utf8 --disable-nls
make
cp src/nano ~/TsukineOS-build/rootfs/bin/第七步:创建 rootfs 目录结构
cd ~/TsukineOS-build
mkdir -p rootfs/{bin,etc,proc,sys,dev,var/log,root,home/dmin}
mkdir -p rootfs/usr/bin
mkdir -p rootfs/var/lib/tknpkg创建 /etc/passwd 和 /etc/group:
cat > rootfs/etc/passwd << 'EOF'
root:x:0:0:root:/root:/bin/sh
dmin:x:1000:1000:dmin:/home/dmin:/bin/sh
EOF
cat > rootfs/etc/group << 'EOF'
root:x:0:
dmin:x:1000:
EOF
touch rootfs/etc/shadow
chmod 600 rootfs/etc/shadow创建 /etc/profile:
cat > rootfs/etc/profile << 'EOF'
HOSTNAME=$(cat /etc/hostname 2>/dev/null || hostname 2>/dev/null || echo "tsukine")
case $(whoami) in
root) PS1='root@'$HOSTNAME':\W# ' ;;
dmin) PS1='dmin@'$HOSTNAME':\W$ ' ;;
*) PS1='\u@'$HOSTNAME':\W\$ ' ;;
esac
export PS1
EOF创建 /etc/network/interfaces(可选,用于静态 IP 配置):
cat > rootfs/etc/network/interfaces << 'EOF'
auto eth0
iface eth0 inet dhcp
EOF创建包管理数据库目录:
touch rootfs/var/lib/tknpkg/db第八步:创建 /init 启动脚本
cat > rootfs/init << 'EOF'
#!/bin/sh
# 颜色定义
RED='\033[31m'
GREEN='\033[32m'
NC='\033[0m'
status_ok() { echo -e "${GREEN}[ OK ]${NC} $1"; }
status_warn() { echo -e "${RED}[WARNING]${NC} $1"; }
# 挂载虚拟文件系统
/bin/busybox mount -t proc none /proc
[ $? -eq 0 ] && status_ok "Mounting /proc" || status_warn "Mounting /proc"
/bin/busybox mount -t sysfs none /sys
[ $? -eq 0 ] && status_ok "Mounting /sys" || status_warn "Mounting /sys"
/bin/busybox mount -t devtmpfs none /dev
[ $? -eq 0 ] && status_ok "Mounting /dev" || status_warn "Mounting /dev"
# 创建 /dev/null
if [ ! -e /dev/null ]; then
/bin/busybox mknod /dev/null c 1 3
/bin/busybox chmod 666 /dev/null
[ -e /dev/null ] && status_ok "Creating /dev/null" || status_warn "Creating /dev/null"
fi
# 设置主机名
[ ! -f /etc/hostname ] && echo "tsukine" > /etc/hostname
/bin/busybox hostname -F /etc/hostname
[ $? -eq 0 ] && status_ok "Setting hostname" || status_warn "Setting hostname"
# 检查内核功能
[ -f /proc/modules ] && status_ok "Kernel module support" || status_warn "Kernel module support"
[ -f /proc/meminfo ] && status_ok "Memory management" || status_warn "Memory management"
[ -f /proc/version ] && status_ok "Kernel version info" || status_warn "Kernel version info"
[ -d /proc/net ] && status_ok "Network protocol stack" || status_warn "Network protocol stack"
# 检查自研工具
for tool in tsukine_top tsukine_net tsukine_net_ui tsukine_ping tsukine_iwr tsukine_reboot tsukine_shutdown nano; do
[ -f /bin/$tool ] || [ -f /usr/bin/$tool ] && status_ok "Tool: $tool" || status_warn "Tool: $tool"
done
# 打印 Logo
echo ""
echo " .#####"
echo " ##@@@@@@"
echo " #@@@@@@"
echo " #@@@@@@"
echo " #@@@@@@@"
echo " #@@@@@@@"
echo " ##@@@@@@@"
echo " .#######"
echo ""
echo " Welcome to TsukineOS!"
echo " Version: TsukineOS Infdev-0.2.3"
echo " Kernel: 6.6.0"
echo "========================="
echo ""
# 登录循环
while true; do
/bin/login
/bin/busybox echo "Login exited. Restarting login..."
/bin/busybox sleep 1
done
EOF
chmod +x rootfs/init第九步:打包 initrd
cd ~/TsukineOS-build
cd rootfs && find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initrd.gz && cd ..第十步:生成磁盘镜像(可选)
如果需要 .img 磁盘镜像:
cd ~/TsukineOS-build
# 创建 64MB 空白镜像
dd if=/dev/zero of=tsukineos.img bs=1M count=64
mkfs.ext4 tsukineos.img
# 挂载并复制 rootfs
sudo mount -o loop tsukineos.img /mnt/tsukineos
sudo cp -a rootfs/* /mnt/tsukineos/
# 复制内核
sudo mkdir -p /mnt/tsukineos/boot
sudo cp arch/x86/boot/bzImage /mnt/tsukineos/boot/vmlinuz
# 安装引导
sudo extlinux --install /mnt/tsukineos/boot
# 创建 extlinux.conf
sudo bash -c 'cat > /mnt/tsukineos/boot/extlinux.conf << EOF
DEFAULT tsukine
LABEL tsukine
KERNEL /boot/vmlinuz
APPEND root=/dev/sda rw console=ttyS0 init=/init
EOF'
# 写入 MBR
sudo dd if=/usr/lib/syslinux/mbr.bin of=tsukineos.img bs=440 count=1 conv=notrunc
# 卸载
sudo umount /mnt/tsukineos第十一步:测试启动
使用 QEMU 测试:
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd initrd.gz -append "console=ttyS0 rdinit=/init" -nographic -netdev user,id=n1 -device virtio-net-pci,netdev=n1或测试磁盘镜像:
qemu-system-x86_64 -drive format=raw,file=tsukineos.img -m 512M -nographic -netdev user,id=n1 -device virtio-net-pci,netdev=n1📂 目录结构总览
TsukineOS-build/
├── rootfs/
│ ├── bin/
│ │ ├── busybox
│ │ ├── dash -> busybox
│ │ ├── login -> busybox
│ │ └── tsukine_* (自研工具)
│ ├── usr/bin/
│ │ ├── tknpkg
│ │ ├── tknpkkj
│ │ └── nano
│ ├── etc/
│ │ ├── profile
│ │ ├── passwd
│ │ ├── group
│ │ ├── shadow
│ │ └── network/
│ ├── var/lib/tknpkg/
│ │ └── db
│ ├── init (启动脚本)
│ ├── proc/
│ ├── sys/
│ ├── dev/
│ └── home/dmin/
├── arch/x86/boot/bzImage (内核)
├── initrd.gz (可启动 initrd)
└── tsukineos.img (磁盘镜像)
[返回主页]