打造专属的Linux OS
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打造专属的Linux OS相关的知识,希望对你有一定的参考价值。
写在前面
在前面,我们已经编译出了kernel镜像,但是我们还是无法使用(可以替换现有Linux发行版本中的kernel,而且这不是我想要的,不过有兴趣的同学可以去官网下载这些发行版的镜像,参考链接:mirrors.kernel.org)。那么除了内核,我们还需要打包一些常用的Linux工具,busybox包含了我们常用的基本应用程序,如echo,ls,cat等。更重要的是它也是开源的,官网地址:BusyBox。
一、下载编译busybox
现在地址:
https://busybox.net/downloads/busybox-1.35.0.tar.bz2
1.1 解压busybox源码
tar xvf busybox-1.35.0.tar.bz2
1.2 编译前配置busybox编译选项
make defconfig
make menuconfig
通过按键y勾选Settings --> Build Options --> Build static binary (no shared libs)。因为此时linux环境暂时还没有加入各种运行时库,所以必须静态链接。
保存退出
1.3 安装 glibc
apt install libc6
1.4 编译
make
make install
二、Ubuntu系统根目录解读
-
/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 -
/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 -
/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 -
/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。 -
/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 -
/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 -
/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 -
/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 -
/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 -
/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 -
/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。 -
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 -
/selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 -
/srv:
该目录存放一些服务启动之后需要提取的数据。 -
/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
-
/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 -
/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 -
/usr/bin:
系统用户使用的应用程序。 -
/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。 -
/usr/src:
内核源代码默认的放置目录。 -
/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 -
/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
三、制作文件系统---rootfs.gz
3.1 构建根目录
在~目录创建rootfs目录,接下来我们将用rootfs构建我们的系统根目录。
cd ~
mkdir rootfs
3.2 拷贝_install到rootfs
cp -r xxx/_install/* rootfs/
3.3 创建linux系统必备目录
mkdir proc mnt var tmp dev sys etc
3.5 添加init程序
linux内核初始化后启动首先启动init程序,这里我们把init做成一个指向bin/sh的软连接。
ln -s bin/sh init
3.6 添加必须的虚拟dev设备
tty(终端设备的统称),tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。这也是我们的os接下来主要的交互工具。
在Linux 系统中,计算机显示器通常被称为控制台终端 (console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。
终端将是接下来我们主要的交互工具。
/dev/console:控制台
/dev/null:无限数据接收设备,相当于黑洞
/dev/tty[0-63]:虚拟终端
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty c 5 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4
这里先解释下mknod命令,我们使用"man mknod"来看下官方解释;
NAME
mknod - make block or character special files
SYNOPSIS
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
如上,mknod用来创建块或字符文件。以“mknod console c 5 1”为例,如下:
- console是设备的名字
- c指字符设备(可选b,块设备)
- 5是该设备在major.h中定义的标记,5是主设备号
- 1是次设备号,当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了 ,对于字符设备,次设备号就表示同类型设备的不同设备。
3.7 打包rootfs.img
cd ~/rootfs
find . | cpio -H newc -o | gzip > ../rootfs.gz
首先我们解释下cpio命令,
- cpio支持将文件打包成很多种格式的文件,包括二进制,ASCII,crc等。
- newc是指SVR4文件格式,SVR4,System V Release 4指Unix系统V。SVR4格式支持i-nodes超过65536的文件系统。
详细的内容可以参考官方指导:cpio
GNU cpio
copies files into or out of a cpio
or tar
archive, The archive can be another file on the disk, a magnetic tape, or a pipe.
GNU cpio
supports the following archive formats: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar. The tar format is provided for compatibility with the tar
program. By default, cpio
creates binary format archives, for compatibility with older cpio
programs. When extracting from archives, cpio
automatically recognizes which kind of archive it is reading and can read archives created on machines with a different byte-order.
-H format
--format=format
[copy-in,copy-out,copy-pass]
Use archive format format. The valid formats are listed below with file size limits for individual files in parentheses; the same names are also recognized in all-caps. The default in copy-in mode is to automatically detect the archive format, and in copy-out mode is ‘bin’.
‘newc’
The new (SVR4) portable format, which supports file systems having more than 65536 i-nodes. (4294967295 bytes)
到这里,一个文件系统rootfs.gz就创建完成了。
四、制作系统镜像 - linux.iso
cd ~
mkdir iso
cd iso
cp rootfs.gz iso/
cp xxx/arch/x86/boot/bzImage iso/kernel.gz
cp xxx/syslinux-6.03/bios/core/isolinux.bin iso/
cp xxx/syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 iso/
4.1 下载syslinux
下载链接:Index of /pub/linux/utils/boot/syslinux/
首先创建一个iso目录,然后通过"tar -xvf syslinux-6.03.tar.xz"命令解压syslinux-6.03.tar.xz,并将解压的syslinux-6.03目录中的bios/core/isolinux.bin、bios/com32/elflink/ldlinux/ldlinux.c32复制到iso目录中。
接着我们在iso目录创建isolinux.cfg文件,内容如下:
4.2 制作ISO镜像文件
cd iso
apt install xorriso
xorriso -as mkisofs -o ../linux.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./
五、安装与启动
5.1 下载Virtual Box虚拟机
下载链接:Downloads – Oracle VM VirtualBox
5.2 安装Linux OS
5.2.1 新建
5.2.2 设置内存
5.2.3 虚拟内存
5.2.4 启动
5.2.5 选择镜像(linux.iso)
5.2.6 启动完成,回车进入sh
启动完成。
下载地址:
六、FAQ
1.Unable to boot - please use a kernel appropriate for your CPU
解决方案:Virtual Box新建时选择Linux xxx(64-bit),详细如下图:
以上是关于打造专属的Linux OS的主要内容,如果未能解决你的问题,请参考以下文章
Python之打造专属Python开发者的完美终端工具Rich
ChatGPT 拓展资料:Telegram Bot 打造专属聊天机器人
梅赛德斯-奔驰将打造自有操作系统,在中国市场与腾讯云展开合作