制作可以从SD卡加载文件系统的流程

环境

操作平台:UBuntu18.04 64位

目标平台:Linux 2.6.35.7 ARM Cortex-A(arm v7)

编译工具:arm-2009q3

准备工作

下载busybox-1.34.1.tar.bz2源码https://busybox.net/downloads/

一张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 #ifdef IFA_F_DADFAILED  
346         if (ifa_flags & IFA_F_DADFAILED) {
347                 ifa_flags &= ~IFA_F_DADFAILED;
348                 printf("dadfailed ");
349         }
350 #endif
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 打包工具制作。

此工具可在我的网盘下载:提取码:y4b8 下载 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# make_ext4fs -s -l 2092957696 -a root -L linux ./system.img ./busybox-1.34.1/_install
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# df -l

/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 /dev/sdc

欢迎使用 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 /dev/sdc1
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 # set bootargs console=ttySAC2,115200 root=/dev/mmcblk1p1 rw init=/linuxrc rootfstype=ext2
x210 # save
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 # 0, block # 1073, count 8192 ...8192 blocks read: OK
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) ) #93 PREEMPT Fri Aug 13 20:15:55 CST 2021
[    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#####boot_params:c0000100,mdesc->boot_params:30000100
[    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等文件的操作不在本文的范畴内。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值