找回密码
 注册
关于网站域名变更的通知
查看: 254|回复: 1
打印 上一主题 下一主题

ARM Linux使用SD卡根文件系统

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-10 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经7 k% L- n. q& g5 F2 }
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。


) p3 x) p! _1 T2 `4 }

1.PC机上格式化SD卡   
. N- ?2 I8 {* W9 X6 h* x( H9 J      在桌面的PC机上用SD读卡器操作SD卡:( U6 c) D$ Y$ M
      一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
6 V5 C9 j' Q8 d自动mount到/media/disk和 /media/disk_1 目录。) V2 b! u2 k- t2 ]4 M
      U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。

      根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测) l0 v3 g, O. e' d( c1 z8 B
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,
5 d& Y1 j6 B. ^. U/ `3 M1 I1 c. n做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。

. V1 k' j( j1 U, c/ b3 O

1.1 用fdisk分区
# l% B9 T& {$ P     执行fdisk /dev/sdb4 b2 X; q. Z/ f8 N- U- @1 U
    fdisk有如下常用选项. k: [7 E+ Q4 r( r- L7 l
1. 输入 m 显示所有命令列示。
" y" k2 D% T: P# R/ u  Y' t2. 输入 p 显示硬盘分割情形。 2 d. O* I% v. z) K( T* D7 A: W( f
3. 输入 a 设定硬盘启动区。 ' L" F2 w  w- y3 T) ?; W" T
4. 输入 n 设定新的硬盘分割区。
# u; Q1 G. x* `6 x( r  4.1. 输入 e 硬盘为[扩展]分割区(extend)。
# c1 c5 j# l9 M# R& ~( m   4.2. 输入 p 硬盘为[首要]分割区(primary)。
. ]* X5 U2 m" P4 c+ w" v5. 输入 t 改变硬盘分割区属性。 ; X. F: b7 f) }
6. 输入 d 删除硬盘分割区属性。   P) [- g! z) U* b8 a
7. 输入 q 结束不存入硬盘分割区属性。
. z4 Z$ S0 x" X8. 输入 w 结束并写入硬盘分割区属性
2 ]+ a0 `" }3 Z$ _! ^' q3 T4 L如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分
' |: x2 B( _: v+ S区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。7 F( ]* B& @8 Q
Command (m for help): n: _. _; {" V9 Z: G  R
Command action1 I0 r* n7 N3 W& A; z6 \( c
   e   extended
) q7 T6 E8 P$ e4 E   p   primary partition (1-4)
' a! ~9 E' f+ Q. l$ O6 Qp
9 F0 @0 t, }: i2 d; lPartition number (1-4): 1- j' c8 h% |" ^  Y
First cylinder (1-1020, default 1): 8 r) C1 K- G* [* s. U- e. L
Using default value 1" x4 J1 E! _: [- h5 n; M0 c9 B1 U8 Y: ]
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
4 }/ s, k# s# {2 m, m4 d3 L$ cCommand (m for help): n& R, P/ I2 K# t& S  }" ]( J' T
Command action! F' F* |2 i. E6 N# H' l
   e   extended- k; w1 p; H$ d
   p   primary partition (1-4): y" D0 D! Z* |2 H" p* Y* n6 ]6 i
p
& A1 w6 J+ P9 E' _3 IPartition number (1-4): 2
3 I# O, s1 [) U1 t% K& @First cylinder (202-1020, default 202):
$ Q$ K1 O4 b1 b; O6 X8 DUsing default value 202
% j: N1 O  r' SLast cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
% {; ^' v- H8 E/ P; F, sUsing default value 1020
* j9 s! _; y" D) O1 qCommand (m for help): p
" V+ N) M+ L+ m' h; f! KDisk /dev/sdb: 2041 MB, 2041577472 bytes


, A) k2 f/ N5 n) @, [

63 heads, 62 sectors/track, 1020 cylinders6 x. o5 e* d0 f" p; L
Units = cylinders of 3906 * 512 = 1999872 bytes/ M4 P6 h3 H3 N3 H9 B
   Device Boot      Start         End      Blocks   Id  System- t) c) R+ w2 x3 \( y
/dev/sdb1               1         201      392522    b  W95 FAT327 }. Q  L6 d% g( Y' D8 Q1 m
/dev/sdb2             202        1020     1599507   83  Linux/ h! q+ ?8 Z: Y, o* K7 Y" H. S
Command (m for help): w
/ \7 |6 p! \$ d9 T1 _The partition table has been altered!: R- C+ D. R# h
Calling ioctl() to re-read partition table.: m% P  I1 O/ R) T+ l9 L6 V
WARNING: Re-reading the partition table failed with error 16: 设备或资源* u" H2 q" e8 e- O8 I8 i
忙.
1 X% N6 p; r" \7 a1 VThe kernel still uses the old table.5 Q- o6 b2 s) V( d
The new table will be used at the next reboot.# Y  [1 |/ h: n: n9 d1 r$ I7 m
WARNING: If you have created or modified any DOS 6.x+ T, O$ [* g* L# ~) ~
partitions, please see the fdisk manual page for additional
; h: i  i- Z  H) h# W" h" einformation.
( O/ B# j) U) E% l5 e% LSyncing disks.


0 o( J5 ?  z5 a. Y3 Q0 q  x

1.2 格式化分区3 I$ D" X. X, J6 ]0 h) N0 o0 S
    mkfs.vfat /dev/sda1 #第一个分区格式化成fat32
# ?5 J- A8 L7 `    mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32; z" `$ N. k( S* h/ f* z  ]
  可以用
* h: n5 e- ]) S1 f    tune2fs -l /dev/sda2 来检验分区类型 
4 F# B. e3 n7 [! @2 `- C" \, s1.3 拷贝根文件系统
" n2 S! E5 U3 \  _! p  mount /dev/sda2 /mnt/sdcard #挂载SD卡
/ {/ ]/ O. g+ F; A: H0 a  r; W  cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡 ( e: a$ D* I+ R' j+ m  R" Y
2.   编译        ARM Linux        内核   ! E2 g- g: D7 B- K
2.1 修改内核配置
! g% r6 s1 {. z/ S  h" K  确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.0 y+ q, w5 O: }9 o! W
在内核源码目录执行 make menuconfig
6 u6 F; R( r1 B: h  其中ext3在File system下.成功的配置如下。
3 _  n( ]* L7 I8 T/ I <*> Ext3 journalling file system support       - j+ B3 C) ]& ^" Z/ O4 s
   

  •    Ext3 extended attributes   T( s2 b% Z: O7 F
       
  •      Ext3 POSIX Access Control Lists

  •      Ext3 Security Labels  
    4 l8 Y- x  x$ iSD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下6 d1 I" ^5 u$ L" g) F- N% ?# j! r
    --- MMC/SD/SDIO card support                           
    * T( B% ~8 [# [7 b6 i6 m/ F/ g
  •    MMC debugging                                    / d* I3 P+ U% |- c
    [ ]   Allow unsafe resume (DANGEROUS)                  
      C$ H  _' Q+ p  ^       *** MMC/SD/SDIO Card Drivers ***                 $ w* I% E2 S; |% B" }3 G
    <*>   MMC block device driver                          
    / [& n! }0 F- i8 v3 A
  •      Use bounce buffer for simple hosts             6 S* A0 g: H' G3 C/ d* {
    <*>   SDIO UART/GPS class support                     
    . @& M1 h4 F1 c7 T+ B( k8 @ <*>   MMC host test driver                             3 T- ^: L0 _2 C9 M- J0 x
           *** MMC/SD/SDIO Host Controller Drivers ***      & W1 O* ]- d! S' L% Z: x  l4 ]" t& Y2 n
    <*>   Secure Digital Host Controller InteRFace support
    - v% }% ~+ y- b' z <*>   Samsung S3C SD/MMC Card Interface 3 C+ O* x9 z2 t
    support        
    + h1 p% Y# c& k9 q9 C  编译内核 make zImage


    ) a# R3 I0 C; M% v5 z% o

    2.2 在ARM-linux下的测试.
    - J3 [2 u* M# U; J" K) e! L3 d   在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
    , R. T5 J0 e7 A8 \2 K; z4 K[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).                           
    3 s; W+ l: [" I2 ms3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  , G4 w8 \5 @$ @6 ?. r% J. A
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  / B2 C  l" |& z1 N7 N
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  7 _% y% q% q8 N8 }
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  . G6 S2 {9 x' m8 c
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    , ?  u' r* m, G' ~s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    0 {* O$ L; o) P2 z! C3 k' Ns3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  8 f/ p2 c7 p7 _5 {0 Y6 A
    s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
      `; f  {! O8 J; |s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              : Q2 q2 g: o" I% s6 Z6 I0 U
    mmc0: new SD card at address 0002                                                               
    ! @, @/ h' a8 {0 V- W) W6 O' p4 Wmmcblk0: mmc0:0002 00000 1.90 GiB                                                               
    9 @5 \7 [- A* ?9 m& t) Y: R mmcblk0: p1 p2                                                                                 
    6 n. P& D+ q3 a! L7 bFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case  M( Y0 n0 r9 @, y( }% O1 h
    sensitive! : b% v  b6 K3 G
    但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如; E$ Z* Q9 ~4 s0 K  l* K: c. c1 o1 l
    下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)9 v5 T& R  d" I
    [root: /]# ls -l /dev/mmc*                                             3 c$ R2 P& M% P  ]5 \, s
    brw-rw----    1 root     root     179,   0 Sep 22 10:48 /dev/mmcblk0   
    , a7 \, `+ K0 B2 x7 I: Dbrw-rw----    1 root     root     179,   2 Sep 22 10:48 /dev/mmcblk0p2

    1 w# @$ s8 k2 f1 Q

    测试ext3分区! e+ k* P; ^4 C( P/ M' S  W
    mount -t ext3 /dev/mmcblk0p2 /mnt
    : B+ z4 f( A6 c( w' z" |0 Z4 u* n在/mnt上可以读写文件.表示ext3分区正常.7 Q) D  u7 _0 `7 M: H  e& F
    手动建立第一个分区的结点.
    , O) F% _  f: e# `) Fmknod /dev/mmcblk0p1 b 179 1 " }3 z) C" ?' P! ~
    测试vfat 分区. S% C. F! q& x/ K
    mount -t vfat /dev/mmcblk0p1 /mnt
    2 [6 K, |1 u$ {9 t在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用
    6 d7 w& M- p0 t) i" Q3 L这个分区2 o$ T" X2 A+ W4 M' X
    3.   使用        SD        卡分区作为根文件   9 d% F1 `( f1 x/ B: f- ]4 U* Q
    修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动* G, A6 a  \/ [. K
    参数。
    7 i- N' j' t5 _3 H+ X4 |. i) W 成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
    1 M2 D9 E3 }' L其中179和2是sd卡上ext3分区的主设备和从设备号。
    / }+ u- t7 k6 B* L! c- l" G用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
    8 w/ U: n- ?- M. K, |为根文件系统。


    5 c, C" @# r, h

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

    2 N: ^* y4 K# y7 C4 @

    .......: E* v4 y! _! A* z' `4 j

    VFS: Cannot open root device "179:2" or unknown-block(179,2)
    * m3 D2 \8 D4 i- B+ c: Z4 k1 qPlease append a correct "root=" boot option
    ; m( C6 X0 b4 Z) PKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)


      J& I! ?/ `0 y8 L9 ~
  • 该用户从未签到

    2#
    发表于 2020-6-10 16:36 | 只看该作者
    ARM Linux使用SD卡根文件系统
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-25 17:53 , Processed in 0.171875 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表