Android4.4 找不到内部存储空间

 

2019-05-24

关键字:rk3128 找不到内部存储空间、Android 提示 SD 卡正忙、Android 没有内部存储


 

 

问题现象

 

笔者的 Android 4.4 的 rk3128 开发板认不到内部存储空间。打开文件管理器检测不到存储,打开音乐播放器提示 SD 卡正忙或者 SD 卡损坏,使用浏览器下载文件也提示无法保存,在串口上也看不到传统 Android 的文件存储空间里那几个标准的目录的存在。标准的 Android 内部存储器的默认文件目录结构一般都如下图所示

图 1 正常的内部存储文件结构

 

解决办法

 

笔者所遇到的这个问题,根本原因是因为文件系统分区信息没填好导致的。下面介绍下解决这个问题的关键步骤。

 

Android 用于提供给应用层,或者说提供给用户使用的分区或者说目录主要有两个。一个是 /data 目录,/data 目录最主要的目的是用来保存 APK 运行时产生的文件用的。另外一个是 /sdcard 目录,这个目录就是我们使用文件管理器看到的那个空间了,可以简单理解为用来给用户存歌存电影存照片用的。不过需要注意的是,这个目录由于不同的 ROM 可能会有差异,有的系统可能是 /storage/sdcard 或者其它的目录。而笔者所遇到的这个问题,就是这个 /sdcard 目录为空导致的。那,要怎么才能让它不为空,让它能自动创建出如图 1 所示的文件结构出来呢?请看下面的分析。

 

首先,无论是 /data 目录还是 /sdcard 目录,亦或是 /system 目录,它都对应着各自的分区。这个分区信息在每次开机的时候都会在内核打印中打印出来。承载开机信息的就是 CMDLINE,或者说,就是 bootargs。

图 2 开机分区信息

从上图所示的 CMDLINE 中,我们很清楚地看到有我们熟悉的 kernel 分区、boot 分区、recovery 分区和 system 分区等。在 rk3128 中,/data 目录对应的分区名是 userdata,/sdcard 目录对应的分区名是 user。我们要想开发板上 /data 目录和 /sdcard 目录能正常使用,首先就要保证在分区配置信息里有这两项信息,并正确分配了空间大小。

 

那,在源码中记载这个分区配置信息的文件在哪里呢?笔者的 rk3128 里在如下文件中

./RKTools/windows/AndroidTool/rockdev/rk312x.parameter.txt

在这个文件中,我们只需要在最后一行的 CMDLINE 项中添加我们的分区信息即可。笔者这里添加的信息如下

CMDLINE:console=ttyFIQ0 androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:
0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),
0x00006000@0x0000E000(kernel),0x00006000@0x00014000(boot),0x00010000@0x0001A000(recovery),
0x00020000@0x0002A000(backup),0x00040000@0x0004A000(cache),0x00002000@0x0008A000(metadata),
0x00002000@0x0008c000(kpanic),0x000c8000@0x0008e000(system),0x00180000@0x00156000(userdata),-@0x002d6000(user)

一定要注意,上面这些信息都一定是记录在一行上的。笔者这里为了方便观看才将它拆成若干行的。笔者主要添加的分区信息已在最后标蓝加粗显示。这里再来简单解释下这些分区是如何配的。我们以 userdata 为例。前面的 0x00180000 表示的是要给这个分区分配多少空间。这里的计算方式是将这个值转成十进制以后除以 2048 ,比如在这里 0x00180000 ÷ 2048 = 768 MB。后面的 0x00156000 则是这个分区的起始地址。再后面括号里面的就是分区名字了。后面 user 分区里有一个 “-” ,这个表示剩余的空间全都分给 user 分区。

 

在上面配置好分区信息以后就是要关注一下文件系统配置表 fstab 了。这个配置表是用来挂载的。前面那个分区分集仅仅表明要怎么来瓜分我们的 FLASH,但对于 Linux 来说,光有分区还不能用啊,必须要找一个目录来挂载。

 

笔者的 rk3128 所使用的 fstab 为以下这个,不同的系统可能会应用不同的 fstab 文件,需要大家自行确定。

./device/rockchip/rk312x/fstab.rk30board.bootmode.emmc

这里,主要关注下我们的 userdata 分区与 user 分区就好。

/dev/block/platform/1021c000.rksdmmc/by-name/metadata       /metadata           ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard          wait
/dev/block/platform/1021c000.rksdmmc/by-name/userdata       /data               ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard          wait,encryptable=/metadata/key_file
# /dev/block/platform/1021c000.rksdmmc/by-name/radical_update /radical_update     ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard          wait

/devices/1021c000.rksdmmc/mmc_host/mmc          /mnt/internal_sd     vfat      defaults        voldmanaged=internal_sd:13,noemulatedsd
#/devices/10214000.rksdmmc/mmc_host/mmc          /mnt/external_sd     vfat      defaults        voldmanaged=external_sd:auto

这里主要关注上面标红的两项即可,不同源码,某些相关的路径可能会有差异,这里也需要大家自行确定。对了,这里有一个非常重要,也非常容易忽略的地方。就是上面红色灰底的那个数字 13。这个数字是你的 分区号 。可千万不能填错,填错了我们的 /sdcard 就不能在 FLASH 中正确找到分区位置了。可以通过如下命令查看系统中的分区信息来确定这个数字

root@rk312x:/ # ll /dev/block/platform/1021c000.rksdmmc/by-name/ 
lrwxrwxrwx root     root              1970-01-01 00:00 backup -> /dev/block/mmcblk0p7
lrwxrwxrwx root     root              1970-01-01 00:00 boot -> /dev/block/mmcblk0p5
lrwxrwxrwx root     root              1970-01-01 00:00 cache -> /dev/block/mmcblk0p8
lrwxrwxrwx root     root              1970-01-01 00:00 kernel -> /dev/block/mmcblk0p4
lrwxrwxrwx root     root              1970-01-01 00:00 kpanic -> /dev/block/mmcblk0p10
lrwxrwxrwx root     root              1970-01-01 00:00 metadata -> /dev/block/mmcblk0p9
lrwxrwxrwx root     root              1970-01-01 00:00 misc -> /dev/block/mmcblk0p2
lrwxrwxrwx root     root              1970-01-01 00:00 recovery -> /dev/block/mmcblk0p6
lrwxrwxrwx root     root              1970-01-01 00:00 resource -> /dev/block/mmcblk0p3
lrwxrwxrwx root     root              1970-01-01 00:00 system -> /dev/block/mmcblk0p11
lrwxrwxrwx root     root              1970-01-01 00:00 uboot -> /dev/block/mmcblk0p1
lrwxrwxrwx root     root              1970-01-01 00:00 user -> /dev/block/mmcblk0p13
lrwxrwxrwx root     root              1970-01-01 00:00 userdata -> /dev/block/mmcblk0p12

首先查到我们的 user 分区所对应的 blk id 是 mmcblk0p13。其次再执行如下命令进一步确定

图 3 确定分区号

于是,我们的数字 13 就确定下来了。

 

至此,分区配置相关的,我们都做完了。还剩下临门一脚了!

 

最后一步,则是要确保几个和文件系统相关的后台进程能正常运行。主要检查 init.rc。

 

首先是要确保 sdcard 进程的正确启动。笔者在这里所使用的文件是下面这个,同样的,大家需要自行确定自己所应用的到底是哪一个文件。

./device/rockchip/rksdk/init.rk30board.rc

 

在这个文件中,主要是要确保这条服务的正确配置

# create virtual SD card at /mnt/sdcard, based on the /data/media directory
# daemon will drop to user/group system/media_rw after initializing
# underlying files in /data/media will be created with user and group media_rw (1023)
service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated
    class late_start

这里,特别重要的是上面标红的,默认这处的值是 class main ,使用 class main 是有问题的!!!必须要改成上面这种形式。

 

然后则是要确保另外两个服务配置,不过这两个配置一般问题不大

service vold /system/bin/vold
    class core
    socket vold stream 0660 root mount
    ioprio be 2
    
service installd /system/bin/installd
    class main
    socket installd stream 600 system system

配完以后,就可以编译烧写然后验证的了。确保好上面这个三进程在后台常驻就好

图 4 常驻进程

 

照着上面这些步骤来一次,一般都没问题的了。不过笔者仍然不敢保证有些同学会有特例,遇到问题时,沉着冷静照着打印信息来分析一般都能解决掉问题。

 

对了,额外提一下,在调试过程中可以经常通过 df 命令、mount 命令来查看一下,上面标注的信息可能会有些帮助哦。下面是笔者这里解决了问题后的这两条命令的输出

 

 

 

祝您好运~

 


 

posted @ 2019-05-24 21:10  大窟窿  阅读(716)  评论(0编辑  收藏  举报