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

ARM Linux使用SD卡根文件系统

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经& G7 _( c3 z9 ~) G: `0 Q  W
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。

6 C; f& c  E/ f1 _9 O) @9 D

1.PC机上格式化SD卡   / G* a& \# f( E0 N3 ^. \- D4 |
      在桌面的PC机上用SD读卡器操作SD卡:
& B. |: ^; x+ U      一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
9 v$ w3 I! t, n自动mount到/media/disk和 /media/disk_1 目录。' L* H# t7 C! d& I5 F
      U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。

      根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测" K* v& }, V, |' C
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,6 \5 S* R# e2 n2 F- N8 W" ]
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。


) {- [; U$ P# j2 O5 f" x

1.1 用fdisk分区
- Y. F1 s( Q$ {, X# H     执行fdisk /dev/sdb
' g8 p- A! Y  j7 Y2 n    fdisk有如下常用选项
! d0 Z4 v2 V% Q4 e# x* c1. 输入 m 显示所有命令列示。 4 {* r/ u( \- i8 f7 i
2. 输入 p 显示硬盘分割情形。 ) O; ^* c/ L0 q4 q
3. 输入 a 设定硬盘启动区。 2 r5 @- L: _" ]5 d$ p
4. 输入 n 设定新的硬盘分割区。 ) u8 r  `0 G( ?* Q
  4.1. 输入 e 硬盘为[扩展]分割区(extend)。 ; t2 B9 U3 n3 d# ^/ s6 G* d; J2 W
   4.2. 输入 p 硬盘为[首要]分割区(primary)。
) t# f. k+ ~9 o# |5. 输入 t 改变硬盘分割区属性。
3 E- p+ Q/ D4 j& S4 A, I8 E  j6. 输入 d 删除硬盘分割区属性。
3 p4 @$ G3 k0 ]7. 输入 q 结束不存入硬盘分割区属性。 , r, ?, V5 O; ~3 c) `1 K7 I
8. 输入 w 结束并写入硬盘分割区属性+ a: p2 ?6 @/ g
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分
0 F$ H( N- o4 k$ i: [) |9 }区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。
$ W1 w+ N* s/ ?) `Command (m for help): n) l: L; s4 Z/ D0 ]+ A) V" Y9 D
Command action& |# L( w. J4 Y. ?2 A
   e   extended! \7 f# ]- ?. \. n; m8 X
   p   primary partition (1-4); t6 Z  b3 O; J  u4 G1 ]. l
p
7 s3 l) U/ {/ i; {. kPartition number (1-4): 1" M$ {. e5 r6 v
First cylinder (1-1020, default 1):
6 c! x6 {! w/ u- |; bUsing default value 1
8 D4 v$ V1 z" h$ G  H+ i% PLast cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
, o, \4 Q6 x: q5 NCommand (m for help): n- S2 |1 Y' v$ f* G
Command action& K% @# U) \/ C- D  r/ q
   e   extended% O9 Q1 @  O% ?
   p   primary partition (1-4)
) W5 `' |$ @+ o2 I* ]6 B# q5 T4 Pp8 m7 F3 R% C- H1 A+ E  q$ s
Partition number (1-4): 2: O* k+ x9 |6 N& f
First cylinder (202-1020, default 202):
, F$ Y0 D% Q' R$ M9 S: ZUsing default value 2020 O1 V8 E" _: p! b% y8 T
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
" L6 G! C! w' n; n& Q+ B$ pUsing default value 1020
0 ~9 v/ u4 T; e: W2 B* r3 g" T8 W# vCommand (m for help): p; x' N' y# X. U, y+ U/ M& _
Disk /dev/sdb: 2041 MB, 2041577472 bytes

* @$ H8 ^3 v* Y. s  z/ X9 K

63 heads, 62 sectors/track, 1020 cylinders
9 ^& c0 y# m0 @5 dUnits = cylinders of 3906 * 512 = 1999872 bytes* I1 I8 H3 {. H& }) r
   Device Boot      Start         End      Blocks   Id  System
) X$ m- p: N% a( E/dev/sdb1               1         201      392522    b  W95 FAT32
. t9 x' Q1 f9 i0 [. @/dev/sdb2             202        1020     1599507   83  Linux7 w5 X! M( q! W
Command (m for help): w
7 G+ y! D2 _8 D8 QThe partition table has been altered!/ t' R6 F2 F& K4 P9 M
Calling ioctl() to re-read partition table.9 I( [1 i+ M2 C# k' C! {) W
WARNING: Re-reading the partition table failed with error 16: 设备或资源
1 ]% s* N' L8 C0 `# L6 I忙.$ z0 b8 k, }$ O; R* c7 f
The kernel still uses the old table.
7 F& x" ]* V  G- C/ ZThe new table will be used at the next reboot.
) p$ w. V, m$ S" d! e( Z5 d. y4 iWARNING: If you have created or modified any DOS 6.x
& \+ R1 W$ h' {' cpartitions, please see the fdisk manual page for additional! `! F  `; M& B& x
information.
( C# \, P4 S, `4 s  i, \- ZSyncing disks.


! s% x# _) z, M

1.2 格式化分区- B+ P& A" l3 J, T# |
    mkfs.vfat /dev/sda1 #第一个分区格式化成fat32/ Z9 A% @; x6 p* @( h$ S0 ?
    mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32, u, \  \) l  j! C
  可以用
4 |& i. n' k5 l$ q% X2 [    tune2fs -l /dev/sda2 来检验分区类型 
! G; d* ^3 E9 r$ o  j2 k1.3 拷贝根文件系统
$ A( n3 i! o4 ?- V9 v  A  M6 `  mount /dev/sda2 /mnt/sdcard #挂载SD卡 ( f0 X- V. k' ?* e- W  ]$ ]
  cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
! M; q$ L) C, C2 y& H2.   编译        ARM Linux        内核   8 J: g1 A8 S0 M' H
2.1 修改内核配置
% X2 x; {% }  x  确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.3 X* \& S8 Y1 i
在内核源码目录执行 make menuconfig
% X( Y' W2 M' b6 X5 J0 X  其中ext3在File system下.成功的配置如下。
9 Y* J0 @- r/ ]8 g& P, H <*> Ext3 journalling file system support       6 G  q$ q2 {5 ]5 V
   

  •    Ext3 extended attributes
    ) a% J3 h7 z% |. N  y2 }' E% Y* |& F   
  •      Ext3 POSIX Access Control Lists

  •      Ext3 Security Labels  8 g4 q: L4 M4 j8 q0 a% F
    SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下
    . U7 L6 Z7 X! o' \  [( H3 E --- MMC/SD/SDIO card support                           + G" ?1 N5 q/ E* E( O
  •    MMC debugging                                    
    # l$ t# ^3 K$ n+ ~9 i  c [ ]   Allow unsafe resume (DANGEROUS)                  
    6 d: ?* l4 m* ~1 d( }4 `+ ~       *** MMC/SD/SDIO Card Drivers ***                 & ]. P0 b2 _% ?' W
    <*>   MMC block device driver                          + j3 m5 Y- ~4 s3 V! [2 X: ?5 N: D
  •      Use bounce buffer for simple hosts             + j& R* _; F7 o+ L/ j# s6 C
    <*>   SDIO UART/GPS class support                      $ v2 g$ o% m* `7 B! B+ _7 d5 b
    <*>   MMC host test driver                             9 h  \/ R& A* {# R  \5 m0 m6 t
           *** MMC/SD/SDIO Host Controller Drivers ***      % D# e& P! N0 J9 L- |* U! E
    <*>   Secure Digital Host Controller InteRFace support
    . W$ {/ r( m% B2 H) [5 C; G0 x3 @ <*>   Samsung S3C SD/MMC Card Interface
    ! a, M6 H/ Q, x5 K! e3 nsupport          i# L, w1 e7 E8 j5 W6 k3 A0 u
      编译内核 make zImage

    6 Y( N. `  b/ t- [* r5 o

    2.2 在ARM-linux下的测试.6 g9 `: u  y& o4 x+ T0 n2 Y
       在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
    9 r4 f* L9 N# P& L( F0 h[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).                           + |+ ?7 }" C# j8 ~8 Q
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    3 s( A0 U6 p3 xs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    % y* W0 {: F$ c- `6 [! Bs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  ; z( `6 c* m4 D( H7 s. R
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  6 z" `  u3 n/ E2 p. F' H
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    : n+ L* F' O5 T" P% {s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    ; T- P( V/ I1 A& f0 V7 o; B! F& }s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    $ T$ S4 U, H5 X! T; ~/ Js3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              , ]! v/ b2 \: z
    s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
    $ O2 K6 U% s9 s4 a  K9 q, C0 Fmmc0: new SD card at address 0002                                                                & w* j# X- b$ t. _" E" U4 h3 P$ }
    mmcblk0: mmc0:0002 00000 1.90 GiB                                                               
    2 C% t3 O/ s5 S. K6 P6 S3 t% \) x mmcblk0: p1 p2                                                                                 
    5 H9 @. r8 H) g- J7 J9 D4 SFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
    & O. v+ G3 j+ ]sensitive!
    % |9 a/ f) b( h+ R) `但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如. e) _* w0 \2 ^" \! J
    下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)3 B0 D5 |) O7 u; [5 N4 G
    [root: /]# ls -l /dev/mmc*                                             ( g1 B5 E* ~) Q2 e0 Q/ v
    brw-rw----    1 root     root     179,   0 Sep 22 10:48 /dev/mmcblk0   
    # T9 \! X) Q. m' v. ]4 Vbrw-rw----    1 root     root     179,   2 Sep 22 10:48 /dev/mmcblk0p2


    - E; ^" W6 P  ]! C  H

    测试ext3分区, t0 Q# l1 A. D" E" L; A
    mount -t ext3 /dev/mmcblk0p2 /mnt
    " @6 ]6 i8 \5 K) ]2 N5 T$ z+ q在/mnt上可以读写文件.表示ext3分区正常.8 X4 G" ]. f6 f; E8 w6 }( l
    手动建立第一个分区的结点.
    - m" |' p5 P9 g7 s5 @# F  fmknod /dev/mmcblk0p1 b 179 1 2 P( u9 J" a4 Z2 q6 q
    测试vfat 分区
    / j2 h) O. q6 Q9 J) vmount -t vfat /dev/mmcblk0p1 /mnt# W# @+ [9 |; N+ j6 S
    在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用) @6 }/ k* }- X$ `! n
    这个分区2 R: N" S. n/ P8 V
    3.   使用        SD        卡分区作为根文件   
    8 t% j8 l3 T, Y 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动
    0 F( S3 q7 C  s) C* s) ^% {& p" e* Z参数。
    0 N/ \% ]$ X! |' L  ` 成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
    ! ?4 L$ D- X. V- g其中179和2是sd卡上ext3分区的主设备和从设备号。$ ]! h  R3 \( p' U: Z
    用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
    ( a1 ^0 y$ O. c- Y( v4 I为根文件系统。

    / N! f! _4 \2 J, j* x  R, P

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


    1 k9 x/ E0 O% {9 T& u9 R

    .......! k9 ]3 O' p" g+ z; L& w

    VFS: Cannot open root device "179:2" or unknown-block(179,2)% M8 y  Z# `. S3 N
    Please append a correct "root=" boot option
    9 j: Z% T3 Z* m4 YKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

    . C1 P) S  j* s* ~, o% C7 o
  • 该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-1 14:32 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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