首页 > 系统相关 >手把手教你构建嵌入式Linux根文件系统

手把手教你构建嵌入式Linux根文件系统

时间:2024-04-07 13:12:26浏览次数:24  
标签:bin 文件 手把手 dev 嵌入式 etc Linux echo 目录

/bin:此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、mv 等命令
/dev:device的缩写,此目录下的文件都是和设备有关的。在Linux下一切皆文件,即使是硬件设备,也是以文件的形式存在的,比如/dev/ttymxc0就表示串口0
/etc:此目录下存放着各种配置文件
/lib:library的简称,也就是库,此目录下存放着Linux所必须的库文件
/mnt:临时挂载目录,一般是空目录,可在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb,这样就可以将SD卡或者U盘挂载到/mnt/sd 或者/mnt/usb 目录中
/proc:此目录一般是空的,当Linux系统启动以后会将此目录作为proc文件系统的挂载点,proc是个虚拟文件系统,没有实际的存储设备。proc里面的文件都是临时存在的,一般用来存储系统运行信息文件
/usr:不是user的缩写,而是Unix Software Resource的缩写,即Unix操作系统软件资源目录。此目录下也存放着很多软件,一般系统安装完成以后此目录占用的空间最多
/var:此目录存放一些可以改变的数据
/sbin:此目录下存放一些可执行文件,但此目录下的文件或命令只有管理员才能使用,主要用于系统管理
/sys:系统启动以后此目录作为 sysfs文件系统的挂载点,sysfs是一个类似于 proc文件系统的特殊文件系统,sysfs也是基于RAM的文件系统,也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录
/opt:可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中

1.busybox

首先获取busybox源码
https://www.busybox.net/downloads/
我这边使用的是1.33.1的源码
解压源码进入顶层目录 make menuconfig
image.png

1.1 配置交叉编译工具链

Settings -> Cross compiler prefix
image.png

1.2 不要选择静态编译

Settings -> Build static binary (no shared libs)
用于选择是静态编译还是动态编译,静态编译不需要库文件,编译出来的库很大;动态编译要求根文件系统中有库文件,编译出来的 busybox 小很多。这里不使用静态编译,保持默认不选
image.png

1.3 添加vi command支持

Settings -> vi-style line editing commands
image.png

1.4 添加硬件热拔插支持

Linux System Utilities -> mdev
image.png

1.5 为busybox添加中文支持

image.png
修改libbb/printable_string.c
在printable_string2函数中
image.png
修改libbb/unicode.c
在unicode_conv_to_printable2函数中
image.png
打开make menuconfig勾选Support Unicode
和Check $LC_ALL, $LC_CTYPE and $LANG environment variables
Settings -> Support Unicode
image.png

1.6 编译busybox

在busybox源码顶层目录下运行make
image.png
编译完成后通过make install CONFIG_PREFIX=
来安装到指定路径
image.png
image.png
成功安装啦,注意linuxrc文件是用来挂载根文件的千万不要删掉

1.7 完善busybox根文件系统

1.7.1 完善目录

通过编译 busybox 生成了 bin、 sbin 和 usr 这三个目录, 以及 linuxrc 这个文件。 busybox 的工作就完成了, 还需要一些其他的文件完善文件系统
使用 mkdir 分别建立 dev,etc,lib,mnt,proc,sys,tmp,var目录

mkdir dev etc lib mnt proc sys tmp var

image.png

1.7.2 创建eth0-setting文件

在/etc目录下建立“ eth0-setting” 文件, 并在“ 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

并chmod 755 eth0-setting

1.7.3 创建init.d目录并创建ifconfig-eth0

在/etc目录下建立init.d目录并创建ifconfig-eth0文件
在ifconfig-eth0里面添加下面内容

#!/bin/sh

echo -n Try to bring eth0 interface up......>/dev/ttymxc0
# echo的节点要根据芯片来设置
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

并chmod 755 ifconfig-eth0

1.7.4 创建rcS文件

在init.d文件夹下创建rcS文件,他是开机启动脚本
在rcS文件中输入以下内容

#! /bin/sh
#初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序
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

并chmod 755 rcS

1.7.5 创建passwd文件

返回到“init.d” 文件夹的上一级目录etc,创建passwd文件,在passwd里面添加

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

并chmod 755 passwd
passwd 文件是用来保存用户的信息的,是一个纯文本文件。格式如下:

name:password:uid:gid:comment:home:shell
image.png

1.7.6 创建profile文件

在/etc目录下创建profile文件并输入下面内容

# Ash profile
# vim: syntax=sh

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1 
#发生段错误的时候不产生core文件
#并且输出的错误信息不显示在显示器上

USER="`id -un`" #获得user
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

并chmod 755 profile

1.7.7 创建netd文件

在/etc 目录下创建rc.d文件夹, 在rc.d文件夹下创建init.d文件夹, 在init.d文件夹中创建netd文件

mkdir -p rc.d/inid.d
cd rc.d/init.d
touch netd

在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

并chmod 755 netd

1.7.8 创建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

1.7.9 将交叉编译工具中的 lib 库复制到 lib 下

cp -d /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/*so* ./lib

库文件 ld-linux-armhf.so.3 在根文件系统中不能作为符号链接文件, 需要修改为普通库文件。 否则在根文件系统中可执行程序不能执行。 先将ld-linux-armhf.so.3 删掉, 重新拷贝一份到 rootfs/lib 目录下。 执行下列命令

rm lib/ld-linux-armhf.so.3 
cp /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-n eon-poky-linux-gnueabi/lib/ld-linux-armhf.so.3 ./lib/ 

1.7.10 在etc目录下创建fstab文件并输入下文内容

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

1.8 打包根文件系统

image.png
经过前面的步骤我们已经制作完成了一个最小 linux 文件系统, 然后我们在文件系统目录下( /home/topeet/work/busybox/busybox-1.29.0/rootfs) 执行“ sudo tar jcvf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc root sbin sys tmp usr” 压缩命令, 生成 rootfs.tar.bz2 文件系统镜像

2. buildroot

我这边使用的是buildroot-2023.02.9
安装依赖包

sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute -y

2.1 Target options设置

设置目标芯片的架构
Target options
image.png
按照imx6ull的信息进行填写即可

2.2 Toolchain

image.png

2.3 Build options设置

主要关注这三个选项
image.png
知道是干啥的就行,不用改他

2.4 System configuration设置

image.png

2.5 设置输出格式

Filesystem images -> Compression methon
image.png
对于imx6芯片他的根文件系统使用bz2格式

然后就可以make了
image.png
由于ELFBOARD使用的内核版本是4.1.15,要在buildroot中配置一致
首先将4.1.15转成hex 04010F, 然后再把hex转成十进制
image.png
是262415
进入交叉编译器目录 libc/usr/include/linux/version.h里面
image.png

3.buildroot好用的包

3.1 dropbear -- 轻量级的SSH

3.2 gesftpserver -- 嵌入式系统的SFTP(安全文件传输协议)服务器实现

在filezila中可以通过sftp协议跟开发板进行文件传输

3.3 Qt5 -- Qt5 GUI库

image.png
选中Qt5之后进入Qt5设置
首先说几个必须的选项
gui module -> widgets module
gui module -> Default graphical platform 输入 linuxfb
fontconfig support
GIF support
JPEG support
image.png
还有触摸支持
image.png

标签:bin,文件,手把手,dev,嵌入式,etc,Linux,echo,目录
From: https://www.cnblogs.com/TheGathering/p/18118843

相关文章

  • Linux云计算架构:颠覆性创新还是过度炒作?
    Linux云计算架构:颠覆性创新还是过度炒作?一、Linux云计算架构的崛起与影响Linux云计算架构作为当前IT领域的热门话题,其崛起速度之快令人瞩目。随着企业对云计算需求的不断增长,Linux凭借其开源、灵活和安全的特性,在云计算市场中占据了重要地位。Linux云计算架构的广泛应用,不仅......
  • Linux简单安装和命令
    1.在VMwareWorkstation安装2.简单设置命令root账户设置切换用户su<用户名>#切换后所在目录不变su-<用户名>#切换后所在目录变成用户家目录永久设置主机名hostnamectlset-hostname<主机名>查看版本内核版本uname-r发行版本cat/etc/os......
  • 【保姆级教学】手把手教你完成机械设计基础大作业,运用解析法设计滚子直动凸轮,并校验最
    核心代码,记得看注释,哪些地方要改注释已经标明clc;clear;closeall;%%pic_num=1;%滚子直动从动件盘形凸轮phi=120;%回程运动角(单位:角度,下同,以下参数需要根据题目修改)phis=60;%远休止角phi_=120;%推程运动角phis_=60;%近休止角h=14;%升程r0=70;%基圆半径omega=0......
  • (免费赠源码)计算机毕设题目:基于微信小程序的旅游服务系统 77397(开题答辩+程序定制+全套
    springboot旅游服务系统小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,旅游服务系统小程序管理系统被用户普遍使用,为方便用户能够可以随时进行旅游服务系统小......
  • 计算机毕业设计项目,SSM健康生活博客小程序 23497(开题答辩+程序定制+全套文案 )上万套实
    SSM健康生活博客小程序摘 要本文设计了一种基于SSM框架的健康生活博客小程序,为人们提供了运动视频教学、博客信息分享,用户能够方便快捷地查看资讯、搜索健康方面的相关信息、还能发布个人生活博客等。健康生活博客小程序采取面对对象的开发模式进行软件的开发和硬体的架设......
  • 计算机毕业设计项目,springboot+校园兼职系统 22161(开题答辩+程序定制+全套文案 )上万套
    Springboot校园兼职系统的设计与实现摘要随着经济的发展,竞争的激烈,就业形式日趋严峻,为了在毕业后能够更好地适应社会,很多在校大学生选择了从事兼职工作,一方面缓解了家庭的经济压力,更重要的是在一定程度上接触了社会,获取了一些工作经验,提高了自己的综合实力。大学生兼职已......
  • 蓝桥杯嵌入式2017年第八届省赛主观题解析
    1 题目2  代码/*USERCODEENDHeader*//*Includes------------------------------------------------------------------*/#include"main.h"#include"rtc.h"#include"tim.h"#include"gpio.h"/*Privateincludes--......
  • 在Linux中,内核模块是什么以及如何加载和卸载它们?
    在Linux中,内核模块是内核的一部分,但它们不是编译进内核的代码。这些模块可以在运行时动态地加载到内核中,或者从内核中卸载,从而扩展或修改内核的功能而无需重启系统。内核模块的使用提供了灵活性和易于维护的特点。1.内核模块的作用扩展内核功能:内核模块允许在不修改内核源代码......
  • 在Linux中,RAID级别和它们的用途是什么?
    RAID(RedundantArrayofIndependentDisks,独立磁盘冗余阵列)是一种将多个磁盘组织在一起,通过不同的数据分布和冗余策略,以提高数据可靠性、可用性和/或性能的技术。以下是一些常见的RAID级别及其用途:RAID0(条带化):数据分布:数据块均匀分布在多个磁盘上,实现数据的并行读写,提高......
  • 在Linux中,什么是系统监控和性能分析工具?举例说明。
    在Linux中,系统监控和性能分析工具是用来跟踪、评估和优化系统运行状况的软件。这些工具可以帮助系统管理员了解系统的资源使用情况,识别性能瓶颈,并采取相应的措施来提高系统的效率和稳定性。1.系统监控工具系统监控工具主要用于实时跟踪系统的运行状态,包括CPU使用率、内存使用、......