当前位置: 首页 > article >正文

busybox移植:全能脚本版

因为有个ssh的问题要分析,所以移植busybox。因为干净,避免其他的问题的干扰。本篇文章将初始化需要创建的内容全都放到了一个脚本文件中,极大的简化了根文件系统的创建过程。

源码下载 

官网:

https://busybox.net/

下载最新的版本:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2

解压文件:

tar jxvf busybox-1.36.1.tar.bz2 

编译脚本 build.sh

export PATH=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
MAKE="make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"
if [ -f ".config" ];then
    echo ".config is found"
else
    echo ".config is not found"
    $MAKE defconfig
fi
$MAKE menuconfig
$MAKE -j`nproc`
rootpath=`pwd`
install_path=`pwd`/myrootfs
echo $install_path
mkdir -p $install_path
$MAKE install CONFIG_PREFIX=$install_path
cp `pwd`/done.sh $install_path
cd $install_path
$install_path/done.sh
tar -vcjf rootfs.tar.bz2 *
mv rootfs.tar.bz2 $rootpath
cd $rootpath
ls -lsh rootfs.tar.bz2 -lsh
mkdir -p ~/nfsroot/
cp $install_path ~/nfsroot/ -rfu
ls -lshd ~/nfsroot/myrootfs

执行完脚本后,进入myrootfs/bin目录,查看busybox的格式,如下: 

myrootfs/bin$ file busybox 
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=ae8a8e6bc4b577519d81cfb7c46e2814c2767415, stripped

编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中, rootfs 目录内容如下所示:
 

myrootfs$ ls
bin  linuxrc  sbin  usr

可以看出, rootfs 目录下有 bin、 sbin 和 usr 这三个目录,以及 linuxrc 这个文件。前面说过 Linux 内核 init 进程最后会查找用户空间的 init 程序,找到以后就会运行这个用户空间的 init 程序,从而切换到用户态。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。

busybox 的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,我们继续来完善 rootfs。

完成初始配置的脚本done.sh

该脚本完成如下功能

1 必要的文件夹的创建

2 必要的初始化文件和文件系统的挂载配置

编写创建目录以及复制库的脚本:

CUR_DIR=`pwd`
mkdir -p $CUR_DIR/sys
mkdir -p $CUR_DIR/sbin
mkdir -p $CUR_DIR/tmp
mkdir -p $CUR_DIR/root
mkdir -p $CUR_DIR/dev
mkdir -p $CUR_DIR/proc
mkdir -p $CUR_DIR/lib
mkdir -p $CUR_DIR/var
mkdir -p $CUR_DIR/run
mkdir -p $CUR_DIR/mnt
mkdir -p $CUR_DIR/home/root
mkdir -p $CUR_DIR/opt
mkdir -p $CUR_DIR/etc
mkdir -p $CUR_DIR/usr/lib
mkdir -p $CUR_DIR/home/root/bin
mkdir -p $CUR_DIR/mmcblk1p2
mkdir -p $CUR_DIR/mmcblk1p1
mkdir -p $CUR_DIR/dev/pts/
mkdir -p $CUR_DIR/etc/init.d/

touch $CUR_DIR/etc/init.d/rcS
touch $CUR_DIR/etc/fstab
touch $CUR_DIR/etc/inittab
touch $CUR_DIR/etc/resolv.conf
chmod +x $CUR_DIR/etc/init.d/rcS
echo "CUR_DIR=$CUR_DIR"

if [ -z "$CUR_DIR" ];then
	echo "dir is null"
	exit 0
else
	echo "dir not null"
fi
ARM_GCC_PATH=/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/*.a  $CUR_DIR/lib/ -d

ls -l $CUR_DIR/lib/ld-linux-armhf.so.3
rm $CUR_DIR/lib/ld-linux-armhf.so.3
cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3 $CUR_DIR/lib/
ls -l $CUR_DIR/lib/ld-linux-armhf.so.3

cp $ARM_GCC_PATH/arm-linux-gnueabihf/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/lib/*.a  $CUR_DIR/lib/ -d

cp $ARM_GCC_PATH/arm-linux-gnueabihf/libc/usr/lib/*so* $ARM_GCC_PATH/arm-linux-gnueabihf/libc/usr/lib/*.a  $CUR_DIR/usr/lib/ -d
du $CUR_DIR/lib -sh
du $CUR_DIR/usr/lib -sh
du $CUR_DIR -sh

cat << EOF > $CUR_DIR/etc/init.d/rcS
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:\$PATH
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
mount -a

mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -t ext4 /dev/mmcblk1p2 /mmcblk1p2/
mount -t vfat /dev/mmcblk1p1 /mmcblk1p1/
#ifconfig eth1 up
#ifconfig eth1 192.168.5.103
#udhcpc -i eth1
#ifconfig eth1 192.168.5.103 netmask 255.255.255.0
#route add default gw 192.168.5.1 dev eth1
EOF


cat << EOF > $CUR_DIR/etc/fstab
proc	/proc	proc	defaults	0	0
tmpfs	/tmp	tmpfs	defaults	0	0
sysfs	/sys	sysfs	defaults	0	0
EOF

cat << EOF > $CUR_DIR/etc/inittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
EOF

cat << EOF > $CUR_DIR/etc/resolv.conf
nameserver 114.114.114.114
nameserver 0.0.0.0
EOF
echo "finish"

 测试:

设置bootcmd和bootargs

setenv bootcmd 'fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 82000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 82000000;'
挂载NFS文件系统

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.5.111:/home/lkmao/nfsroot/myrootfs,proto=tcp rw ip=192.168.5.103:192.168.5.111:192.168.5.1:255.255.255.0:::' 

挂载emmc的文件系统:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

测试结果:

小结 


http://www.kler.cn/a/301217.html

相关文章:

  • 【Spring】循环引用 解决流程,只用一二级缓存?
  • html实体字符
  • 任务管理功能拆解——如何高效管理项目任务?
  • 【Redis】使用redis实现登录校验功能
  • Ajax的相关内容
  • PostgreSQL技术内幕18:物理备份工具pg_basebackup
  • 在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(下篇)
  • 3.Kubernetes资源对象之pod
  • 828华为云征文|华为云Flexus X实例docker部署最新版禅道构建属于自己的项目管理平台
  • 文心智能体应用:美国旅游助手的诞生
  • 【进展报告】9.9-9.12
  • Cargo 入门
  • 远程控制软件有哪些?不多,给你奉上这6款神仙软件
  • nodeJS学习笔记——包npm(2)
  • vue3利用ref操作dom元素
  • MySQL 的关键字
  • 高级 ECharts 技巧:自定义图表主题与样式
  • 详解Redis的AOF持久化方式以及aof日志重写配置以及对redis中的GEO地理位置数据类型命令的应用示例
  • 2023下半年软考网络规划
  • 【信号】信号的保存
  • ffmpeg面向对象-rtsp拉流相关对象
  • 为什么不写注释?写“为什么不”注释?
  • pdf删除一页怎么删除?5种方法详细讲解,pdf删除页面实用技巧分享!
  • 【iOS】push和present的区别
  • echarts 多个3D柱状图
  • Python爱心射线(完整代码)