环境
操作平台:UBuntu18.04 64位
目标平台:Linux 2.6.35.7 ARM Cortex-A(arm v7)
编译工具:arm-2009q3
准备工作
一张SD卡
一、制作根文件系统
1、解压busybox-1.34.1.tar.bz2源,并进入到源码中
tar -jxvf busybox-1.34.1.tar.bz2
cd busybox-1.34.1
2、修改Makefile文件
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
ARCH = arm
3、配制生成 .config文件
make defconfig
此命令会在当前目录中生成 .config隐藏文件
4、修改配制文件
make menuconfig
要修改的项目如下:
Linux Module Utilities --->
[ ] Simplified modutils
[*] depmod (27 kb)
[*] insmod (22 kb)
[*] lsmod (1.9 kb)
[*] modinfo (24 kb)
[*] modprobe (28 kb)
[*] rmmod (3.3 kb)
Linux System Utilities --->
[*] mdev (17 kb)
[*] Support /etc/mdev.conf
[*] Support subdirs/symlinks
[*] Support regular expressions substitutions when renaming device
[*] Support command execution at device addition/removal
[*] Support loading of firmware
[ ] nsenter (6.5 kb)
Coreutils --->
[ ] sync (3.8 kb)
5、make
make
出现如下错误:
networking/libiproute/ipaddress.c: In function 'print_addrinfo':
networking/libiproute/ipaddress.c:345: error: 'IFA_F_DADFAILED' undeclared (first use in this function)
networking/libiproute/ipaddress.c:345: error: (Each undeclared identifier is reported only once
networking/libiproute/ipaddress.c:345: error: for each function it appears in.)
scripts/Makefile.build:197: recipe for target 'networking/libiproute/ipaddress.o' failed
make[1]: *** [networking/libiproute/ipaddress.o] Error 1
Makefile:745: recipe for target 'networking/libiproute' failed
make: *** [networking/libiproute] Error 2
符号 IFA_F_DADFAILED 末定义,解决方法进入源码修改代码,修改如下:
vi networking/libiproute/ipaddress.c
修改前:
340 }
341 if (ifa_flags & IFA_F_TENTATIVE) {
342 ifa_flags &= ~IFA_F_TENTATIVE;
343 printf("tentative ");
344 }
345 if (ifa_flags & IFA_F_DADFAILED) {
346 ifa_flags &= ~IFA_F_DADFAILED;
347 printf("dadfailed ");
348 }
349 if (ifa_flags & IFA_F_DEPRECATED) {
350 ifa_flags &= ~IFA_F_DEPRECATED;
351 printf("deprecated ");
352 }
修改后:
340 }
341 if (ifa_flags & IFA_F_TENTATIVE) {
342 ifa_flags &= ~IFA_F_TENTATIVE;
343 printf("tentative ");
344 }
345
346 if (ifa_flags & IFA_F_DADFAILED) {
347 ifa_flags &= ~IFA_F_DADFAILED;
348 printf("dadfailed ");
349 }
350
351 if (ifa_flags & IFA_F_DEPRECATED) {
352 ifa_flags &= ~IFA_F_DEPRECATED;
353 printf("deprecated ");
354 }
继续 make,成功编译!
6、make install
make install
此命令会在当前目录自动创建 _install 文件夹,并将根文件系统安装到此文件夹中!
7、此时若要生成可烧录的镜像文件,可使用 make_ext4fs 打包工具制作。
输入命令:make_ext4fs -s -l 2092957696 -a root -L linux ./system.img ./busybox-1.34.1/_install
root@chenrg-virtual-machine:/home/chenrg/windows-share/SI_source/rootfs
Creating filesystem with parameters:
Size: 2092957696
Block size: 4096
Blocks per group: 32768
Inodes per group: 7984
Inode size: 256
Journal blocks: 7984
Label: linux
Blocks: 510976
Block groups: 16
Reserved block group size: 127
Created filesystem with 413/127744 inodes and 17315/510976 blocks
root@chenrg-virtual-machine:/home/chenrg/windows-share/SI_source/rootfs
执行命令后在当前文件夹中生成了一个名为 system.img 的镜像文件。
命令参数说明:
make_ext4fs -s -l 3972844748 -a root -L linux ./system.img ./busybox-1.34.1/_install
【1】-s 就是生成ext4的S模式制作;
【2】-l 3972844748 文件系统分区的大小(3.7G)
【3】 -a root 是指这个img用于Linux系统 (若为-a system即表示为android系统,挂载点即是/system。使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限 )。
【4】 -L linux 标签
【5】./system.img 表示在要当前目录下生成名为system.img的镜像文件。
【6】./busybox-1.34.1/_install 指定源路径。即生成镜像文件的源材料在什么地方。
二、在Ubuntu中将SD卡分区、格式化。
1、电脑插上SD卡,输入命令 df -l 查看本机的文件系统的磁盘占用情况
root@chenrg-virtual-machine:/home/chenrg
/dev/sdb 153769964 28561320 117344324 20% /home/chenrg/windows-share/my_work
tmpfs 249668 16 249652 1% /run/user/121
tmpfs 249668 44 249624 1% /run/user/1000
tmpfs 249668 0 249668 0% /run/user/0
/dev/sdc1 3787648 751792 2843448 21% /media/chenrg/c0fc9e9d-029d-418d-89ba-f4fcd276b4e2
信息显示SD卡被识到了,设备名称为 sdc1 ,并被默认挂载到/media/chenrg/c0fc9e9d-029d-418d-89ba-f4fcd276b4e2目录中。若要对SD卡进行分区、格式化操作必须先卸载。
2、输入 umount 命令进行卸载
umount /media/chenrg/c0fc9e9d-029d-418d-89ba-f4fcd276b4e2/
3、输入 fdisk /dev/sdc 命令进行分区。注意是 sdc 不是 sdc1.
root@chenrg-virtual-machine:/home/chenrg
欢迎使用 fdisk (util-linux 2.31.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
The old ext2 signature will be removed by a write command.
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0xa71d43da 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):
4、输入命令 d 删除原有的分区,有几多个分区就多次输入命令 d 来删除
命令(输入 m 获取帮助): d
已选择分区 1
分区 1 已删除。
命令(输入 m 获取帮助):
5、输入命令 n 新建 一个分区
命令(输入 m 获取帮助): n
分区类型
p 主分区 (0个主分区,0个扩展分区,4空闲)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):
6、回车,选择默认创建一个主分区
将使用默认回应 p。
分区号 (1-4, 默认 1):
7、回车,选择默认分区号为1
第一个扇区 (2048-7696383, 默认 2048):
8、回车,选择默认第一个起始扇区2048
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-7696383, 默认 7696383):
若要给这个分区配置为2G,就填上: +2G,若选择默认就直接回车,会把剩余的空间全部分配给这个分区。我这里选择默认。
创建了一个新分区 1,类型为“Linux”,大小为 3.7 GiB。
命令(输入 m 获取帮助):
9、输入命令 w 保存退出
分区表已调整。
正在同步磁盘。
root@chenrg-virtual-machine:/home/chenrg
10、输入命令 mke2fs /dev/sdc1 对刚才创建的分区进行格式化,若要格式化为ext3类型,需要加入参数 -t ext3,不加参默认是ext2类型的文件系统
root@chenrg-virtual-machine:/home/chenrg
mke2fs 1.44.1 (24-Mar-2018)
在 dos 中发现一个 /dev/sdc1 分区表
Proceed anyway? (y,N) y
11、选填 y 继续
创建含有 962048 个块(每块 4k)和 240960 个inode的文件系统
文件系统UUID:a6a9a545-1fa1-49e3-bfd9-11ad2d5dc820
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912, 819200, 884736
正在分配组表: 完成
正在写入inode表: 完成
写入超级块和文件系统账户统计信息: 已完成
三、制作可以从SD卡加载文件系统的SD卡
1、先创建一个要挂载SD卡的文件夹 sd_mount (不创建也行,只要重新拨插一下SD卡,让系统自动挂载也可以)。
mkdir sd_mount
2、挂载SD卡
mount /dev/sdc1 sd_mount
3、将前面1.6步骤得到的 _install 文件夹中的文件复制到 sd_mount 文件夹中。
cp -d busybox-1.34.1/_install/* sd_mount/ -rf
注意:cp 时加上 -d 参数,可以将一些链接文件的链接属性一并复制。
4、卸载掉SD卡,这样就制作好了可以从SD卡加载文件系统的SD卡。
umount sd_mount/
四、测试从SD卡加载文件系统
1、打开电源启动开发板,3秒内按回车,进入Uboot命令行
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M = 200MHz
Serial = CLKUART
Board: X210
DRAM: 512 MB
Flash: 8 MB
SD/MMC: 3776MB
In: serial
Out: serial
Err: serial
lcd: width = 1024 , height = 600
[LEFT UP] boot mode
checking mode for fastboot ...
Hit any key to stop autoboot: 0
x210
3、设置bootargs参数,告诉内核从SD2通道的设备的第1分区加载文件系统(即:mmcblk1p1),记得要 save 保存。
x210
x210
Saving Environment to SMDK bootable device...
done
x210
4、将SD卡插入开发板,重启开发板。
SD checksum Error
OK
U-Boot 1.3.4-ChenRG (Aug 25 2021 - 16:31:29) for x210
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M = 200MHz
Serial = CLKUART
Board: X210
DRAM: 512 MB
Flash: 8 MB
SD/MMC: 3776MB
In: serial
Out: serial
Err: serial
lcd: width = 1024 , height = 600
[LEFT UP] boot mode
checking mode for fastboot ...
Hit any key to stop autoboot: 0
reading kernel.. 1073, 8192
MMC read: dev
completed
Boot with zImage
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 2.6.35.7 (root@chenrg-virtual-machine) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) )
[ 0.000000] CPU: ARMv7 Processor [412fc082] revision 2 (ARMv7), cr=10c53c7f
[ 0.000000] CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: SMDKV210(2456)
[ 0.000000] @@@@@@@ atags_pointer not null
[ 0.000000] @@@@@@@linter
[ 0.000000] Ignoring unrecognised tag 0x41001099
[ 0.000000] $$$$$$$$$cmdline:console=ttySAC2,115200 root=/dev/mmcblk1p1 rw init=/linuxrc rootfstype=ext2
.............................
中间信息省略
.............................
[ 20.584463] VFS: Mounted root (ext2 filesystem) on device 179:9.
[ 20.589086] Freeing init memory: 676K
can't run '/etc/init.d/rcS': No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
从内核打印信息可以看出文件系统挂载成功,但执行linuxrc 时失败。这是当然的,因为我们还没在文件系统中加入/etc/init.d/rcS和/dev/tty2等文件,所以一直在打印错误提示信息。
至此,制作可以从SD卡加载文件系统的SD卡是成功的,至于要在文件系统中加入/etc/init.d/rcS和/dev/tty2等文件的操作不在本文的范畴内。
|