[教程]制作Ubuntu精简版,安装自定义程序、打包、解包,全流程讲解
2023-11-8 5821

本文教大家如何利用Ubuntu Base镜像文件和kernel构建属于自己的Ubuntu精简版。

本贴以制作Ubuntu 22.04.3为例。

 

准备

在你的Windows电脑中安装VMware workstation虚拟机软件,安装任意发行版Linux,例如Ubuntu Server系列;

登录Linux,准备一个文件夹用于制作,这里举例使用/data目录,rootfs用于放置根文件系统

mkdir /data/rootfs -p
cd /data/rootfs

image.webp

 

下载Ubuntu Base

下载地址:Index of /ubuntu-base/releases

选择你需要的发行版,这里选择22.04.3,点击release

image.webp

image.webp

右键复制链接,下载到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

image.webp

解压缩

tar -zxf ubuntu-base-22.04.3-base-amd64.tar.gz
#也可以删除tar.gz文件,我这里是移动到上层目录/data
mv ubuntu-base-22.04.3-base-amd64.tar.gz ..

image.webp

 

定制根文件系统

软件源

默认的/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

有小伙伴会问,为啥你这里只有这两行,因为其他源对于我们这种极度精简的根文件系统来说没有必要,添加了反而成为负担。

image.webp

DNS域名解析

默认的DNS服务器是空的,需要我们手动指定

echo "nameserver 8.8.8.8"  > etc/resolv.conf

image.webp

灵活定制预装软件

设置了软件源和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 保存并退出

image.webp

还需要给init文件可执行权限

chmod +x init

细心的同学会发现,这个脚本里最后一行指定的文件/sbin/init并不存在,这咋办?

那是因为你没有执行上面的安装软件命令(安装过程中会安装依赖包systemd)

现在你知道该怎么做了吧:

apt install systemd

ubuntu-base-18开始默认没有安装systemd,会导致找不到init文件,可能会造成无法启动pid1进程,无法启动Ubuntu(init为systemd的软链)

image.webp

 

清理垃圾文件

如果此时直接打包,会发现体积还是比较大,所以建议清理垃圾文件。

image.webp

体积这么大😱

优雅方式

在chroot之后执行:

apt-get clean

看看效果:

image.webp

嗯,不错嘛,清理了90MB,但体积还是很大呢😂

暴力方式

在chroot之后执行(当然如果你在/data/rootfs目录也可以直接执行):

此处内容隐藏,回复后可见!立即回复  回复后请刷新页面!刷新

这样清理过后,根文件系统的体积会小很多,而且对系统并不会产生坏的影响。

image.webp

效果显著哦!😊

 

清理痕迹

如果你现在就觉得所有事情已经做的差不多了,那你就疏忽了。

某用户使用了你的系统,使用history命令居然直接查出了你所有的操作,你执行的所有命令在别人面前一览无余!

应该怎么办?

简单:

echo > root/.bash_history

看看效果:

image.webp

关闭linux命令行屏幕保护

有同学会说:这个Linux开机一段时间后就自动息屏了,这个功能影响我炫耀了,怎么办?

这个功能是这个参数控制的:

cat /sys/module/kernel/parameters/consoleblank

值如果是0表示不黑屏。

可以在内核启动时加参数:

consoleblank=0

构建根文件系统

构建并压缩

保证当前目录是/data/rootfs,使用以下命令开始打包构建

find . | cpio -o -H newc | gzip -9 > ../initrd.gz

image.webp

得到了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模拟启动

image.webp

 

这个是没安装任何软件的情况下,启动/sbin/init失败了,所以依次找到了/bin/sh,需要手动执行bash进入bash

qemu-boot.gif

 

安装了systemd的情况下:

2204.gif

 

生成ISO镜像文件

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镜像文件:

image.webp

最后生成的ISO文件就是你需要的启动镜像文件了。

 

哈哈,你学会了吗?😀

最后于 2024-6-17 被caocaofff编辑 ,原因:
收藏
点赞 2
分享
官方QQ群:872611894(群密码:pecmd.net)
最新回复 (51)
  • avatar image
    wanglj 2023-11-10

    👍牛人厉害啊 !感谢支持!

    安静随和与世无争
  • avatar image
    wanglj 2023-11-10

    这么快就出文档了效率很高 😁

    安静随和与世无争
  • avatar image
    cchh543 2023-11-13

    真的是牛人

    pecmd@hh
  • avatar image
    爱心会员VIP会员
    小灰灰 2023-11-15

    好好好,学废了,可以定制想要的功能进去了

    404说不出话???
  • avatar image
    爱心会员VIP会员
    小灰灰 2023-12-4

    制作了好多次,始终领悟不到版主的精简版的精髓,提出来的initrd.gz都在80多90M

    404说不出话???
  • avatar image
    caocaofff 2023-12-4
    楼主   7
    minigg 制作了好多次,始终领悟不到版主的精简版的精髓,提出来的initrd.gz都在80多90M

    删除apt缓存

    官方QQ群:872611894(群密码:pecmd.net)
  • avatar image
    Win78102006 2023-12-6

    厉害,学废了

    qwq
  • avatar image
    sinkr 2023-12-17

    谢谢楼主的分享

  • avatar image
    oouu000uuoo 2023-12-25

    感谢分享

  • avatar image
    cestlolita 2023-12-27

    楼主厉害,学习了

  • avatar image
    small7 2023-12-30

    感谢分享,我在子系统安装systemd是提示 E: Unable to locate package systemd, 步骤如下:

    chroot ./

    apt install systemd

    hello world
  • avatar image
    caocaofff 2023-12-30
    楼主   13
    small7 感谢分享,我在子系统安装systemd是提示 E: Unable to locate package systemd, 步骤如下: chroot ./ apt install systemd

    先apt update更新缓存,帖子内容我都修改了,可以再看一遍

    官方QQ群:872611894(群密码:pecmd.net)
  • avatar image
    small7 2023-12-30

    嗯嗯,是按您最新的教程操作的,但还是没成功,可能是我哪个步骤没对,操作的步骤如下。

    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

    /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

    /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:2 http://mirrors.aliyun.com/ubuntu jammy-updates InRelease

      gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed

    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.

    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.

    hello world
  • avatar image
    caocaofff 2023-12-30
    楼主   15
    small7 嗯嗯,是按您最新的教程操作的,但还是没成功,可能是我哪个步骤没对,操作的步骤如下。 root@test:/data/rootfs# cat etc/apt/sources.list deb htt ...

    如果网络问题解决不了可以下载独立的deb包进行安装

    官方QQ群:872611894(群密码:pecmd.net)
  • avatar image
    small7 2023-12-30

    按这个思路解决了,再次感谢大神分享

    https://cloud.tencent.com/developer/ask/sof/116426316

    hello world
  • avatar image
    small7 2023-12-30

    不过还遇到一个问题,进入后好像没有 fdisk , reboot ,poweroff等常用命令,麻烦大神空时指点一下。

    hello world
  • avatar image
    caocaofff 2023-12-30
    楼主   18
    small7 不过还遇到一个问题,进入后好像没有 fdisk , reboot ,poweroff等常用命令,麻烦大神空时指点一下。

    安装busybox

    官方QQ群:872611894(群密码:pecmd.net)
  • avatar image
    small7 2023-12-30

    都可以了,万分感谢大神带小白。祝你身体健康,周末愉快。

    hello world
  • avatar image
    fck113 2024-1-2

    感谢分享

    hello world
  • avatar image
    acein554 2024-1-3

    都可以了,祝你身体健康,周末愉快。

     

  • avatar image
    mxr 2024-1-7

    多谢分享。

    joker
  • avatar image
    mxr 2024-1-7

    不知archlinux是否通用,archlinux Base文件在哪找呢🤔

    joker
  • avatar image
    caocaofff 2024-1-10
    楼主   24
    mxr 不知archlinux是否通用,archlinux Base文件在哪找呢🤔

    可以去官方的docker仓库拉取docker镜像,然后导出镜像找到130MB左右的base层

    官方QQ群:872611894(群密码:pecmd.net)
  • avatar image
    flyingdancex 2024-1-10

    进来学习一下

返回