在ubuntu中创建根文件系统

在移植qt工程到开发板之前我们需要先创建根文件系统提供了程序运行所需的基础设施和资源。

1.在linux环境下下载busybox

将busybox的安装包放入minilinux的文件夹,执行下载的指令解压busybox。

使用命令 tar -vxjf ...

2.进入busybox

3.编译环境,确定是否安装了ncurses库

使用命令 apt-get install libncurses5-dev

4.支持中文(为了后续能够显示中文)

使用命令 vim libbb/printable_string.c

将31行45行中"c >= 0x7f"的代码注释掉!在这里插入图片描述(https://i-blog.csdnimg.cn/direct/71f56e9a27e345b6a5b4a9c1866926e1.png![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ac7a7aebb57644cb95e61e0b3b07fec9.png)

接着输入命令 vim libbb/unicode.c 进入makefile中继续进行修改

打开后查找函数unicode_conv_to_printable2,可以看到1022行和1030行也有"c >= 0x7f"的字符对应操作同样进行注释并修改

5.进入busybox界面

使用命令 make menuconfig

6.配置busybox

首先进入settings路径下

然后往下翻找到cross compiler prefix,进入该目录设置编译器

设置交叉编译的编译器 arm-linux-gnueabihf-

设置好编译器后接着回到settings目录下在 "--- Installation Options"栏找到"(./_install) Destination path for make install(NEW)"。去设置他的安装路径

改为.../system

然后回到setting界面空格选择"vi-style line editing commands(NEW)"选项

接着使用左右方向按键,选择"Exit",回到"Busybox Configuration"界面。如下图所示:方向键下翻找到"Linux Module Utilities --->"

接着回车进入,空格取消选择"Simplified modutils"

然后使用左右方向按键,选择"Exit",回到"Busybox Configuration"界面。方向键上翻找到"Settings --->

然后回车进入,方向键下翻找到"Support Unicod"和"Check LC_ALL, LC_CTYPE and $LANG environment variables",选中这两个选项,即使能 busybox 的 unicode 编码以支持中文

接着使用左右反方向按键,选择"Exit",回到"Busybox Configuration"界面,然后exit退出

7.编译busybox

接下来我们开始编译"Busybox",执行"make"命令,开始编译"Busybox

可能会报错没有安装交叉编译器,可以安装一下再make

编译成功的截图

编译完成了,接下来我们需要把编译生成的"二进制文件"安装到刚才我们指定的".../system"目录里面,安装二进制文件到".../system"目录,如下图,输入命令"make install"。

下图为"make install"命令执行完成的截图。

现在我们使用"cd .../system"命令,进入".../system"目录,看看里面安装的文件,如下图:

8.整理最小文件系统

上一节通过编译busybox生成了bin、sbin和usr这三个目录,以及 linuxrc 这个文件。busybox 的工作就完成了,还需要一些其他的文件完善文件系统。

(1)制作的文件系统还需要新建"dev,etc,lib,mnt,proc,sys,tmp,var"文件夹,使用命令"mkdir dev etc lib mnt proc sys tmp var",如下图:

(2)然后使用"cd etc"命令进入到刚才创建的"etc"文件夹,如下图:

(3)然后命令建立"eth0-setting"文件,并在"eth0-setting"文件里输入下面的内容:

cpp 复制代码
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

如下图:

(4)然后保存并退出"eth0-setting"文件,使用"chmod 755 eth0-setting"命令修改文件的权限,如下图:

(5)接着在etc目录下用"mkdir init.d"命令建立"init.d"文件夹,如下图:

(6)然后使用"cd init.d"命令进入到"init.d"文件夹,如下图:

(7)然后在"init.d"文件夹下面使用"vi ifconfig-eth0"命令建立"ifconfig-eth0"文件,如下图:

(8)然后在"ifconfig-eth0"文件中输入下面的内容

bash 复制代码
#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttymxc0
if [ -f /etc/eth0-setting ] ; then
      source /etc/eth0-setting
         if grep -q "^/dev/root / nfs " /etc/mtab ; then
                 echo -n NFS root ... > /dev/ttymxc0
         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/ttymxc0
         else
                 /sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
         fi
fi
 echo Done > /dev/ttymxc0

如下图:

(9)然后保存并退出"ifconfig-eth0"文件,使用"chmod 755 ifconfig-eth0"命令修改权限,如下图:

(10)接下来在"init.d"文件夹下使用"vi rcS"命令建立"rcS"文件,如下图:

(11)然后在"rcS"文件输入下面的内容(注意每行前面的行号不要复制):

bash 复制代码
 #! /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 iTOP-iMX6UL
 #/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
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
#ln -sf /dev/ttyS2 /dev/tty2
#ln -sf /dev/ttyS2 /dev/tty3
#ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0

如下图:

(12)然后保存并退出"rcS"文件,使用"chmod 755 rcS"命令修改"rcS"文件的权限,如下图:

(13)接下来使用"cd ..."命令返回到"init.d"文件夹的上一级目录"etc",如下图:

(14)接下来在"etc"目录下使用"vi passwd"命令建立文件"passwd",如下图:

(15)然后在新建立的"passwd"文件中输入下面的内容

bash 复制代码
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:

如下图:

(16)添加之后保存并退出"passwd"文件,使用"chmod 755 passwd"命令修改"passwd"文件的权限,如下图:

(17)然后使用"vi profile"命令在"etc"目录建立"profile"文件,如下图

(18)然后在"profile"文件中输入下面的内容(注意每行前面的行号不要复制)

bash 复制代码
# 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

如下图:

(19)然后保存并退出"profile"文件,使用"chmod 755 profile"命令修改"profile"文件的权限,如下图:

(20)接下来使用"mkdir rc.d"命令在"etc"目录建立文件夹"rc.d",如下图:

(21)使用"cd rc.d"命令进入到刚才建立的"rc.d"文件夹,如下图:

(22)接下来在"rc.d"目录下使用"mkdir init.d"命令建立"init.d"文件夹,如下图:

(23)然后使用"cd init.d"命令进入到刚才建立的"init.d"文件夹,如下图:

(24)接着在"init.d"文件夹,使用"vi netd"命令建立"netd"文件,如下图:

(25)然后在"netd"文件里面输入下面的内容(注意每行前面的行号不要复制):

bash 复制代码
#!/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

如下图:

(26)然后保存并退出"netd"文件,使用"chmod 755 netd"命令修改"netd"文件的权限,如下图:

(27)接着使用"cd .../.../.../"命令返回到"system"目录,如下图:

(28)接着使用"cd lib"命令进入到"lib"目录,如下图:

(29)Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以我们需要拷贝编译器里面的库文件到"lib"目录

(30)然后可以使用"ls"命令查看一下拷贝过来的库文件

(31)库文件拷贝完成后,使用"cd ..."命令返回到"system"目录,如下图:

(32)接下来使用"cd var"命令进入到"var"目录,如下图:

(33)然后使用"mkdir lib lock log run tmp"命令在"var"目录下建立"lib,lock,log,run,tmp"五个目录,可使用命令"ls"查看,如下图:

(34)至此,文件系统所需要的文件都已经创建好了,使用"cd .../.../"命令返回到"system"文件夹的上一级目录,如下图:

9.制作文件系统镜像及测试

如下图所示,是 busybox 制作的根文件系统。

然后使用压缩命令将文件系统打包,生成 rootfs.tar.bz2 文件

"tar -cjf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc sbin sys tmp usr var"

如下图所示:

可以看到"rootfs.tar.bz2"压缩包,这个就是制作好的最小 linux 系统镜像。

相关推荐
猪脚踏浪21 分钟前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠16 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush417 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52017 小时前
Linux 11 动态监控指令top
linux
不会C语言的男孩18 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈18 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫20 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_9618752420 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj20 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei20 小时前
linux 系统目录详解
linux·运维·服务器