Building an ISO Image Based on BusyBox
1. Preparation
- • CentOS 7.9 3.10.0-957.el7.x86_64
- • VMware Workstation
Recommendation: Use BusyBox version <= 1.33.2 for kernel <= 3.10.0
2. Installing BusyBox
# Install dependencies
yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y
# Download
wget https://busybox.net/downloads/busybox-1.33.2.tar.bz2
# Compile and install
tar -xvf busybox-1.33.2.tar.bz2
cd busybox-1.33.2
make defconfig
sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
make -j$(nproc)
make install
3. Building RootFS
# Create directories
mkdir -pv /rootfs/{dev,etc,mnt,proc,sys,tmp,root,var}
# Create necessary device nodes
mknod -m 666 /rootfs/dev/console c 51
mknod -m 666 /rootfs/dev/null c 13
mknod -m 666 /rootfs/dev/tty c 40
mknod -m 666 /rootfs/dev/tty1 c 41
# Copy BusyBox to rootfs
cp -a busybox-1.33.2/_install/* /rootfs/
cp -a busybox-1.33.2/examples/bootfloppy/etc /rootfs/
# Remove linuxrc
rm -rf /rootfs/linuxrc
# Update fstab file
cat >/rootfs/etc/fstab <<EOF
# /etc/fstab - Static file system information
# Device Mount point Type Options Dump FSCK order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
mdev /dev tmpfs defaults 0 0
EOF
# Update inittab file
cat >/rootfs/etc/inittab <<EOF
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
EOF
# Add execute permission
chmod +x /rootfs/etc/inittab
# Update rcS file
cat >/rootfs/etc/init.d/rcS << 'EOF'
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev >/proc/sys/kernel/hotplug
mdev -s
echo
echo "****************BusyBox******************"
echo " Welcome to Minimal Linux"
echo "*****************************************"
EOF
chmod +x /rootfs/etc/init.d/rcS
# Create init file
cat >/rootfs/init <<EOF
#!/bin/sh
#
dmesg -n 1
mount -t sysfs sysfs /sys
mount -t proc proc /proc
mdev -s
if [ -f /sbin/init ]; then
exec /sbin/init
fi
exec /bin/sh
EOF
# Add execute permission
chmod +x /rootfs/init
# Update profile
cat >/rootfs/etc/profile << 'EOF'
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
EOF
4. Building the ISO Image
# Create iso directory
mkdir -p /iso/{boot,isolinux}
# Create initramfs file
cd /rootfs && find . | cpio -o -H newc | gzip -9 >/iso/boot/initrd.img
# Verify
lsinitrd /iso/boot/initrd.img
# Copy kernel
cp /boot/vmlinuz-$(uname -r) /iso/boot/vmlinuz
# Copy isolinux.bin
cp /usr/share/syslinux/isolinux.bin /iso/isolinux/
# Create isolinux.cfg
cat >/iso/isolinux/isolinux.cfg <<EOF
DEFAULT linux
PROMPT 0
TIMEOUT 50
LABEL linux
MENU LABEL Boot Linux
KERNEL /boot/vmlinuz
APPEND initrd=/boot/initrd.img
EOF
# Build iso
xorriso \
-as mkisofs \
-o busybox.iso \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -R -J /iso
5. Testing
Use VMware Workstation to create a virtual machine, select the ISO image, start the virtual machine, and enter the Linux system.