Skip to content

Building Guide

津時テオ edited this page Jul 25, 2026 · 4 revisions

📂 构建指南 — 从源码构建 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 (磁盘镜像)

Clone this wiki locally