查看: 8200|回复: 6

[原创] 【一网打尽】rene个人教程之使用U-Boot让树莓派从U盘启动

[复制链接]
  • TA的每日心情

    2015-8-29 20:27
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2015-3-25 19:51:47 | 显示全部楼层 |阅读模式
    分享到:

    Das U-Boot, 通常叫做U-Boot, 嵌入式系统的常用bootloader. U-Boot允许使用SD卡上单个指定文件的内容作为额外的启动参数, 为树莓派增加不少灵活性.
    本文将详细介绍如何让U-Boot运行在树莓派上, 以及通过SD卡或者从网络走TFTP服务器来启动镜像.

    准备U-Boot镜像文件获得源码

    现在U-Boot的主分支还不支持树莓派. 我们需要从GitHub上Gonzoua的分支获取代码. 请注意显示为默认的’master’分支是未修改的U-Boot代码 – 我们需要用’rpi’分支获取正确的代码.


    编译源码

    首先, 我们需要导出交叉编译器的前缀来指定树莓派. 如果你的gcc库为arm-none-linux-gnueabi-gcc, 运行命令:
    CROSS_COMPILE=arm-none-linux-gnueabi-
    export CROSS_COMPILE
    然后在U-Boot源码目录中, 运行下列命令开始编译:
    make rpi_b
    整个编译过程应该花不了几分钟时间.

    编译镜像文件


    u-boot.bin文件应该用作输入文件.

    在编译完成后, 把kernel.img文件移动到SD卡上. 最好把镜像文件名改成类似uboot.img, 和实际内核镜像区分开来. 在config.txt文件中加上:
    kernel=uboot.img

    测试镜像

    树莓派将会使用新的U-Boot镜像启动. 在屏幕上应该会显示U-Boot加载, 如果你连上了串口还应该有其输出.

    编译U-Boot镜像

    请确认获取了内核的源码, 并且对内核编译过程比较熟悉. 有内核源码就可以编译U-Boot镜像了, 相比而言编译内核镜像还容易些. 首先, 我们要把U-Boot工具mkimage放到能被编译进程找到的地方, 把工具复制到交叉编译器的bin目录下. 然后在U-Boot源码目录执行命令把路径和前缀替换为实际交叉编译器的相应内容)
    cp tools/mkimage <your_cross_compiler_path>/bin/arm-none-linux-gnueabi-mkimage
    在内核源码目录, 开始编译U-Boot镜像:
    make uImage
    生成的启动镜像文件在arch/arm/boot/uImage.

    U-Boot引导选项从SD卡启动

    从SD卡启动时无需修改config.txt便可以使用多内核镜像. 把uImage文件放到SD卡上, 然后启动. 按任意键进入命令行, 输入以下命令:
    mmc rescan
    fatload mmc 0:1 ${loadaddr} <your_uImage_file>
    bootm

    通过网络走TFTP服务器启动

    我们需要有一个配置好的TFTP服务器. 将uImage文件放到TFTP根目录中, 并确认有相应文件权限 (允许任何人进行读取 – 如果不确定, 执行一次chmod a+r uImage).
    用DHCP启动前, 请先确认DHCP已经设置过next-server和filename参数. 接着启动树莓派, 按任意键进入命令行, 输入以下命令:
    usb start
    dhcp
    bootm
    用固定IP启动:
    usb start
    setenv serverip <tftp_server_ip>
    setenv ipaddr <a_spare_ip_address>
    tftpboot uImage
    bootm

    U-Boot脚本文件

    上一节的内容可以写进一个文本文件, 然后编译到U-Boot脚本文件中, 以便在启动时自动执行. 用下面的命令来生成脚本:
    arm-none-linux-gnueabi-mkimage -A arm -O linux -T script -C none -d <your_script_text_file> boot.scr
    把boot.scr文件放在SD卡上, 在树莓派启动的时候会自动使用.


    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2015-8-17 09:38
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-26 05:53:54 来自手机 | 显示全部楼层
    支这个uboot持rpi2吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-8-29 20:27
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2015-3-26 20:01:53 | 显示全部楼层
    懒兔子 发表于 2015-3-26 05:53
    支这个uboot持rpi2吗

    我有rpi2的话就不会发帖了。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-8-17 09:38
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-28 00:36:57 | 显示全部楼层
    renegade 发表于 2015-3-26 20:01
    我有rpi2的话就不会发帖了。。。

    好吧……其实树莓2淘宝已经降到230
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-5-6 23:27
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2015-5-1 17:08:28 | 显示全部楼层
    本帖最后由 haven200 于 2015-5-1 17:14 编辑

    我找了个小容量的SD卡,将镜像直接写入U盘,然后将U盘的boot分区的文件复制到SD卡根目录下
    修改SD卡根目录下的一个txt来着,因为U盘现在有2个分区,一个是boot(/dev/sda1)分区,另一个才是root(/dev/sda2)分区,所以将boot=/dev/mmcblkp01修改为boot=/dev/sda2
    然后,直接就启动成功了

    PS:我的SD卡压根儿就没格式化,只是简单的将里面的文件给全删除了,但小派它就是启动成功了……看来SD卡的0扇区没有引导程序,小派每次启动时会自动在SD卡根目录下寻找启动程序

    最后又写了个启动脚本,每次启动后,
    umount /boot  #卸载SD卡
    mount /dev/sda1 /boot  #加载U盘上的boot分区
    mount /dev/mmcblkp01 /media/boot
    cp -R /boot/* /media/boot   #将U盘boot分区内容复制到SD,防止系统内核更新后,SD卡无法更新
    umount /media/boot #卸载SD卡

    因为我的小派用来做家庭云了,所以我晚上睡觉时直接拨电源
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-9-11 12:54
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-9-7 18:27:10 | 显示全部楼层
    留下个脚印。

    http://surenpi.com
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-18 11:38
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-9-12 20:52:14 | 显示全部楼层
    感觉楼主好能折腾
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 20:58 , Processed in 0.206160 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.