基于iTOP-4412开发板(精英版)的linux 4.14.2根文件系统移植

准备工作

虚拟机:VM-Ware 15.0 pro
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc 4.6.2g
BusyBox:busybox-1.26.2.tar
工作文件夹:/home/用户名/work

一、编译Linux命令集

1、BusyBox源码获取

Busybox官方下载地址:https://busybox.net/
busybox功能简介https://blog.csdn.net/feelinghappy/article/details/92133067
在这里插入图片描述
busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小。我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中busybox有非常广的应用。另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接。

2、解压缩BusyBox

在工作文件夹中新建rootfs文件夹,将下载的busybox-1.26.2.tar.bz2压缩包拷贝到该文件夹解压:
在这里插入图片描述
解压结果:
在这里插入图片描述

3、修改Makefile

进入Busybox根文件夹,用gedit打开Makefile文件
在这里插入图片描述
修改190行和164行对应的架构(arch)和交叉编译器(CROSS_COMPILE)
在这里插入图片描述
存盘退出。

4、打开Busybox配置菜单

输入make menuconfig,打开编译配置菜单:
在这里插入图片描述

5、Busybox编译设置

在busybox的设置菜单中,选中静态编译系统减少出错。如图:
在这里插入图片描述
返回顶层菜单。

6、裁剪Linux命令

Busybox支持上百个linux命令,在实际应用中未必都能用到,可以把不用的裁剪掉节省存储空间。另外arm-linux-gcc 4.6.2交叉编译器默认情况下有几个命令编译无法通过,所以也要裁剪掉。

a、裁剪掉sync命令

进入Coreutils菜单,去掉选项sync前的星号
在这里插入图片描述

b、裁剪掉nsenter命令

进入Linux System Utilities菜单,去掉选项nsenter前的星号
在这里插入图片描述

c、裁剪掉nandwrite与nanddump命令

进入Miscellaneous Utilities菜单,去掉选项nandwrite、nanddump前的星号
在这里插入图片描述

7、编译Linux命令

退到busybox根文件夹用make编译,结果如图:
在这里插入图片描述
用make install命令再次编译,将整合的命令文件存入_install文件夹,结果如图:
在这里插入图片描述
至此,Linux命令集编译完毕,结果如下图:
在这里插入图片描述
生成的三个文件夹和一个文件后面使用。

二、创建Linux系统根文件

1、新建根文件夹

在rootfs文件夹中新建system文件夹,进入system文件夹后使用命令“mkdir dev etc lib mnt proc sys tmp var”创建linux根文件夹,结果如图:
在这里插入图片描述

2、拷贝Linux命令到根文件夹

将Busybox中_install文件夹中的全部内容拷贝到system文件夹,如图:
在这里插入图片描述

3、新建登录权限文件

进入到刚才创建的etc文件夹里,新建passwd文件并输入以下内容:

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

此时我们新建了四个用户,超级用户的uid为0,在/etc/passwd里面有很多伪用户,这些用户是不能登入的,他们的uid在1-499之间,安装完系统就缺省的添加了这些用户。UID为0的用户就是超级用户。
在这里插入图片描述

4、新建profile文件

profile文件是有关Linux环境变量的文件,在etc文件夹里新建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]# '
PS1='\h:\w\$ '
PS2='>'
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

/etc/profile:是全局profile文件,设置后会影响到所有用户
/home/username/.profile或.bash_profile是针对特定用户的,可以针对用户,来配置自己的环境变量。
在profile文件添加或修改的内容需要注销系统才能生效。
(注意:profile是unix上才有的;bash_profile是Linux下有的(Linux下,用户目录没有.profile文件)/home/userName/.bash_profile,是隐藏文件,需要使用ls -alh才能看到的。)
Bash登陆(login)的时候,profile执行的顺序:先执行全局/etc/profile 接着bash会检查使用者的HOME目录中,是否有 .bash_profile 或者 .bash_login或者 .profile,若有,则会执行其中一个,执行顺序为.bash_profile 最优先 > .bash_login其次 > .profile

常见的环境变量
  PATH:决定了shell将到哪些目录中寻找命令或程序
  HOME:当前用户主目录
  MAIL:是指当前用户的邮件存放目录。
  SHELL:是指当前用户用的是哪种Shell。
  HISTSIZE:是指保存历史命令记录的条数。
  LOGNAME:是指当前用户的登录名。
  HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
  LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
  PS1:是基本提示符,对于root用户是#,对于普通用户是$。
  PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt 😃 ”。
  # PS1=” Hello,My NewPrompt 😃 “
(注意:Linux profile文件在系统启动时将被运行。可以在里面加入其他命令,但是一定要加正确,不然的话系统会启动不起来的。)

5、新建启动脚本文件

在etc文件夹里创建文件夹init.d,进入init.d文件夹,用gedit创建rcS文件,输入以下内容:

#!/bin/sh 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

# boot level
runlevel=S 
prevlevel=N
umask 022 
export PATH runlevel prevlevel

# 启动时屏蔽中断 
trap ":" INT QUIT TSTP 

IP=192.168.1.200
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90

# 挂载系统文件夹 
[ -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

#  创建DEV子文件夹 
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

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
sleep 1

echo "                        " > /dev/ttySAC2
echo "Starting networking" > /dev/ttySAC2
echo "                        " > /dev/ttySAC2
sleep 1

echo "                        " > /dev/ttySAC2
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
echo "                        " > /dev/ttySAC2
sleep 1

ifconfig eth0 down 
ifconfig lo 127.0.0.1
ifconfig eth0 hw ether $MAC 
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
echo nameserver $DNS > /etc/resolv.conf

#上面一段中usb0为网卡名称,以开发板ifconfig -a命令为准(与linux版本有关)
echo Done > /dev/ttySAC2

/bin/hostname S601

sleep 1
echo "*************************************" > /dev/ttySAC2
echo "       601 embedded Laboratry        " > /dev/ttySAC2
echo "*************************************" > /dev/ttySAC2
sleep 1

6、创建U盘热插拔脚本文件

在etc文件夹里创建mdev.conf 文件,输入以下内容:

sd[a-z][0-9] 0:0 666 @/etc/hotplug/usb/udisk_insert
sd[a-z] 0:0 666 $/etc/hotplug/usb/udisk_remove

在这里插入图片描述

在etc文件夹里输入mkdir -p etc/hotplug/usb 命令创建usb文件夹,如图:
在这里插入图片描述
进入usb文件夹,用gedit udisk_insert命令创建udisk_insert脚本输入以下内容:

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

在这里插入图片描述

用gedit udisk_remove命令创建udisk_remove脚本输入以下内容:

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

在这里插入图片描述

7、修改根文件系统权限

进入rootfs文件夹,修改system文件夹内所有文件权限:
在这里插入图片描述

三、创建文件系统镜像

1、解压镜像文件制作工具

拷贝制作工具压缩包“linux_tools.tgz”到 rootfs目录下,使用解压命令“tar -zxvf linux_tools.tgz”解压,如下图所示。
在这里插入图片描述
解压完成后,到里面的bin文件夹把make_ext4fs文件拷贝回到rootfs文件夹

2、制作镜像文件

在rootfs文件夹中输入命令:./make_ext4fs -s -l 314572800 -a root -L linux system.img system

-a root 是指这个img是用于Linux系统(若为-a system即表示为android系统,挂载点即是/system。使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限)
-l 3141572800 代表的是分区大小
-s 就是生成ext4的S模式制作(使用gzip压缩)
-L 创建的镜像标签
最后跟上system.img为创建的镜像名称,system为原目录位置

生成 system.img 文件系统镜像过程如下图所示:
在这里插入图片描述
现在已经完成了 linux 文件系统镜像的制作。
烧录,启动成功:

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

气血龙渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值