Ragdoll OS
从零制作一款Linux发行版
代码仓库:https://github.com/RagdollOS/Ragdoll
理论知识
一个全新安装的Ubuntu桌面操作系统由1个Kernel软件包和约1600个其它软件包构成,它还有个名字叫ubuntu-desktop。ubuntu-desktop去除图形桌面软件包,就是服务器版本ubuntu-server。ubuntu-server极致精简只保留极少量必要软件包,得到ubuntu-base,即Base System。
基本流程
    1. 构建Base System
Base System
1debootstrap --no-check-gpg --cache-dir=$project_dir/cache --include=gnupg,wget,apt,software-properties-common,vim,git,htop --arch=$debootstrap_arch $codename $ubuntu_base_system_dir $apt_mirror_iso
2wget -q http://mirrors.aliyun.com/gpg/ragdoll-public-keys.asc -O $ubuntu_base_system_dir/ragdoll-public-keys.asc
1debootstrap --no-check-gpg --cache-dir=$project_dir/cache --include=gnupg,wget,apt,software-properties-common,vim,git,htop --arch=$debootstrap_arch $codename $ubuntu_base_system_dir $apt_mirror_iso
2wget -q http://mirrors.aliyun.com/gpg/ragdoll-public-keys.asc -O $ubuntu_base_system_dir/ragdoll-public-keys.asc
debootstrap
参数解释:
--no-check-gpg: 跳过检查GPG签名。
--cache-dir: 指定缓存路径。
--include: 额外包谷的软件包。gnupg用于解决自签名GPG问题。wget、apt、software-properties-common、vim、git、htop均为常用软件。
--arch: 目标系统架构。
$codename: Ubuntu/Debian的codename指的是系统版本代号,如18.04代号为bionic、22.04代号为jammy。
$ubuntu_base_system_dir: debootstrap的输出目录,用于存放构建好的Base System。
$apt_mirror_iso: 镜像源地址。如阿里云为http://mirrors.cloud.aliyuncs.com/ubuntu。你也可以在公司内网构建一个巨大的镜像源,用于解决公网镜像的流控限制问题。
ragdoll-public-keys.asc
每个Ubuntu/Debian发行版都必须有一套自己的GPG签名证书。其中,公钥必须放置在公网可访问的地方,而私钥由发行版公司安全保管。关于GPG签名的介绍,请查阅Google。
Chroot
1. config.sh
2
3# set -x
4cp /etc/resolv.conf $ubuntu_base_system_dir/etc/resolv.conf
5
6
7mkdir -p $ubuntu_base_system_dir/etc/apt/
8cat << EOF > $ubuntu_base_system_dir/etc/apt/sources.list
9deb $apt_mirror_iso $codename main restricted universe multiverse
10deb-src $apt_mirror_iso $codename main restricted universe multiverse
11EOF
12
13cp -r $ubuntu_livecd_resources/chroot_resources $ubuntu_base_system_dir/chroot_resources
14cp -r $project_dir/pre_download/* $ubuntu_base_system_dir/chroot_resources/
15
16cp $project_dir/cache/* $ubuntu_base_system_dir/var/cache/apt/archives
17
18./mount.sh
19cat chroot_script/1.init_env.sh | chroot $ubuntu_base_system_dir /bin/bash
20#cat chroot_script/4.ubiquity_server.sh | chroot $ubuntu_base_system_dir /bin/bash
21./umount.sh
22
23cp $ubuntu_base_system_dir/var/cache/apt/archives/* $project_dir/cache/
24rm -rf $ubuntu_base_system_dir/var/cache/apt/archives/*
25
26cat << EOF > $ubuntu_base_system_dir/etc/apt/sources.list
27deb $apt_mirror_target $codename main restricted universe multiverse
28deb $apt_mirror_target $codename-updates main restricted universe multiverse
29deb $apt_mirror_target $codename-backports main restricted universe multiverse
30deb $apt_mirror_target $codename-security main restricted universe multiverse
31deb-src $apt_mirror_target $codename main restricted universe multiverse
32deb-src $apt_mirror_target $codename-updates main restricted universe multiverse
33deb-src $apt_mirror_target $codename-backports main restricted universe multiverse
34deb-src $apt_mirror_target $codename-security main restricted universe multiverse
35EOF
36
1. config.sh
2
3# set -x
4cp /etc/resolv.conf $ubuntu_base_system_dir/etc/resolv.conf
5
6
7mkdir -p $ubuntu_base_system_dir/etc/apt/
8cat << EOF > $ubuntu_base_system_dir/etc/apt/sources.list
9deb $apt_mirror_iso $codename main restricted universe multiverse
10deb-src $apt_mirror_iso $codename main restricted universe multiverse
11EOF
12
13cp -r $ubuntu_livecd_resources/chroot_resources $ubuntu_base_system_dir/chroot_resources
14cp -r $project_dir/pre_download/* $ubuntu_base_system_dir/chroot_resources/
15
16cp $project_dir/cache/* $ubuntu_base_system_dir/var/cache/apt/archives
17
18./mount.sh
19cat chroot_script/1.init_env.sh | chroot $ubuntu_base_system_dir /bin/bash
20#cat chroot_script/4.ubiquity_server.sh | chroot $ubuntu_base_system_dir /bin/bash
21./umount.sh
22
23cp $ubuntu_base_system_dir/var/cache/apt/archives/* $project_dir/cache/
24rm -rf $ubuntu_base_system_dir/var/cache/apt/archives/*
25
26cat << EOF > $ubuntu_base_system_dir/etc/apt/sources.list
27deb $apt_mirror_target $codename main restricted universe multiverse
28deb $apt_mirror_target $codename-updates main restricted universe multiverse
29deb $apt_mirror_target $codename-backports main restricted universe multiverse
30deb $apt_mirror_target $codename-security main restricted universe multiverse
31deb-src $apt_mirror_target $codename main restricted universe multiverse
32deb-src $apt_mirror_target $codename-updates main restricted universe multiverse
33deb-src $apt_mirror_target $codename-backports main restricted universe multiverse
34deb-src $apt_mirror_target $codename-security main restricted universe multiverse
35EOF
36
resolv.conf
resolv.conf用于解决系统启动后无网络的问题。详见Kernel Device Driver相关内容。
软件源
生成软件源配置文件/etc/apt/sources.list。需要留意软件包分类需包含main、restricted、universe、multiverse类目。
Chroot Resources
由于Chroot环境与宿主环境隔绝,需要提前将素材资源复制到Chroot目录内,才可被目标系统看到。
相应的,一些需要预下载的资源,会被放在/chroot_resources/predownload中。
./mount.sh与./umount.sh之间为chroot操作,后面会展开介绍。
为了加速构建,可以将apt缓存复制到/var/cache/apt/archives中,以避免反复的网络开销。当chroot过程结束后,回写和删除缓存。
Base System构建完成后,需要注意切换目标系统的软件源。例如:构建时使用内网软件源,但发布时须切换到公网软件源。
首页 > 操作系统 > Ragdoll OS