EDA365电子论坛网

标题: ARM Linux使用SD卡根文件系统 [打印本页]

作者: uperrua    时间: 2020-6-10 14:14
标题: ARM Linux使用SD卡根文件系统

在arm-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经
2 D+ j5 ?) s5 t常烧不了根文件系统.所以决定用SD卡来跑根文件系统。

4 B2 v3 i% c1 B* f* v7 i

1.PC机上格式化SD卡   , _% t& V2 P) p) I6 ]1 c8 y
      在桌面的PC机上用SD读卡器操作SD卡:
% w, q) _0 E  _2 N      一般情况下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的格式。


! ]$ _4 @( n2 }$ i

1.1 用fdisk分区
* v7 G& O; e5 E  S     执行fdisk /dev/sdb
' q1 i+ S1 t, f' H/ a, w    fdisk有如下常用选项( p) ?# h) l, F+ [1 f7 t6 G
1. 输入 m 显示所有命令列示。
/ U  V' ]" H* g* p3 s5 \2. 输入 p 显示硬盘分割情形。
  ]7 P. d6 @- h  ]3. 输入 a 设定硬盘启动区。 9 y# q5 N6 E. n$ f0 Z
4. 输入 n 设定新的硬盘分割区。
8 L6 L8 \7 a5 ]& q  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 结束不存入硬盘分割区属性。
4 m  n  O; W4 q7 x7 @7 L8. 输入 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
  B+ Y  D5 U8 M. ?7 i) {% z  T   e   extended
8 ?8 t. N! j% W/ ~/ Q; U# L$ d0 g   p   primary partition (1-4)
; s* x. i) r. b. c: t0 P( {8 {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):
0 l5 z: u5 q& e4 O/ V9 a' `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
. N9 m, C- J8 X+ G; h) t$ j. eCommand (m for help): n
1 |  s8 [- p4 O7 t0 _0 z% f* x  a3 CCommand action
  [7 \% I& c) q0 g/ a) o   e   extended3 N- M: S; V9 F. B
   p   primary partition (1-4)
5 R$ P# r6 s7 ^2 O" vp
7 ^2 I1 v* z4 ~Partition number (1-4): 2
; u" o# g/ R& S' J/ Y! H& s  lFirst cylinder (202-1020, default 202):
  g3 x4 `7 W8 d4 ?# lUsing default value 202
! m9 I, ^, n7 SLast 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
1 y9 Y: q/ S" I, I; H% }  DDisk /dev/sdb: 2041 MB, 2041577472 bytes

6 K, N& o: b# W+ A* X/ D9 o1 Q

63 heads, 62 sectors/track, 1020 cylinders
9 }5 B1 ?6 P" {8 w. \( {* `+ e8 aUnits = cylinders of 3906 * 512 = 1999872 bytes
9 f* f$ O5 U, I: @6 v   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
+ e' u2 ?1 f6 C1 \: SThe partition table has been altered!
7 @; i% V) {7 C! F, UCalling 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 \
忙.
! f; Y# h; S4 GThe kernel still uses the old table.
  i% w! B+ Y' S# v" |The new table will be used at the next reboot.
! v6 i# T) I$ j: @9 f. ?WARNING: If you have created or modified any DOS 6.x
. b: j5 \) A8 Y7 zpartitions, please see the fdisk manual page for additional
  L" Z$ Q2 ]) Q3 finformation.: Y( N: K; K2 _: w  Z
Syncing disks.


% V; x; X% ]# t& S

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 拷贝根文件系统
1 r: x( o& [5 a' h5 o% q  mount /dev/sda2 /mnt/sdcard #挂载SD卡 & x& x2 w8 W* I1 V  s# ]: I
  cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
4 l* N% I; W+ R4 A3 c1 f2.   编译        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.
" ~" ?3 _5 \0 B0 X 在内核源码目录执行 make menuconfig
7 I/ j( z6 K2 i) k  其中ext3在File system下.成功的配置如下。% N" `8 q, m/ ~9 W4 T% M+ l+ N+ W
<*> Ext3 journalling file system support      
# \- ]1 y$ W* d   

  •    Ext3 extended attributes 1 w* c8 p# l% X1 N/ h+ Q3 `( F
       
  •      Ext3 POSIX Access Control Lists

  •      Ext3 Security Labels  4 m8 s: b0 @, P0 c3 F5 I3 z) `( q- ~
    SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下8 Z9 k9 R2 h; G" h1 g3 y
    --- MMC/SD/SDIO card support                           * T- |2 z  W2 k  i) D* Y
  •    MMC debugging                                    ; m" g5 O  Q# L- [/ w
    [ ]   Allow unsafe resume (DANGEROUS)                  
    ) B0 S3 S4 m* _0 k       *** MMC/SD/SDIO Card Drivers ***                 7 s+ s! @; i' j+ @
    <*>   MMC block device driver                          
    $ ?* F' t* x% [
  •      Use bounce buffer for simple hosts             9 ~$ V& e- w, a2 o  g
    <*>   SDIO UART/GPS class support                     
    4 R. f4 F6 |6 k0 ~5 C <*>   MMC host test driver                             7 ^) i5 C5 b4 }& v; `+ C
           *** MMC/SD/SDIO Host Controller Drivers ***      
    , R) W  n( J5 @: C# `& u& L <*>   Secure Digital Host Controller Interface support
      e9 f( N& j; u1 N% `, [ <*>   Samsung S3C SD/MMC Card Interface
    & \3 t# r- K$ D' Q  Xsupport          `4 e( Y& W9 P7 j4 U6 Q
      编译内核 make zImage

    9 S# K& E. K+ H% x. M! X6 F1 d  y

    2.2 在ARM-linux下的测试.
    . Z* G8 `, E+ @   在一个已经正常启动的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).                              
    : W( z, O" [3 a8 x6 x  ms3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
    ( s$ ~% ?- T% t# ?( m, _& Ommc0: new SD card at address 0002                                                                9 h, p, {1 p) v8 y& ^
    mmcblk0: mmc0:0002 00000 1.90 GiB                                                               
    ! r4 n( i& [! | 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
    * d+ `8 G1 Q2 m2 csensitive! ) K9 t. [6 h) p' `, J! A8 f" V
    但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
    0 o! i3 I1 L2 \& V$ w下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)
    # X' K  y; G( y# I+ R  V[root: /]# ls -l /dev/mmc*                                             
    . J" Q" V; ?0 L  ~; Abrw-rw----    1 root     root     179,   0 Sep 22 10:48 /dev/mmcblk0   
    6 m2 k8 X1 H# Y' o* {brw-rw----    1 root     root     179,   2 Sep 22 10:48 /dev/mmcblk0p2


    : ]1 d  [8 _* p( w  V) s) S

    测试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
    手动建立第一个分区的结点.
    # _% m) C8 h% _( a: a9 rmknod /dev/mmcblk0p1 b 179 1
    3 M% W: F: I* m8 f) E测试vfat 分区
    8 \$ u7 i/ y# i( [) @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        卡分区作为根文件   
    # h& \" y# V+ N 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动/ [# z, G! w8 p( t
    参数。
    7 n4 P* _) Q2 p$ r/ h 成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
    1 N/ y, P4 D# ~" `! o" j0 I其中179和2是sd卡上ext3分区的主设备和从设备号。% s- G! ?7 j; x4 X& Q3 a
    用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
    # W! b# v, }- Y* ?为根文件系统。

    . ^: |8 ~  C: _  T  J2 F

    PS:如果根文件系统不能正常加载,并且报错信息和下面类似:


    6 P2 P. o; S  T( I2 @+ i2 r* O# h& E

    .......
    " J3 t3 J% D2 _; u& P, Y' v

    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
    ( g' ?& @5 w: z: {Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)


    9 A* C5 W# p3 u" d& y2 P
    作者: xiaogegepcb    时间: 2020-6-10 16:36
    ARM Linux使用SD卡根文件系统




    欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2