Beaglebone Black——制作自己的SD启动卡

制作一张SD启动卡,可以有两种选择,第一,利用TI-SDK的脚本来制作,该脚本功能较多,可以制作2分区的也可以制作3分区的启动卡,而且写入的相关启动文件比如MLO、u-boot.img、根文件系统(包括了内核)既可以是TI-SDK包里面自带的预编译好的,也可以是自己做的放在其他地方的文件;第二,完全自己手动制作,定制一张自己想要的大小、分区数、写入自己编译的MLO、u-boot.img、根文件系统,这样也算是DIY了。

        TI-SDK包的使用不做说明,非常简单好用,运行脚本creat-sdcard.sh即可。下面介绍手动制作启动卡的步骤。

1、关于SD卡启动模式

         当按住BBB板子上的boot按键,板子便从SD卡(也就是mmc0)启动,此时ROM-Code从SD卡的一个活动主分区(boot分区)寻找SPL文件,将其加载到片内SRAM,控制权移交SRAM,之后SPL运行后又以和寻找SPL相同的方式开始寻找u-boot.img文件,于是从boot分区找到u-boot.img文件,并将其加载到片外SDRAM,之后u-boot加载内核,挂载根分区的根文件系统(rootfs分区)。系统启动!

          由此得出结论,一张SD必须具备一个活动主分区,而且分区格式为FAT32(LBA),暂时把这个分区的名字叫做boot,boot分区中必须要有MLO、u-boot.img,以及一个根分区,分区格式为ext3/4,叫做rootfs,rootfs分区中必须有根文件系统,其他的就无所谓了。也就是说其他的文件可以和这些文件共存,只要保证这些文件以及目录完好即可。

           既然现在大小、分区数都有自己来定了,那么我手上一张8GB的内存卡microSD,我希望除了这两个用于启动系统的分区外还有第三个分区用于存放自己的文件,这样以后操作另外两个分区不会影响第三个分区,也不用像以前老是要把U盘的东西复制出来腾出空间做启动盘。在Linux可系统中对于一个移动设备它可以识别上面所有的分区,包括ext2/3/4以及FAT32(LBA),而windows系统对于一个移动设备,他仅仅识别上面第一个主分区,如果没有主分区就识别第一个逻辑分区,仅仅支持FAT32(LBA)格式。另外,对于BBB开发板,活动主分区一定要在第一个,否则启动系统时找不到文件。

            那么,有两种选择,

             1)分区为boot分区,活动主分区,格式FAT32(LBA),大小50M即可

             2)分区为rootfs分区,主分区,格式ext3/4,大小2GB

             3)分区为store分区,主分区,格式ext3/4,剩余全部空间

             或者

             1)分区为boot分区,活动主分区,格式FAT32(LBA),大小5GB

             2)分区为rootfs分区,主分区,格式ext3/4,剩余全部

            两种分区方法各有好处缺点。也可以有其他选择。Note:一个硬盘或者移动存储设备,上面最多可以有四个分区,其中包括主分区和扩展分区,并且扩展分区最多一个,当然也可以没有扩展分区。扩展分区之下可以有若干个逻辑分区。所以总容量=主分区+扩展分区,而扩展分区=逻辑分区之和。

 

2、制作SD卡

         选择第二种方案进行分区。操作环境,虚拟机ubuntu12.04,microSD卡8GB,BBB开发板。

step1:设置SD卡的磁头数、扇区数、柱面数,即H、S、C,这样设置是为了向SD卡读写数据是达到较高性能,其中C=SD卡bytes/H*S*512,我的SD卡的C=966,。

相关参考资料

http://omappedia.org/wiki/SD_Configuration#Alternative_Script_to_format_SD_Cards_for_3_partitions

http://bbs.mydigit.cn/read.php?tid=331754

http://bbs.mydigit.cn/read.php?tid=152497

 

[plain]  view plain  copy
  1. zhouyu@zhouyu-virtual-machine:~$ ls /dev | grep sd  
  2. sda  
  3. sda1  
  4. sda2  
  5. sda5  
  6. sda6  
  7. sdb  
  8. sdb1  
  9. sdc  
  10. sdc1  
  11. sdd  
  12. sdd1  
  13. sdd2  
  14. sdd3  
  15. sdd5  
  16. zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd5  
  17. zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd2  
  18. zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd3  
  19. zhouyu@zhouyu-virtual-machine:~$ sudo fdisk /dev/sdd  
  20.   
  21. 命令(输入 m 获取帮助): p  
  22.   
  23. Disk /dev/sdd: 7948 MB, 7948206080 bytes  
  24. 245 heads, 62 sectors/track, 1021 cylinders, total 15523840 sectors  
  25. Units = 扇区 of 1 * 512 = 512 bytes  
  26. Sector size (logical/physical): 512 bytes / 512 bytes  
  27. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  28. Disk identifier: 0x00000000  
  29.   
  30.    设备 启动      起点          终点     块数   Id  系统  
  31. /dev/sdd1            2048    10487807     5242880    5  扩展  
  32. /dev/sdd2   *    10487808    10569727       40960    c  W95 FAT32 (LBA)  
  33. /dev/sdd3        10569728    15523839     2477056   83  Linux  
  34. /dev/sdd5            4096    10487806     5241855+   c  W95 FAT32 (LBA)  
  35.   
  36. 命令(输入 m 获取帮助):   

插入SD卡后用命令查看一下,当前SD卡的标号是sdd,而且里面已经有分区sdd1(扩展分区),sdd2(活动主分区),sdd3(主分区),sdd5(逻辑分区),现将其全部卸载,再用fdisk程序开始进行分区工作。

 

[plain]  view plain  copy
  1. 命令(输入 m 获取帮助): d  
  2. 分区号 (1-5): 1  
  3.   
  4. 命令(输入 m 获取帮助): d  
  5. 分区号 (1-4): 2  
  6.   
  7. 命令(输入 m 获取帮助): d  
  8. Selected partition 3  
  9.   
  10. 命令(输入 m 获取帮助): x  
  11.   
  12. 专家命令(输入 m 显示帮助): h  
  13. 磁头数 (1-256,默认为 245): 255  
  14.   
  15. 专家命令(输入 m 显示帮助): s  
  16. 扇区数 (1-63,默认为 62): 63  
  17.   
  18. 专家命令(输入 m 显示帮助): c  
  19. 柱面数 (1-1048576,默认为 1021): 966  
  20.   
  21. 专家命令(输入 m 显示帮助): r  
  22.   
  23. 命令(输入 m 获取帮助):   

先删除原先的分区,在输入指令X进入专家模式,分别设置H、S、C。C=SD卡bytes/H*S*512,取整数。设置完后输入R返回,继续。

 

step2:分区设置

[plain]  view plain  copy
  1. 命令(输入 m 获取帮助): p  
  2.   
  3. Disk /dev/sdd: 7948 MB, 7948206080 bytes  
  4. 255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
  5. Units = 扇区 of 1 * 512 = 512 bytes  
  6. Sector size (logical/physical): 512 bytes / 512 bytes  
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  8. Disk identifier: 0x00000000  
  9.   
  10.    设备 启动      起点          终点     块数   Id  系统  
  11.   
  12. 命令(输入 m 获取帮助): n  
  13. Partition type:  
  14.    p   primary (0 primary, 0 extended, 4 free)  
  15.    e   extended  
  16. Select (default p): p  
  17. 分区号 (1-4,默认为 1): 1  
  18. 起始 sector (2048-15523839,默认为 2048): 2048  
  19. Last sector, +扇区 or +size{K,M,G} (2048-15523839,默认为 15523839): +6G  
  20.   
  21. 命令(输入 m 获取帮助): n  
  22. Partition type:  
  23.    p   primary (1 primary, 0 extended, 3 free)  
  24.    e   extended  
  25. Select (default p): p  
  26. 分区号 (1-4,默认为 2): 2  
  27. 起始 sector (12584960-15523839,默认为 12584960):   
  28. 将使用默认值 12584960  
  29. Last sector, +扇区 or +size{K,M,G} (12584960-15523839,默认为 15523839):   
  30. 将使用默认值 15523839  
  31.   
  32. 命令(输入 m 获取帮助): p  
  33.   
  34. Disk /dev/sdd: 7948 MB, 7948206080 bytes  
  35. 255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
  36. Units = 扇区 of 1 * 512 = 512 bytes  
  37. Sector size (logical/physical): 512 bytes / 512 bytes  
  38. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  39. Disk identifier: 0x00000000  
  40.   
  41.    设备 启动      起点          终点     块数   Id  系统  
  42. /dev/sdd1            2048    12584959     6291456   83  Linux  
  43. /dev/sdd2        12584960    15523839     1469440   83  Linux  
  44.   
  45. 命令(输入 m 获取帮助):   


可以看到新建分区前指令p的输出显示没有任何分区,再按照前面说的方案进行分区后在输入指令p查看新建的分区。

 

step3:改变boot分区的系统id和设置boot分区为活动主分区

[plain]  view plain  copy
  1. 命令(输入 m 获取帮助): t  
  2. 分区号 (1-4): 1  
  3. Hex code (type L to list codes): c  
  4. Changed system type of partition 1 to c (W95 FAT32 (LBA))  
  5.   
  6. 命令(输入 m 获取帮助): a  
  7. 分区号 (1-4): 1  
  8.   
  9. 命令(输入 m 获取帮助): p  
  10.   
  11. Disk /dev/sdd: 7948 MB, 7948206080 bytes  
  12. 255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
  13. Units = 扇区 of 1 * 512 = 512 bytes  
  14. Sector size (logical/physical): 512 bytes / 512 bytes  
  15. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  16. Disk identifier: 0x00000000  
  17.   
  18.    设备 启动      起点          终点     块数   Id  系统  
  19. /dev/sdd1   *        2048    12584959     6291456    c  W95 FAT32 (LBA)  
  20. /dev/sdd2        12584960    15523839     1469440   83  Linux  
  21.   
  22. 命令(输入 m 获取帮助): w  
  23. The partition table has been altered!  
  24.   
  25. Calling ioctl() to re-read partition table.  
  26.   
  27. WARNING: If you have created or modified any DOS 6.x  
  28. partitions, please see the fdisk manual page for additional  
  29. information.  
  30. Syncing disks.  

 

通过指令x,将分区表写入SD卡,分区完成!

 

step4:分区格式化

[plain]  view plain  copy
  1. zhouyu@zhouyu-virtual-machine:~$ sudo mkfs.vfat -F 32 -n boot /dev/sdd1  
  2. [sudo] password for zhouyu:   
  3. mkfs.vfat 3.0.12 (29 Oct 2011)  
  4. zhouyu@zhouyu-virtual-machine:~$ sudo mkfs.ext3 -L rootfs /dev/sdd2  
  5. mke2fs 1.42 (29-Nov-2011)  
  6. 文件系统标签=rootfs  
  7. OS type: Linux  
  8. 块大小=4096 (log=2)  
  9. 分块大小=4096 (log=2)  
  10. Stride=0 blocks, Stripe width=0 blocks  
  11. 91968 inodes, 367360 blocks  
  12. 18368 blocks (5.00%) reserved for the super user  
  13. 第一个数据块=0  
  14. Maximum filesystem blocks=377487360  
  15. 12 block groups  
  16. 32768 blocks per group, 32768 fragments per group  
  17. 7664 inodes per group  
  18. Superblock backups stored on blocks:   
  19.     32768, 98304, 163840, 229376, 294912  
  20.   
  21. Allocating group tables: 完成                              
  22. 正在写入inode表: 完成                              
  23. Creating journal (8192 blocks): 完成  

第一个分区被格式化成FAT32(LBA),分区名称boot。

第二个分区被格式化成ext3,分区名称rootfs。

 

step5:拷贝MLO、u-boot.img、rootfilesystem

[plain]  view plain  copy
  1. <pre class="plain" name="code">zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sudo cp MLO-am335x-evm /media/boot/MLO  
  2. zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sudo cp u-boot-am335x-evm.img /media/boot/u-boot.img  
  3. zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sync  
  4. zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/filesystem$ sudo tar -zxvf tisdk-rootfs-image-am335x-evm.tar.gz -C /media/rootfs/  
  5. zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/filesystem$ sync  
 
对于硬盘、优盘这类块设备,每次拷贝完文件其实文件只是写入了缓冲区,所以CP完后都要执行sync,将读写操作真正完成。 

 

step6:上述步骤完成后,一张SD启动卡算是完成了,插到板子上,按住boot按键,然后上电,结束!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值