制作根文件系统

项目需要制作glibc的根文件系统,这里记录一下。

busybox:https://busybox.net/

make menuconfig
设置交叉编译器 setting->cross compiler prefix(敲首字母就能查找)->添加交叉编译器路径
setting的build static lib不要勾选
勾选vi-style line editing commands
勾选Linux System Utilities->medv(热拔插)
添加中文支持

vim libbb/printable_string.c
31、32行以及35行对中文字符的限制去掉
vim libbb/unicode.c
1030、1038行

勾选setting->Support Unicode和下面一项
image

编译
make & make install CONFIG_PREFIX=../sys
在上一级目录中的sys下
image
就是我们需要的一部分目录
创建目录结构mkdir dev etc lib lib64 mnt proc sys tmp var
主要是etc和lib两个目录需要配置

lib

将交叉编译工具链的libc下所有文件拷贝到lib文件夹下

etc

网络配置文件

vim eth0-setting & chmod 777 eth0-setting

IP=192.168.1.230
MASK=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90

读取网络配置文件eth0-setting的文件

mkdir init.d & vim ifconfig-eth0 & chmod 777 ifconfig-eth0

#!/bin/sh
echo -n Try to bring eth0 interface up……>/dev/ttyS0  #向串口设备打印,具体到开发板的串口设备
if [ -f /etc/eth0-setting ] ; then
    source /etc/eth0-setting
    if grep -q "^/dev/root / nfs "/etc/mtab"; then
        echo -n NFS root … > /dev/ttyS0
    else
#这里就是读取设置网络配置
        ifconfig eth0 down
        ifconfig eth0 hw ether $MAC
        ifconfig eth0 $IP netmask $Mask up
        route add default gw $Gateway
    fi
        echo nameserver $DNS > /etc/resolv.conf

else
    if grep -q "^/dev/root / nfs "/etc/mtab ; then
        echo -n NFS root … > /dev/ttyS0
    else
        /sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
    fi
fi

echo Done > /dev/ttyS0

init.d下创建开机启动脚本rcS

vim rcS & chmod 777 rcS

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname OpenHarmony

mount -a

echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s

mkdir -p /dev/pts
/bin/mount -n -t devpts none /dev/pts -o mode=0622
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp

syslogd

/etc/rc.d/init.d/netd start

mkdir /mnt/disk
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
sleep 1

echo "**********************" > /dev/tty0
echo "http://topeetboard.com" > /dev/tty0
echo "**********************" > /dev/tty0

创建密码文件

cd etc & vim passwd & chmod 777 passwd

root:x:0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:

格式如下
image

创建profile文件

cd etc & vim profile & chmod 777 profile

# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH

创建netd文件

mkdir rc.d & cd rc.d & vim netd & chmod 777 netd
这是启动了一个守护进程

#!/bin/sh

base=inetd

# See how we were called.

case "$1" in
    start)
        /usr/sbin/$base
        ;;
    stop)
        pid=`/bin/pidof $base`
        if [ -n "$pid" ]; then
            kill -9 $pid
        fi
        ;;
esac

exit 0

创建inittab文件

init进程读取的配置文件
image
cd etc & vim inittab & chmod 777 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

创建fstab文件

cd etc & vim fstab & chmod 777 fstab

proc    /proc   proc    defaults    0 0
tmpfs   /tmp    tmpfs   defaults    0 0
sysfs   /sys    sysfs   defaults    0 0

创建medv.conf

cd etc & vim mdev.conf

sd[a-z][0-9] 0:0 666 @ /etc/hotplug/udisk_inserting
sd[a-z]     0:0 666 $ /etc/hotplug/udisk_removing

etc下创建hotplug
vim udisk_inserting

#!/bin/sh
echo "usbdisk insert!" > /dev/console
if [ -e "/dev/$MDEV" ]; then
    mkdir -p /mnt/usbdisk/$MDEV
    mount /dev/$MDEV /mnt/usbdisk/$MDEV
    echo "/dev/$MDEV mounted in /mnt/usbdisk/$MDEV" > /dev/console
fi

vim udisk_removing

#!/bin/sh
echo "usbdisk remove!" > /dev/console
umount -l /mnt/usbdisk/sd*
rm -rf /mnt/usbdisk/sd*

创建mtab文件

cd etc & vim mtab & ln -s /proc/mounts mtab
image

打包

dd if=/dev/zero of=rootfs.img bs=1M count=1024
mkfs.ext4 rootfs.img
sudo mount rootfs.img rootfs
sudo cp sys/* ./rootfs -rfpd
sudo umount rootfs

在openharmony中挂载文件系统

这里我们选择挂载在原来的文件系统上,可以使用原系统的设备。

创建回环设备loop0
mknod /dev/loop0 b 7 0
chmod 660 /dev/loop0

将loop0设备绑定到rootfs.img文件上
losetup /dev/loop0 /data/local/tmp/rootfs.img

在/mnt下创建rootfs用于挂载我们的文件系统
mkdir -p /mnt/rootfs

挂载
mount /dev/loop0 /mnt/rootfs/

image

绑定必要的设备

mount --bind /dev /mnt/rootfs/dev
mount --bind /proc /mnt/rootfs/proc
mount --bind /sys /mnt/rootfs/sys
mount --bind /dev/pts /mnt/rootfs/dev/pts

卸载

umount /mnt/rootfs/dev/pts
umount /mnt/rootfs/dev
umount /mnt/rootfs/proc
umount /mnt/rootfs/sys
umount /mnt/rootfs

losetup -d /dev/loop0

使用chroot切换根文件系统

chroot /mnt/rootfs
image

运行时发现glibc版本过低,换一个高版本的编译工具链

posted @ 2025-07-18 23:25  横渡大海的神仙鱼  阅读(10)  评论(0)    收藏  举报