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

ARM Linux使用SD卡根文件系统

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经* ]2 O' N% l$ e, y" b  |
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。


: ^/ O& n- m$ P

1.PC机上格式化SD卡   
2 D: A* _, F/ l      在桌面的PC机上用SD读卡器操作SD卡:
) d2 Z! J9 X5 x* b, D' _& i      一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
. m. }. Q1 `, o" Q$ u自动mount到/media/disk和 /media/disk_1 目录。! d' F+ D0 ]/ e, O
      U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。

      根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测7 n; l+ F7 q9 q; K" \3 X
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,
8 i% N% a2 m; v. G9 }& Z做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。


- V4 R5 a& X1 H7 g# u+ j

1.1 用fdisk分区
3 Y. s  Q# @( K) w0 {' z     执行fdisk /dev/sdb
/ l3 s6 M6 ^# i9 V$ W    fdisk有如下常用选项4 O7 s  ^5 `' `- l" @1 K
1. 输入 m 显示所有命令列示。 ( [* ^3 A2 V% M4 R3 k  S9 X
2. 输入 p 显示硬盘分割情形。
8 ]" G8 D) ?  u3 s& E3. 输入 a 设定硬盘启动区。 . ^$ j5 k+ _: L% g8 s' k6 Q
4. 输入 n 设定新的硬盘分割区。
  `2 x9 b1 q+ x; q2 |3 f  4.1. 输入 e 硬盘为[扩展]分割区(extend)。
) Z% o8 @$ \/ a: u  f   4.2. 输入 p 硬盘为[首要]分割区(primary)。 , n9 ^- O) n' |) t
5. 输入 t 改变硬盘分割区属性。 & ~9 T  ?& j/ u- `  p! s+ Y* O, K
6. 输入 d 删除硬盘分割区属性。
" y6 L, k1 P, d# n$ ^7. 输入 q 结束不存入硬盘分割区属性。
: `) E8 t" H9 x8. 输入 w 结束并写入硬盘分割区属性5 E0 x$ x( {$ {8 i' ], M$ S/ P& h' l* x
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分% A2 B/ [1 v2 ?4 e7 n" i- i1 F
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。8 a  k( I  a! p' V& |
Command (m for help): n
1 s/ f- Y9 H5 [( J( j9 b2 jCommand action& f1 P' C8 E, u8 {! V/ h) }
   e   extended% o+ W  m& o' ?" ?
   p   primary partition (1-4)
' w  u+ _9 x( ?3 G3 ?1 Y' c" }p
2 G7 |# {: q" [Partition number (1-4): 1
9 x! O& r: I4 xFirst cylinder (1-1020, default 1):
, U0 W9 }- D0 O4 w' w/ S% [Using default value 1: `$ R" q% U) ^  i2 h
Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M' r2 k( h: |- S" o5 C; i" q: {
Command (m for help): n, P6 A, o) [9 g6 S
Command action
2 R  G' v% X; G2 }$ J/ P# Y   e   extended
. E( e' C$ U9 d* n   p   primary partition (1-4)
: V# N3 b6 c. A4 K! Zp
: ]. W1 B' P0 }+ ^* HPartition number (1-4): 2" k4 Q) y8 U' i& B! r6 d2 m$ H
First cylinder (202-1020, default 202): - @" m: N4 S) t6 S1 ^& T7 {( [
Using default value 202* Z4 V$ n8 N8 R% S. g
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): : X3 d3 K  c- n5 u9 H+ D! B
Using default value 1020
% @7 e& I: C( s8 f6 h0 f/ KCommand (m for help): p+ D" u4 _' V$ u) x1 n
Disk /dev/sdb: 2041 MB, 2041577472 bytes

' n' G) G9 L) \- M9 y

63 heads, 62 sectors/track, 1020 cylinders4 T* @3 g# ?) F& b$ ?* B+ S( J
Units = cylinders of 3906 * 512 = 1999872 bytes
6 G  W! D5 P) B- u   Device Boot      Start         End      Blocks   Id  System
9 ]3 ~8 F$ C, W! y: a/dev/sdb1               1         201      392522    b  W95 FAT32$ F- h# |( V- S  ]! c; }
/dev/sdb2             202        1020     1599507   83  Linux$ T$ H, m2 y5 Z8 a# |  x  J7 |
Command (m for help): w' ?7 M4 d2 A) W) k
The partition table has been altered!2 Z+ H* ~- Q) E
Calling ioctl() to re-read partition table.
: \% d0 _% @- \: u! Y) g8 g( rWARNING: Re-reading the partition table failed with error 16: 设备或资源& K$ ^% S% W3 Y( U
忙.5 F+ ?" m# C) C2 N( c) b
The kernel still uses the old table.. ]' I* f! w/ y( x9 G+ Q6 d
The new table will be used at the next reboot.
5 \: y) g7 N% c; jWARNING: If you have created or modified any DOS 6.x7 H9 C( \  c$ [6 {6 \9 F
partitions, please see the fdisk manual page for additional
+ ~2 e2 j8 @4 D. n/ W0 iinformation.# ]. T" j! I3 d! B
Syncing disks.


1 S% O! F! e3 A. O

1.2 格式化分区
' e, L# g% f5 S* L/ [- q    mkfs.vfat /dev/sda1 #第一个分区格式化成fat32$ S6 y! ?1 s7 ]+ a8 j
    mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32
0 w" A" z6 c6 H! p8 s; z4 i: p  可以用 ' H7 L( I  h9 T7 t
    tune2fs -l /dev/sda2 来检验分区类型 
& e% D9 [+ Z0 t, G9 s4 l6 c1.3 拷贝根文件系统
  m6 \8 H( @7 a) f& [- ?( E! d  mount /dev/sda2 /mnt/sdcard #挂载SD卡
- k7 ]/ ]$ v! q  [6 N9 @) J  cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
* |7 P; H4 e! l& O3 `2.   编译        ARM Linux        内核   
' ^5 O% E* E1 W5 b. G 2.1 修改内核配置
' X( W' H) h* Y* ]9 c  确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.! d4 Z: ^3 g6 j/ u
在内核源码目录执行 make menuconfig
8 f+ h$ K& {1 o( r: s  其中ext3在File system下.成功的配置如下。) W* Z/ s' _- b7 w' W
<*> Ext3 journalling file system support       ( U* t' C* n. g9 E4 y4 K
   

  •    Ext3 extended attributes
    " w/ ?- G, |  M   
  •      Ext3 POSIX Access Control Lists

  •      Ext3 Security Labels  : H: @" B$ {) J2 ^  ?8 w) B
    SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下
    ) m9 L' X$ U+ R& e6 f* s+ }; P: E) ? --- MMC/SD/SDIO card support                           
    - e8 O' X* q* H6 _, b
  •    MMC debugging                                    2 C+ y: G, W0 S7 @  L$ a* z
    [ ]   Allow unsafe resume (DANGEROUS)                  5 l$ k) Y1 {! y! k* @' R
           *** MMC/SD/SDIO Card Drivers ***                 
    2 F3 f% b' V& T" u  ]: g3 c1 v <*>   MMC block device driver                          
    $ ^6 p5 q: `1 J1 e
  •      Use bounce buffer for simple hosts            
    . `8 Y1 v# J8 }! P+ O& ` <*>   SDIO UART/GPS class support                      + v  o- X, n" f
    <*>   MMC host test driver                             
    $ {7 R6 k6 _4 q: r  }" e       *** MMC/SD/SDIO Host Controller Drivers ***      , N( B" L2 ~# Z* f* c" f
    <*>   Secure Digital Host Controller InteRFace support
    / E- d9 O# S: J$ M2 ^4 ~6 B$ }1 q <*>   Samsung S3C SD/MMC Card Interface $ W  b4 ?8 S1 ^2 z5 |. f) d
    support        
    8 F- a: Q2 u: K) G7 |# a  编译内核 make zImage

    ' S. T6 v" O, p, T) c6 w' e

    2.2 在ARM-linux下的测试.+ h3 u6 Z  Y8 n/ [, ]
       在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
    $ P4 t( z7 f6 g9 r" I0 z[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).                           # j  J/ R  g1 E5 l0 S4 m  ]3 ~
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                  / }. s$ f; D$ l, Y: p5 L: J
    s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    ; i1 j3 H0 v" x- r* s6 s- I7 W- zs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    * F4 a2 B; r9 x6 r* ~3 g/ is3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    . @  h& e' p' j/ Gs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    7 N, B0 N1 ~7 H. Os3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    * D; v* U3 |" s: }3 h9 C( js3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).                                 
    & b7 w$ ]9 Z( M2 @6 [6 s- ^s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
    $ r2 i0 Y9 `3 H0 T% ]s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).                              
    ) j. P  p, Q! w8 @& Dmmc0: new SD card at address 0002                                                                - _/ t  K6 q. T
    mmcblk0: mmc0:0002 00000 1.90 GiB                                                               
    5 j* K# z8 R3 N, J9 ? mmcblk0: p1 p2                                                                                 
    * z; |9 r  ^5 U% r, A! d3 wFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case, `& s1 S1 N0 n' }2 T! s
    sensitive! 1 `! X& ?( }: R6 E' M6 k3 f
    但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如  o! g& j1 R. e1 D6 N6 D
    下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)# r5 h( Q+ y! Q4 l5 k
    [root: /]# ls -l /dev/mmc*                                             
    ' ~  ]8 j" O& z$ sbrw-rw----    1 root     root     179,   0 Sep 22 10:48 /dev/mmcblk0   
    5 y# ^9 x/ S; a( Z% ^3 cbrw-rw----    1 root     root     179,   2 Sep 22 10:48 /dev/mmcblk0p2


    $ L) D  P* @  C; I# ?7 ~1 E$ t. f, X

    测试ext3分区. H% Q0 d; w3 U: C& p
    mount -t ext3 /dev/mmcblk0p2 /mnt
    - v+ l) C- }2 U/ l) ^7 o: `在/mnt上可以读写文件.表示ext3分区正常.
    . q- f9 S" u6 q3 f手动建立第一个分区的结点.( Z2 Q0 v: W7 u3 U* j' @0 P) ^& s
    mknod /dev/mmcblk0p1 b 179 1 - [% g2 T: I: s; H; z, M- G, p
    测试vfat 分区2 ~# b: V' x+ [9 k! O# J) Y
    mount -t vfat /dev/mmcblk0p1 /mnt
    ! B$ Q6 }& h% f+ ~1 Q5 Q在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用9 t( e9 e$ B0 g' \8 a7 W, P
    这个分区
    9 [4 h0 _3 I, B. S2 L+ T- a8 d3.   使用        SD        卡分区作为根文件   
    1 G7 h0 J) i1 {% V4 u 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动
    9 o% v* f+ J* O) b参数。. a4 I. j9 G: y( s0 L$ p+ K
    成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0 % t9 g; u) m4 ]7 f1 R/ P: g" b. ~
    其中179和2是sd卡上ext3分区的主设备和从设备号。
    2 z3 I# O# t, p  |. K用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
    0 i' d: |/ q- }/ ?. D为根文件系统。

    7 y; Y+ ^8 @8 \9 ?2 a

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

    4 @. ~; |0 }% I( w" K. g7 c

    .......
    5 J1 U3 e" [/ E2 z( B; H

    VFS: Cannot open root device "179:2" or unknown-block(179,2)1 I. ~* [) v  y. \7 m
    Please append a correct "root=" boot option
    % _8 j  D/ Y( S$ X2 m. [Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

    3 Y  Z  T( s3 h6 e
  • 该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-25 21:13 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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