迅为iTOP-4412精英版之根文件系统移植

准备工作

虚拟机:VM-Ware 16.2.3
操作系统:Ubuntu Linux 16.04
交叉编译器:arm-linux-gcc-4.6.4
工作文件夹:/home/work
搭建配置好交叉编译环境,完整搭建配置过程可参照下述博文:

迅为iTOP-4412之Android 4.0系统编译环境的搭建(完整版)-CSDN博客  https://blog.csdn.net/Eva20192020/article/details/134668004?spm=1001.2014.3001.5502
提示:虚拟机中解压完后的原打包文件建议删除,可以节约虚拟机空间。

概述

文件系统可以简单理解为两个部分,一个是文件,另一个是系统。文件系统是一个用来组织和管理文件的系统,有了文件系统之后,就可以轻松操作存储在存储介质上的文件,比如文件的增、删、查、改等基本操作。文件系统的格式有很多种(fat32、ext2、ext3、ntfs等)。

根文件系统:最顶端称为根,在Linux上用“ \ ”表示,然后将一个按照特定目录组成的文件系统挂载到根上,这个系统就叫做根文件系统。

Busybox是一个集成大量Linux命令的工具,例如ls,cat,cp等命令,使用busybox可以很容易构建出根文件系统需要的命令。

一、编译Linux命令集

1、获取BusyBox源码

Busybox官方下载地址:BusyBox 
busybox功能简介 busybox的作用和功能_/bin/busybox-CSDN博客

 busybox简介

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

2、虚拟机里BusyBox操作

在/home/work文件夹中新建rootfs文件夹,将下载的busybox-1.36.1.tar.bz2压缩包拷贝到该文件夹,并解压,具体操作如下图所示:

解压结果如下:

3、编辑Makefile

进入Busybox根文件夹,用gedit打开Makefile文件,如下图所示:

保存退出。 

4、打开Busybox配置菜单

输入make menuconfig,打开编译配置菜单,如下图所示:

5、编译Busybox

在busybox的设置菜单中,选中静态编译系统减少出错。如下图所示:

返回顶层菜单。

6、裁剪Linux命令

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

(1)裁剪sync命令

进入Coreutils菜单,去掉选项sync前的星号,如下图所示:

(2)裁剪nsenter命令

进入Linux System Utilities菜单,去掉选项nsenter前的星号,如下图所示:

(3)裁剪nandwrite与nanddump命令

进入Miscellaneous Utilities菜单,去掉选项nandwrite、nanddump前的星号,如下图所示:

保存退出Busybox配置菜单。

7、编译Linux命令

退到Busybox根文件夹,用make进行编译,如下图所示:

用make install命令再次编译,将整合的命令 文件存入_install文件夹,如下图所示:

 至此,Linux命令集编译完毕,结果如下图所示:

  生成的三个文件夹和一个文件后面使用。

二、创建Linux系统根文件

1、创建linux根文件夹

在rootfs文件夹中新建system文件夹,进入system文件夹后,使用命令“mkdir dev etc lib mnt proc sys tmp var”创建需要的文件夹,命令过程如下图所示:

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

将Busybox中_install文件夹中的全部内容拷贝到system根文件夹(当前目录)中,使用命令“ cp -rf ../busybox-1.26.2/_install/* ./ ”,如下图所示:

3、新建登录权限文件

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

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

操作命令如下图所示:

保存退出。 

/etc/passwd文件存放的是用户的信息。

此时我们新建了四个用户,超级用户的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文件,设置后会影响到所有用户
在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 hotplug/usb ”命令创建usb文件夹,如下图所示:

 说明

mkdir -p是一个Bash shell中的命令,用于创建目录。与普通的mkdir命令不同,mkdir -p命令可以创建多层目录,即使中间的目录不存在也可以创建。

mkdir -p命令的主要优点是它可以帮助您快速创建多层目录,而无需手动创建每个目录。这在编写脚本或在命令行中执行多个命令时非常有用。

请注意,mkdir -p命令不会覆盖现有目录。如果您尝试创建一个已经存在的目录,则mkdir -p命令将忽略该命令,并继续创建其他目录。

进入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

操作过程如下图所示:

保存退出。

继续在usb文件夹下用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文件夹,操作命令为  "  cp -rf usr/local/bin/make_ext4fs ./  " 。操作如下图所示:

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 文件系统镜像的制作。生成的system.img拷贝到fastboot烧写工具根目录下,利用cmd.exe完成烧写即可。

如果出现下图错误提示:

 按照提示进行操作:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值