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

ARM Linux使用SD卡根文件系统

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经1 N  o1 Z5 p; |3 U# `
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。

8 P1 k/ g! r, l+ r& \

1.PC机上格式化SD卡   . Q( ^7 T9 ?3 Q% ~3 e
      在桌面的PC机上用SD读卡器操作SD卡:. @9 b. G7 K0 A/ e1 K7 n
      一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
/ t+ m; A! n) s自动mount到/media/disk和 /media/disk_1 目录。
* L4 z) i' G5 G      U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。

      根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测
. o8 V' I3 W. @) b4 i+ U% P8 `) u! L时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,0 b7 P4 o* F: E3 H+ C
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。

( M% K( l& t; w3 u" r# Z

1.1 用fdisk分区
/ k% A" L8 h2 l% h' c: w     执行fdisk /dev/sdb' W# I( L* T& E' c8 y. H6 g
    fdisk有如下常用选项
- e6 @: V, `, _1. 输入 m 显示所有命令列示。
0 z6 M6 l3 c5 r& C% n, w9 r2. 输入 p 显示硬盘分割情形。 + r: }% E  |2 C3 d- r% u; f
3. 输入 a 设定硬盘启动区。
- Q! L* x9 Y! M  S, \! z$ l  ]7 f4 s4. 输入 n 设定新的硬盘分割区。
) U8 M( U1 I2 [9 N; ~  4.1. 输入 e 硬盘为[扩展]分割区(extend)。 9 w, W! b, S% p/ o, v, H0 p+ p* t  O
   4.2. 输入 p 硬盘为[首要]分割区(primary)。 1 D& S4 `) N4 `9 l; `, X
5. 输入 t 改变硬盘分割区属性。 3 [4 Y3 {( n6 z
6. 输入 d 删除硬盘分割区属性。
1 v6 g( v. P2 X9 \3 q! P0 y" d5 J7. 输入 q 结束不存入硬盘分割区属性。 ( e0 `& Y  ^* g' L
8. 输入 w 结束并写入硬盘分割区属性
- S# `# n5 u& p* |如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分" |+ J- K! b3 `7 h
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。5 S5 n6 ?2 H9 X- S# o( c& {) o8 v
Command (m for help): n& M7 U+ k/ g, K  {7 [" Z( G
Command action
, M4 B# }5 Z' i* ^8 @# D( r2 g   e   extended
% L) v$ ^) K4 f/ _' r. P   p   primary partition (1-4)! N8 J, R7 ?2 a
p
8 K; }, _' d+ Z1 Q6 bPartition number (1-4): 1
8 a( Q. G3 G3 h; t, XFirst cylinder (1-1020, default 1): ) ^0 D' c4 K, L5 X7 z1 O- U  q
Using default value 15 n/ Z# u# Y1 \; K
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
0 ?2 ^0 C8 s$ X7 I# i# gCommand (m for help): n
; y5 N: v' u. R0 yCommand action# s8 n. \" q" M3 q* U# u
   e   extended
  {& G1 }  H/ a2 E( n   p   primary partition (1-4); e$ w& y: C9 P) z, _4 ^0 m3 W
p2 }+ |, ~* b! R
Partition number (1-4): 2! R7 g6 n" ]4 E1 J( B+ C- V
First cylinder (202-1020, default 202):
7 Z8 y' ~& R$ ]  K* N5 yUsing default value 202
5 Q4 |: p+ m% `8 k! v" m" sLast cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): - w" ?( ^- ^5 Y8 I1 t& c$ B
Using default value 1020  i( F( ^, g: ?, E0 R- ~& F
Command (m for help): p
6 O! a9 L6 B' p* _Disk /dev/sdb: 2041 MB, 2041577472 bytes


5 N  ^: E, p$ ~! L- x" F" F6 A7 i

63 heads, 62 sectors/track, 1020 cylinders4 Q, q" q  _6 Y' C0 i# K) B
Units = cylinders of 3906 * 512 = 1999872 bytes
: b5 n( |0 O0 h+ g   Device Boot      Start         End      Blocks   Id  System
4 a" C& _% l8 a+ N/dev/sdb1               1         201      392522    b  W95 FAT32
; I+ }" j$ \: n2 |* V9 C+ X& A/dev/sdb2             202        1020     1599507   83  Linux
- D; [( B; C3 w- @4 P" f( K5 aCommand (m for help): w8 c# }- d, i& m
The partition table has been altered!
' {: Z6 x# s, U2 NCalling ioctl() to re-read partition table.+ q. j3 ]/ [6 _
WARNING: Re-reading the partition table failed with error 16: 设备或资源: i9 {/ e; P0 P' w7 o
忙.6 c+ n0 k0 x7 V0 z( |
The kernel still uses the old table.  i2 R' Q3 H, m; |% B7 A0 Y& P/ x
The new table will be used at the next reboot.+ t2 b  v0 O9 \4 N! ], B: h
WARNING: If you have created or modified any DOS 6.x5 ?7 Y3 [6 i% A2 Q$ m; h
partitions, please see the fdisk manual page for additional3 x0 R4 n8 e8 D% D. e% H8 n
information.
  a; j1 a9 k  s: G4 X) USyncing disks.

/ c3 j; F5 o! U; g8 a; C& u; H/ L

1.2 格式化分区
- s1 H. d# ]) m7 w+ @; H    mkfs.vfat /dev/sda1 #第一个分区格式化成fat321 y/ I' G# U, H5 b3 n* d; L2 c
    mkfs.ext3 /dev/sda2 #第二个分区格式化成fat327 k6 o$ r; w/ f1 `
  可以用 , i7 Y1 h9 ~7 `4 T3 X& Y
    tune2fs -l /dev/sda2 来检验分区类型 $ o8 F8 h+ X% u# w  P+ r5 R
1.3 拷贝根文件系统
' a7 m% }4 T8 i, @" n* F; n, r  mount /dev/sda2 /mnt/sdcard #挂载SD卡
% K* I  O& c6 ^( p& b5 C  cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡 $ z; }+ v& v; u$ [4 w4 Y7 a7 A
2.   编译        ARM Linux        内核   ' ~3 c6 [; G4 k
2.1 修改内核配置
2 N* z9 P4 D/ e1 ~  确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.3 |# p3 S# y1 `
在内核源码目录执行 make menuconfig
: a0 T7 t1 T/ J9 Y' l8 l  其中ext3在File system下.成功的配置如下。
5 E' p! A6 I7 ?& q <*> Ext3 journalling file system support      
* g: @5 l/ V7 \% _   

  •    Ext3 extended attributes
    0 N- o6 p! {$ e/ K. g7 D$ ?   
  •      Ext3 POSIX Access Control Lists

  •      Ext3 Security Labels  3 @: v- l$ V3 x1 U) v2 d5 _
    SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下2 A, @( `$ X3 s. t3 g; V
    --- MMC/SD/SDIO card support                           
    ! W. W, i0 ]! Q1 [1 ]
  •    MMC debugging                                    
    5 G4 O, `- N4 K* R9 ]: k! f [ ]   Allow unsafe resume (DANGEROUS)                  
    * E9 v( ?- Z6 O2 d) M' i       *** MMC/SD/SDIO Card Drivers ***                 ' w6 @% X# k3 O' C- J
    <*>   MMC block device driver                          0 M( \- m% K) \
  •      Use bounce buffer for simple hosts            
    2 G% E, t$ V3 x* A0 n! ~# C, S <*>   SDIO UART/GPS class support                     
    ) P& {8 a3 E4 Z( s% @4 u; S <*>   MMC host test driver                             / ]9 {% m: E8 R5 N
           *** MMC/SD/SDIO Host Controller Drivers ***      
    " [1 O& Z2 O( l9 O7 `% C <*>   Secure Digital Host Controller InteRFace support
    : {8 F& K- W% ~- A& b0 ?6 F7 S, d <*>   Samsung S3C SD/MMC Card Interface - L4 `( C: G" Z* Z$ [
    support        
    % R$ z6 W  B& a2 _8 z  编译内核 make zImage

    ) {5 w" m& r8 v# S$ q

    2.2 在ARM-linux下的测试., d7 S& }0 R7 K+ U6 ^: J4 t$ b- J
       在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上0 V9 p- C7 O0 ?# y2 q/ n
    [root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).                           ! x0 G" g! K) h2 Y
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    8 z8 ~% R; d9 H, l: X3 _% As3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  # u; |" w5 s' }
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  3 e1 v4 A: w  J- j' z/ b% I: b
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    ! J0 c. [: v+ Ls3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  8 Z, Q5 \" v  G+ W* [- f
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    , g- t1 Z" G, ^+ Z' r% \s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    / K4 T: Q, w/ E; M* H* hs3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              . }* F3 }2 V# d# A' n
    s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
    , z0 w' q) U3 N7 s) t" dmmc0: new SD card at address 0002                                                               
    3 o0 E( d& e6 O, i5 ^& ymmcblk0: mmc0:0002 00000 1.90 GiB                                                                6 f& Q' y6 Z0 ~7 T
    mmcblk0: p1 p2                                                                                  4 W/ n9 ^; E9 e2 [3 ^" N
    FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
    4 f, D7 J0 Z' R+ ?sensitive!
    7 ]8 E6 ?6 D  |但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
    4 g, B( ^/ ]: E8 w$ [5 }下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)
    0 u- Q+ I' Y0 ]8 I[root: /]# ls -l /dev/mmc*                                             9 V1 D- I, \) j3 I1 I8 [' n
    brw-rw----    1 root     root     179,   0 Sep 22 10:48 /dev/mmcblk0   ! W) O  s8 l  b; `5 C2 e
    brw-rw----    1 root     root     179,   2 Sep 22 10:48 /dev/mmcblk0p2


    9 u% Q$ e( o) Y1 L4 r

    测试ext3分区4 V( @! y8 g5 C1 f) T- y
    mount -t ext3 /dev/mmcblk0p2 /mnt( U& g1 D  I1 l* E5 N$ r
    在/mnt上可以读写文件.表示ext3分区正常.# W) c1 _* E# {" ~' v$ v
    手动建立第一个分区的结点.
    ! z4 }1 c+ u' xmknod /dev/mmcblk0p1 b 179 1 % I% L. c+ M! ]
    测试vfat 分区# X! e/ ^) ?( X  E. V* D
    mount -t vfat /dev/mmcblk0p1 /mnt
    8 z4 ?( M* m( [4 ~! a& |+ P在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用' v. y$ f4 N5 g2 [& `4 ^8 e7 s
    这个分区
    5 p' A7 D9 q: r$ `3.   使用        SD        卡分区作为根文件   
    ) L1 }) E8 c9 _, i! s3 X; ]& i 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动' n- D& p% O+ n$ P" A
    参数。0 ^6 j! {# L4 @' u0 N1 A) m7 w) Q
    成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0 ( ^1 b$ W- w+ U  a, [) f! q
    其中179和2是sd卡上ext3分区的主设备和从设备号。5 y, t2 M3 P3 X2 _1 ]
    用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作) ]4 _8 o6 n- `" \2 ]. K( c
    为根文件系统。

    0 }' S7 L# {+ A  z

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


    7 e6 \7 X6 s5 E( i7 i, l

    .......' k8 b3 x3 e* Y. w

    VFS: Cannot open root device "179:2" or unknown-block(179,2)! P5 p4 C. ?/ n% J+ o
    Please append a correct "root=" boot option
    # u1 N( B1 V& A$ \1 q% R8 rKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)


    2 a) ?( q+ R6 k6 ?5 I
  • 该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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