1.下载内核:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
apt-get install libdw-dev//安装必要的
配置menuconfig
----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(65536) Default RAM disk size (kbytes)
编译
make O=out_x86_64 bzImage -j4
输出目录
byna@ubuntu:~/linux-5.19.5/out_x86_64$ ls
arch drivers io_uring Makefile net source virt
block fs ipc mm scripts System.map vmlinux
certs include kernel modules.builtin security tools vmlinux.o
crypto init lib modules.builtin.modinfo sound usr vmlinux.symvers
bzImage 位置
byna@ubuntu:~/linux-5.19.5/out_x86_64/arch/x86_64/boot$ ls
bzImage
byna@ubuntu:~/linux-5.19.5/out_x86_64/arch/x86_64/boot$ file bzImage
bzImage: symbolic link to ../../x86/boot/bzImage
byna@ubuntu:~/linux-5.19.5/out_x86_64/arch/x86/boot$ file bzImage //最终输出位置
bzImage: Linux kernel x86 boot executable bzImage, version 5.19.5 (root@ubuntu) #1 SMP PREEMPT_DYNAMIC Wed Aug 31 02:54:01 PDT 2022, RO-rootFS, swap_dev 0xA, Normal VGA
2,Busybox
a,下载Busybox
https://busybox.net/downloads/
配置busybox
cd busybox-1.35.0/
sudo make menuconfig
做如下配置:
Busybox Settings --->
[*] Build static binary (no shared libs)
编译&&安装
#编译
sudo make -j4ls
#安装,执行则会在busybox源码目录下生成_install文件夹
sudo make install
3,制作文件系统
a,创建文件夹
sudo su //切换root
cp -r ./busybox-1.35.0/_install/ ./rootfs/
cd rootfs/
mkdir dev etc lib64 mnt opt proc root sys tmp var home //新建文件
root@ubuntu:/home/byna/rootfs# ls
bin dev etc home lib64 linuxrc mnt opt proc root sbin sys tmp usr var
b,复制库文件
我们这里制作64bit的系统,把x86_64的库复制过来:
cp -r /lib/x86_64-linux-gnu/* ./rootfs/lib64/
,创建dev节点
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
d,配置etc
d1 配置rcS
mkdir ./rootfs/etc/init.d
vim ./rootfs/etc/init.d/rcS
添加如下内容,然后保存退出:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/bin/mount -a #挂载fstab文件中所有指定的文件系统
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s #在/dev目录下建立必须的设备节点
/bin/hostname -F /etc/sysconfig/HOSTNAME
d2 配置inittab
vim ./rootfs/etc/inittab
::sysinit:/etc/init.d/rcS #设置内核的热插拔,有mdev接收来自内核的消息并做出响应
::askfirst:-/bin/sh #在串口启动一个登陆会话
::ctrlaltdel:/sbin/reboot #作为init重启执行程序
::restart:/sbin/init
::showdown:/bin/mount #告诉init在关机时运行umount命令卸载所有文件系统,如果卸载失败,以只读方式重新挂载
d3 配置fstab
vim ./rootfs/etc/fstab
添加如下内容(用tab隔开,不是空格),然后保存退出:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
d4 配置profile
vim ./rootfs/etc/profile
添加如下内容,然后保存退出:
#/etc/profile:system-wide .profile file for the Bourne shells
#!/bin/sh
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[root@tshark]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
e,ramdisk
cd ./rootfs/
ln -sv bin/busybox init
find . | cpio -H newc -o | gzip -9 -n > ../ramdisk.gz
4,运行测试
a,安装qemu
sudo apt install qemu
b,编写运行脚本
vi run.sh
sudo qemu-system-x86_64 \
-m 1024M \
-kernel ./linux-5.19.5/out_x86_64/arch/x86_64/boot/bzImage \
-nographic \
-append "root=/dev/ram0 rw rootfstype=ext4 console=ttyS0 init=/linuxrc" \
-initrd ./ramdisk.gz \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0
修改权限
sudo chmod 775 ./run.sh
./run.sh
启动后出现:can’t run ‘/etc/init.d/rcS’: Permission denied
cd rootfs
chmod 777 etc/init.d/rcS
重新打包
在rootfs目录下
find . | cpio -H newc -o | gzip -9 -n > ../ramdisk.gz
(待续…)