在arm-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。
1.PC机上格式化SD卡 , _% t& V2 P) p) I6 ]1 c8 y
在桌面的PC机上用SD读卡器操作SD卡:
一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被8 B k7 E+ g4 ^0 e0 U# S' P
自动mount到/media/disk和 /media/disk_1 目录。, n8 H- @4 X* f G7 e, y" h3 }
U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。
根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测3 a: J1 Y. T' r* y; }. E$ m8 T
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,: D" O1 ?+ K. V- w' M0 `0 h* {% A# J
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。
1.1 用fdisk分区
执行fdisk /dev/sdb
fdisk有如下常用选项( p) ?# h) l, F+ [1 f7 t6 G
1. 输入 m 显示所有命令列示。
2. 输入 p 显示硬盘分割情形。
3. 输入 a 设定硬盘启动区。 9 y# q5 N6 E. n$ f0 Z
4. 输入 n 设定新的硬盘分割区。
4.1. 输入 e 硬盘为[扩展]分割区(extend)。 1 J# A' v& z: d
4.2. 输入 p 硬盘为[首要]分割区(primary)。 6 Q ?: d" n7 {$ ]9 J! x
5. 输入 t 改变硬盘分割区属性。 1 c1 S: C7 e, C
6. 输入 d 删除硬盘分割区属性。 . k, G8 l4 c7 |/ l
7. 输入 q 结束不存入硬盘分割区属性。
8. 输入 w 结束并写入硬盘分割区属性9 E* M) e! t' o5 w- _- `' C1 L) d/ _" b8 E
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分- u0 k4 c0 i- A0 N: K
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。5 }0 h3 P1 p9 h, m% H: v
Command (m for help): n6 N) d5 V; S: s2 }6 [
Command action
e extended
p primary partition (1-4)
p9 W+ g- c# d; O" _! v' _, F
Partition number (1-4): 19 H! z" u; S/ i9 n/ s, R
First cylinder (1-1020, default 1):
Using default value 15 n. f" v; t) C Y& j* D
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
Command (m for help): n
Command action
e extended3 N- M: S; V9 F. B
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (202-1020, default 202):
Using default value 202
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): % w% e ?! Z0 K ^; H! ?* M+ p
Using default value 1020. M a$ M5 k; E
Command (m for help): p
Disk /dev/sdb: 2041 MB, 2041577472 bytes
63 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 3906 * 512 = 1999872 bytes
Device Boot Start End Blocks Id System: c" S+ b" ?. g3 r
/dev/sdb1 1 201 392522 b W95 FAT32: S$ w! Y) s: H" T% x
/dev/sdb2 202 1020 1599507 83 Linux! o$ O& s, {; L& o, K! Z8 K4 \8 D
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table., }% i) _ t( ]
WARNING: Re-reading the partition table failed with error 16: 设备或资源" h" ?0 z3 {: i- u1 f3 X2 \
忙.
The kernel still uses the old table.
The new table will be used at the next reboot.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.: Y( N: K; K2 _: w Z
Syncing disks.
1.2 格式化分区) R. q! V% R2 ~+ }; E
mkfs.vfat /dev/sda1 #第一个分区格式化成fat32: t6 n& L5 \; G2 {) ^( V
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32* u; S2 W; \8 g0 J8 N5 K: n
可以用 : w1 H7 r- O/ ^" t7 P1 q
tune2fs -l /dev/sda2 来检验分区类型 ) g: f# o7 k" v) C+ u
1.3 拷贝根文件系统
mount /dev/sda2 /mnt/sdcard #挂载SD卡 & x& x2 w8 W* I1 V s# ]: I
cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
2. 编译 ARM Linux 内核 ; B. |6 m( q/ q1 n7 X1 T! }
2.1 修改内核配置' i1 V7 s& ?+ j1 t# z# X
确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.
在内核源码目录执行 make menuconfig
其中ext3在File system下.成功的配置如下。% N" `8 q, m/ ~9 W4 T% M+ l+ N+ W
<*> Ext3 journalling file system support
2.2 在ARM-linux下的测试.
在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上4 C3 g. k/ y' q0 R/ d* P! |6 ?' L( J
[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz). 3 c! \# l5 _- z' B
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). & H! p. a! E/ @5 w# b f g
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 1 K" Q# n' f, X. E
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 6 m+ J3 k( v( X
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). ) P& L% i( i2 F) }8 u8 T' z4 ]+ p: V
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 6 ?9 J; ]4 r: p, L9 d
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). ) h3 H% U$ v9 Q6 Y8 C( e
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 2 j7 {1 b$ L) t/ b/ {( V8 C
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
mmc0: new SD card at address 0002 9 h, p, {1 p) v8 y& ^
mmcblk0: mmc0:0002 00000 1.90 GiB
mmcblk0: p1 p2 * V- A) `0 `4 f, G6 M2 P4 u: ~
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
sensitive! ) K9 t. [6 h) p' `, J! A8 f" V
但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)
[root: /]# ls -l /dev/mmc*
brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0
brw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2
测试ext3分区1 {. |- ^. p: f
mount -t ext3 /dev/mmcblk0p2 /mnt/ B- d8 n6 B6 A' {5 {" g! B2 C' L
在/mnt上可以读写文件.表示ext3分区正常.% U8 a& J2 U3 C- q# |( y3 v2 Q, p
手动建立第一个分区的结点.
mknod /dev/mmcblk0p1 b 179 1
测试vfat 分区
mount -t vfat /dev/mmcblk0p1 /mnt0 ^1 i2 b- X2 M1 A, y
在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用6 g$ e9 i8 V# o+ J
这个分区( I. x: I+ l# _( u5 o6 _( V
3. 使用 SD 卡分区作为根文件
修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动/ [# z, G! w8 p( t
参数。
成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
其中179和2是sd卡上ext3分区的主设备和从设备号。% s- G! ?7 j; x4 X& Q3 a
用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
为根文件系统。
PS:如果根文件系统不能正常加载,并且报错信息和下面类似:
.......
VFS: Cannot open root device "179:2" or unknown-block(179,2)/ e- \: \$ l) Y# X' l" U
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) | Powered by Discuz! X3.2 |