本文教大家如何利用Ubuntu Base镜像文件和kernel构建属于自己的Ubuntu精简版。
本贴以制作Ubuntu 22.04.3为例。
在你的Windows电脑中安装VMware workstation虚拟机软件,安装任意发行版Linux,例如Ubuntu Server系列;
登录Linux,准备一个文件夹用于制作,这里举例使用/data目录,rootfs用于放置根文件系统
mkdir /data/rootfs -p cd /data/rootfs
下载地址:Index of /ubuntu-base/releases
选择你需要的发行版,这里选择22.04.3,点击release
右键复制链接,下载到rootfs目录
wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04.3/release/ubuntu-base-22.04.3-base-amd64.tar.gz -C /data/rootfs
解压缩
tar -zxf ubuntu-base-22.04.3-base-amd64.tar.gz #也可以删除tar.gz文件,我这里是移动到上层目录/data mv ubuntu-base-22.04.3-base-amd64.tar.gz ..
默认的/etc/apt/sources.list内容都是指向Ubuntu官网,但在中国大陆访问Ubuntu官方源的速度比较慢,建议更换为中国大陆一些公司对外提供的软件源,例如阿里云:
Ubuntu 22.04 的代号是Jammy
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
有小伙伴会问,为啥你这里只有这两行,因为其他源对于我们这种极度精简的根文件系统来说没有必要,添加了反而成为负担。
默认的DNS服务器是空的,需要我们手动指定
echo "nameserver 8.8.8.8" > etc/resolv.conf
设置了软件源和DNS后,我们就可以愉快的使用apt命令来安装和更新软件啦。
此处内容隐藏,回复后可见!立即回复 回复后请刷新页面!刷新
看到有人需要,就再写一下。
如果你需要自动登录的用户是普通账户,那么你需要事先创建好一个普通账户:
useradd -c "Live session user" -m -G sudo -s /bin/bash ubuntu
上面命令是创建一个名叫 ubuntu 的用户,默认启动的shell是bash,自动创建/home/ubuntu目录。
如果你想直接使用root用户自动登录,那么我们可以使用agetty程序,按下面步骤创建一个开机自启服务:
mkdir /etc/systemd/system/getty@tty1.service.d touch /etc/systemd/system/getty@tty1.service.d/override.conf echo "[Service]" > /etc/systemd/system/getty@tty1.service.d/override.conf echo "ExecStart=" >> /etc/systemd/system/getty@tty1.service.d/override.conf echo "ExecStart=-/sbin/agetty -a root --noclear %I $TERM" >> /etc/systemd/system/getty@tty1.service.d/override.conf
你可以修改上面的命令最后一行里的root为你的普通账户。
以上就搞定了自动登录啦!😀
如果此时打包,并配合kernel启动后是无法启动根文件系统的,kernel会报错崩溃,这时需要先创建init启动文件。
我们直接使用vi或者vim工具创建一个文件,vi编辑器的用法我不想多说,网上有相关教程
vim init
按 i 键,写入以下内容:
此处内容隐藏,登录后可见!立即登录 登录后请刷新页面!刷新
按 :x 保存并退出
还需要给init文件可执行权限
chmod +x init
细心的同学会发现,这个脚本里最后一行指定的文件/sbin/init并不存在,这咋办?
那是因为你没有执行上面的安装软件命令(安装过程中会安装依赖包systemd)
现在你知道该怎么做了吧:
apt install systemd
ubuntu-base-18开始默认没有安装systemd,会导致找不到init文件,可能会造成无法启动pid1进程,无法启动Ubuntu(init为systemd的软链)
如果此时直接打包,会发现体积还是比较大,所以建议清理垃圾文件。
体积这么大😱
在chroot之后执行:
apt-get clean
看看效果:
嗯,不错嘛,清理了90MB,但体积还是很大呢😂
在chroot之后执行(当然如果你在/data/rootfs目录也可以直接执行):
这样清理过后,根文件系统的体积会小很多,而且对系统并不会产生坏的影响。
效果显著哦!😊
如果你现在就觉得所有事情已经做的差不多了,那你就疏忽了。
某用户使用了你的系统,使用history命令居然直接查出了你所有的操作,你执行的所有命令在别人面前一览无余!
应该怎么办?
简单:
echo > root/.bash_history
有同学会说:这个Linux开机一段时间后就自动息屏了,这个功能影响我炫耀了,怎么办?
这个功能是这个参数控制的:
cat /sys/module/kernel/parameters/consoleblank
值如果是0表示不黑屏。
可以在内核启动时加参数:
consoleblank=0
保证当前目录是/data/rootfs,使用以下命令开始打包构建
find . | cpio -o -H newc | gzip -9 > ../initrd.gz
得到了29MB大小的根文件系统压缩包,此时可以配合你编译好的Linux kernel进行启动啦。
gzip -d initrd.gz cpio -idm < initrd
编译内核是一个体力活,网上有很多相关文章,我这里可以提供一个我正在使用的.config文件:
[分享]Linux x86_x64 5.X Kernel Configuration 内核编译配置文件-Linux操作系统交流-PECMD技术社区
首先你需要准备一台CPU性能强悍的机器,其次你需要到官网下载kernel源码包(点击对应版本的[tarball]链接),一般我会选择longterm版本。
下载好之后解压(tar -zxf linux-x.xx.xxx.tar.xz),然后到解压后的kernel-x.xx.xxx目录。
新版本的内核建议使用新版本的操作系统,编译之前需要安装依赖包,下面以Ubuntu为例:
apt install make gcc libncurses5-dev libssl-dev libc6-dev bison flex libelf-dev
拷贝我的配置文件.config进来,或者你直接使用这个命令进行修改配置:
make menuconfig
修改完毕之后,用下面命令编译:
make bzImage -j4
注意,上面的命令有个参数-j4,如果你的CPU有8核,你可以改成-j8,一般建议有多少核心就改多少,这样编译速度超级快。
编译完成之后,arch/x86/boot/bzImage就是你刚刚编译好的内核文件啦!
我们用Qemu模拟启动
这个是没安装任何软件的情况下,启动/sbin/init失败了,所以依次找到了/bin/sh,需要手动执行bash进入bash
安装了systemd的情况下:
1、可以参考我发布的镜像文件内容:[下载]Ubuntu Linux 22.04.2 LTS LiveCD 疯狂精简版(58.3MB),支持UD、U+、B+、UDm、量产、刻录CD-Linux操作系统交流-PECMD技术社区
2、解压这个ISO文件,替换initrd文件(把initrd.img换成你生成的initrd.gz,再把gz改成img)
3、下载第三方工具:[分享]WinPE Helper,PE小助手2.0版本,可用于生成ISO、模拟电脑启动(Qemu虚拟机)、挂载U+隐藏分区-软件分享-PECMD技术社区
4、生成ISO镜像文件:
最后生成的ISO文件就是你需要的启动镜像文件了。
哈哈,你学会了吗?😀
👍牛人厉害啊 !感谢支持!
这么快就出文档了效率很高 😁
真的是牛人
好好好,学废了,可以定制想要的功能进去了
制作了好多次,始终领悟不到版主的精简版的精髓,提出来的initrd.gz都在80多90M
minigg 制作了好多次,始终领悟不到版主的精简版的精髓,提出来的initrd.gz都在80多90M
删除apt缓存
厉害,学废了
谢谢楼主的分享
感谢分享
楼主厉害,学习了
感谢分享,我在子系统安装systemd是提示 E: Unable to locate package systemd, 步骤如下:
chroot ./
small7 感谢分享,我在子系统安装systemd是提示 E: Unable to locate package systemd, 步骤如下: chroot ./ apt install systemd
先apt update更新缓存,帖子内容我都修改了,可以再看一遍
嗯嗯,是按您最新的教程操作的,但还是没成功,可能是我哪个步骤没对,操作的步骤如下。
root@test:/data/rootfs# cat etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
root@test:/data/rootfs# echo "nameserver 8.8.8.8" > etc/resolv.conf
root@test:/data/rootfs# cat etc/resolv.conf
nameserver 8.8.8.8
root@test:/data/rootfs# pwd
/data/rootfs
root@test:/data/rootfs# chroot ./
root@test:/# mount --bind /dev dev
root@test:/# mount --bind /dev/pts dev/pts
mount: dev/pts: mount point does not exist. # 这里有一项没有成功挂载
root@test:/# mount --bind /proc proc
root@test:/# mount --bind /sys sys
root@test:/# chroot . /bin/bash
root@test:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@test:/# apt update
Get:1 http://mirrors.aliyun.com/ubuntu jammy InRelease [270 kB]
Get:2 http://mirrors.aliyun.com/ubuntu jammy-updates InRelease [119 kB]
0% [2 InRelease 6893 B/119 kB 6%]/usr/bin/apt-key: 95: cannot create /dev/null: Permission denied
/usr/bin/apt-key: 95: cannot create /dev/null: Permission denied
E: gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
Err:1 http://mirrors.aliyun.com/ubuntu jammy InRelease
gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
0% [Working]/usr/bin/apt-key: 95: cannot create /dev/null: Permission denied
Err:2 http://mirrors.aliyun.com/ubuntu jammy-updates InRelease
Reading package lists... Done
W: GPG error: http://mirrors.aliyun.com/ubuntu jammy InRelease: gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
E: The repository 'http://mirrors.aliyun.com/ubuntu jammy InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: GPG error: http://mirrors.aliyun.com/ubuntu jammy-updates InRelease: gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
E: The repository 'http://mirrors.aliyun.com/ubuntu jammy-updates InRelease' is not signed.
small7 嗯嗯,是按您最新的教程操作的,但还是没成功,可能是我哪个步骤没对,操作的步骤如下。 root@test:/data/rootfs# cat etc/apt/sources.list deb htt ...
如果网络问题解决不了可以下载独立的deb包进行安装
按这个思路解决了,再次感谢大神分享
https://cloud.tencent.com/developer/ask/sof/116426316
不过还遇到一个问题,进入后好像没有 fdisk , reboot ,poweroff等常用命令,麻烦大神空时指点一下。
small7 不过还遇到一个问题,进入后好像没有 fdisk , reboot ,poweroff等常用命令,麻烦大神空时指点一下。
安装busybox
都可以了,万分感谢大神带小白。祝你身体健康,周末愉快。
都可以了,祝你身体健康,周末愉快。
多谢分享。
不知archlinux是否通用,archlinux Base文件在哪找呢🤔
mxr 不知archlinux是否通用,archlinux Base文件在哪找呢🤔
可以去官方的docker仓库拉取docker镜像,然后导出镜像找到130MB左右的base层
进来学习一下