EDA365电子论坛网

标题: 修正无法正常从SD卡加载根文件系统 [打印本页]

作者: ulppknot    时间: 2020-6-11 15:24
标题: 修正无法正常从SD卡加载根文件系统
对SD卡进行分区,然后试图从SD加载EXT3文件系统。但是,在加载过程中会有如下报错:' o7 A" w( n. w$ w+ `$ Q  J- C

" ]: |9 d, r! f2 f.......
3 T& v/ G6 g4 _! d1 P2 ?: t8 G& E5 B" l% t
VFS: Cannot open root device "179:2" or unknown-block(179,2)
/ r7 X, p: Q- p2 iPlease append a correct "root=" boot option
+ o* J, \6 h$ G; `Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)  }4 S7 y7 ~- U
& B& [8 I/ v6 @; v

. R8 d4 X" y& c! F1 s0 A' V. J; b, _4 F. K! C3 V9 ~- y1 F7 @
首先,先确保你的SD卡没有写保护。如果写保护了,也有可能造成上面的输出。. h, P# }/ t$ H! e' m

/ @2 w  i8 f/ \$ ~0 B2 |4 \- `其次,修改Uboot的bootargs。修改内容如下:, W) ~3 ?* b3 z3 l
. G: R, k8 Q4 E) P" T6 U: O; r; J
U-Boot> setenv bootargs noinitrd root=179:2 rw rootdelay=3 rootfstype=ext3 console=ttySAC0$ U/ \3 Z+ F$ C* ~

+ c% F0 n: H& D5 s, `- z5 O0 m  n其实就是增加rootdelay这个参数,该参数的目的是让根文件系统的加载时间推迟3秒。9 w3 t/ _0 w$ v! G# y
  l$ t4 q5 [% J  S' {, r
推迟3秒是为了让sd卡能够先初始化完毕,让后再从sd卡加载文件系统。7 [8 y& v, E5 g$ n. Y! K7 \8 R6 g
5 _. o8 |( Y- `7 U0 E# k$ W
So之所以内核会panic就是因为sd卡都没有初始化,还要让内核去sd卡加载文件系统,怎么可能加载成功。
( I8 `$ c7 s2 Q% d4 ^: ?
( j1 Z4 Q4 z5 D2 N# ^% s& p7 \% A
  U4 U  A- \/ m) D: B* R
# t6 t/ X$ t9 x; R/ {+ r# g那么怎么可以推断出是因为根文件系统的加载早于sd卡的初始化,所以造成内核panic的呢?1 F9 f9 j9 R. I9 ]
( I% `- B( ~' _9 c- g
来看下正常情况下,根文件系统位于nandflash中,内核从nandflash加载yaffs2根文件系统,同时,SD卡已插入卡槽中。
9 G& n) c: @+ a4 U3 Y& d6 S
  g3 Z6 k4 V+ b9 b: Y* M给开发板上电,我们看下输出信息:
7 `& b0 p8 m$ q4 T$ h
% W& k6 C: a. q# y  z  H....
" K# |. y. E$ E" @$ M. M0 Y& G) Q5 |. D
yaffs: dev is 32505856 name is "mtdblock0"
3 k4 o4 C2 g! G1 Z+ qyaffs: passed flags ""1 Z9 H. T/ Q/ `9 i" U/ Y
yaffs: Attempting MTD mount on 31.0, "mtdblock0"/ p+ [8 {. R5 Z% L( \) l
block 419 is bad
! Z# Y( r9 {# G' _8 Zblock 420 is bad) ~9 n. P. B& i4 S2 V
block 421 is bad0 b; Q5 v1 m) [# b3 B6 }. G
block 423 is bad
5 W8 A, C) M6 u- Yblock 424 is bad* d" h( F0 Z$ \) p6 d) c
block 425 is bad
4 s, T$ h, m4 X' o. v- f+ fblock 426 is bad
) }, t/ C  {& r* N, ^: L3 WVFS: Mounted root (yaffs filesystem).1 j4 O' Q& M; m- w4 W
Freeing init memory: 104K( h; C9 u- H6 _
mmc0: card is read-write( w7 F2 D. f6 c
mmcblk0: mmc0:5996 SD02G 1921024KiB " h, u) d: d- _$ ?
mmcblk0: p1 p2
$ A( b$ |' M3 @starting udev...kjournald starting.  Commit interval 5 seconds
7 `* y8 X$ S5 Y) n- l: V% U' a! WEXT3 FS on mmcblk0p2, internal journal2 ]. M, L! @$ Q8 s  e* F6 W2 ]+ W
EXT3-fs: recovery complete.7 _/ g; E5 T5 j9 Z
EXT3-fs: mounted filesystem with ordered data mode.
. _4 G( }- E. g4 a# i! Kdone
' h, t8 C' u; e1 K6 ?& x3 |* D
  |. K4 [. e4 C....
) g0 B4 I0 P$ F5 T3 ?
2 l0 u4 H. @1 f' e! \' L5 V" ]2 S我们可以看到,内核首先加载了根文件系统yaffs,然后才加载了sd卡。1 c! B) L: w  F) w
) [" k( r0 K! [) r) R7 r4 Q) G0 I
因此,如果不推迟根文件系统加载的时间,sd卡根本得不到初始化的机会。* o+ k7 [& f  o7 O
0 ~" G( |* I1 G# U3 {" F

! C5 Z  r# k% I  b& \  ]7 n: i4 {4 i! {! \3 Q  i8 a6 @) E
最后,我们看下加入rootdelay参数后的输出情况。* {9 K0 g" k- }# U0 R% M! Z2 i
3 A8 h# |, r( i2 I! ]0 v/ M; g
...7 a' |0 z. D/ M5 ~1 w
5 [; h6 ]3 n9 m" K' q! g
Waiting 3sec before mounting root device...
! o+ {" B, i- L* w  e7 O, Fmmc0: card is read-write& D- _* g7 P1 R, p6 h- S
mmcblk0: mmc0:5996 SD02G 1921024KiB
/ b' Z! O$ n! C mmcblk0: p1 p2) R, b9 U! b" n* a0 o1 G- [
kjournald starting.  Commit interval 5 seconds
  e7 U2 i, [! z7 s) z- {EXT3 FS on mmcblk0p2, internal journal
( W* V5 ?/ a8 @2 V1 k) v& eEXT3-fs: recovery complete.
' b  E7 v8 j  ?9 W% ~EXT3-fs: mounted filesystem with ordered data mode.
" o/ E. X/ B3 P( ?) h4 T# v* c% ?' cVFS: Mounted root (ext3 filesystem).( d6 |& {' J- |: D0 g
Freeing init memory: 104K0 M2 S' x. i$ q3 a9 ^- y4 A
starting udev...done
7 f/ j  i! r6 r+ Y+ ?
! g0 c# W! y5 u& B# M...
0 i2 c5 I5 c3 Z1 P& ?
$ v! V- d; a9 Y/ `  \从上面的输出来看,内核推迟了3秒加载根文件系统,先加载了SD卡,然后挂载了ext3文件系统。
& b# O4 [( [8 ?1 X. g5 }* _, o; E9 W. \' N( g! m% ]) c

, o  F: k/ `" `0 H& c, b
  Y0 P' B: E0 K8 _' N9 ]7 `- s( S# e, Y- X

作者: NingW    时间: 2020-6-11 16:42
从SD卡加载根文件系统




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