Linux SD启动

参考:http://blog.163.com/yi_yixinyiyi/blog/static/1362868892011613211689/

1.制作SD卡分区

一个没有分区的SD卡插入到电脑,在ubuntu10.04下默认的设备节点是/dev/sdb。

打开终端,然后根据提示输入以下命令:

我已是root用户直接输入fdisk /dev/sdb  回车(不用加sudo)

这时我们可以看到系统里的分区有情况:
系统的盘符是/dev/sdb 其下分为二个区 /dev/sdb1  /dev/sdb2

现在我们重新对SD卡进行分区。
首先我们看一下Fdisk命令
指令:fdisk
用途:观察硬盘之实体使用情形与分割硬盘用。
1. 输入 m 显示所有命令列示。
2. 输入 p 显示硬盘分割情形。
3. 输入 a 设定硬盘启动区。
4. 输入 n 设定新的硬盘分割区。
   1> 输入 e 硬盘为[延伸]分割区(extend)。
   2> 输入 p 硬盘为[主要]分割区(primary)。
5. 输入 t 改变硬盘分割区属性。
6. 输入 d 删除硬盘分割区属性。
7. 输入 q 结束不保存。
8. 输入 w 结束并保存。

下面开始时具体的分区步骤:
==========================================
输入/sbin/fdisk /dev/sdb 回车
Command (m for help):

==========================================
我的SD卡两个分区,所以要删除2次,过程如下:

Command (m for help): d   回车 删除硬盘分割区
Partition number (1-N): 1  回车 删除1分区,

Command (m for help): d   回车
Partition number (1-N): 2 回车  删除2分区

根据你的SD卡里有几个区 就一一删除分区。
==========================================
Command (m for help): P 回车
 
看下图  已经没有分区了 
==========================================
现在我们重新建立分区,这里 我要把8G的SD卡建分成二个分区 ,步骤如下:

第一个是FAT32的分区(分70M)
Command (m for help): n  回车
   e extended
   p primary partition (1-4)

p 回车
partition uumber(1-4):1 回车 这是选分第1个分区。
first cylinder (1-17183,default 1):1 回车 这里1-17183是表示我的8G卡的存储量。第一个区从1开始。
Last cylinder or +size or +sizeM or +sizeK (1-17183, default 17183): 70 回车  

Command (m for help):
-------------------------------------------------------------------------------
SD卡剩下空间作为第二个区,也是Linux主分区,重复刚才分区的步骤。
Command (m for help): n 回车
   e extended
   p primary partition (1-4)

p 回车
partition uumber(1-4):2 回车 这是分第2个区。
first cylinder (6501-17183,default 6501): 回车 
Last cylinder or +size or +sizeM or +sizeK (6501-17183, default 17183): 回车 
 
Command (m for help):

==========================================
刚才起立好分区 现在要改变硬盘分割区属性。

Command (m for help):t 回车
Partition number (1-4): 1 回车
Hex code (type L to list codes): b 回车    这里要们要设定这个区为w95 FAT323分区。
--------------
Command (m for help):t 回车
Partition number (1-4): 2 回车
Hex code (type L to list codes): 83 回车    这里要们要设定这个区为Linux EXT3分区。

==========================================
Command (m for help):a 回车  这里设定硬盘启动区
Partition number (1-4): 1 回车

Command (m for help):p 回车 可以看到刚才分区
Command (m for help):w 回车 输入q 结束不存入硬盘分割区属性。
                        输入w 结束并写入硬盘分割区属性。

重新启动,若不重启,执行partprobe,它能使内核在不重启的情况接受新的分区表信息。

==========================================
输入fdisk -l 回车 如果命令提示没找到请输入/sbin/fdisk -l 回车查看分区信息。

这时我们可以看到刚才把SD分的区 
/dev/sdb1   w95 FAT32
/dev/sdb2   Linux
==========================================

2.制作SD卡启动盘

上面已经将SD卡分成两个区,接下来是格式化SD卡,并拷贝文件的相应的分区,下面贴出的是执行脚本mksd-ti816x.sh:

#!/bin/bash

if [[ -z $1 || -z $2 || -z $3 || -z $4 ]]
then
    echo "mksd-ti816x Usage:"
    echo "    mksd-ti816x <device> <MLO> <u-boot.bin> <uImage> <rootfs tar.gz >"
    echo "    Example: mksd-ti816x /dev/sdc MLO u-boot.bin uImage nfs.tar.gz"
    exit
fi

if ! [[ -e $2 ]]
then
    echo "Incorrect MLO location!"
    exit
fi

if ! [[ -e $3 ]]
then
    echo "Incorrect u-boot.bin location!"
    exit
fi

if ! [[ -e $4 ]]
then
    echo "Incorrect uImage location!"
    exit
fi

if ! [[ -e $5 ]]
then
    echo "Incorrect rootfs location!"
    exit
fi

echo "All data on "$1" now will be destroyed! Continue? [y/n]"
read ans
if ! [ $ans == 'y' ]
then
    exit
fi

echo "[Partitioning $1...]"

DRIVE=$1
dd if=/dev/zero of=$DRIVE bs=1024 count=1024
     
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
     
echo DISK SIZE - $SIZE bytes
 
CYLINDERS=`echo $SIZE/255/63/512 | bc`
 
echo CYLINDERS - $CYLINDERS
{
echo ,9,0x0C,*
echo ,,,-
} | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE

echo "[Making filesystems...]"

mkfs.vfat -F 32 -n boot "$1"1 &> /dev/null
mkfs.ext3 -L rootfs "$1"2 &> /dev/null

echo "[Copying files...]"

mount "$1"1 /mnt
cp $2 /mnt/MLO
cp $3 /mnt/u-boot.bin
cp $4 /mnt/uImage
umount "$1"1

mount "$1"2 /mnt
tar zxvf $5 -C /mnt &> /dev/null
chmod 755 /mnt
umount "$1"2

echo "[Done]"

将这个执行脚本和所需的文件拷贝到/tftpboot目录(其他目录也可以)下,在执行脚本前mount一下,如果发现挂载了的umount卸载。

执行./mksd-ti816x.sh /dev/sdb MLO u-boot_dvr.bin uImage_ud816x_dvr rootfs.tar.gz命令,最终在在分区一放入加载镜像文件,在分区二放入根文件系统。

最后执行: setenv bootcmd 'mmc rescan 0;fatload mmc 0 0x81000000 uImage;bootm 0x81000000'
             setenv bootargs 'console=ttyO2,115200n8 rootwait rw mem=256M notifyk.vpssm3_sva=0xBEE00000 vram=20M root=/dev/mmcblk0p2 noinitrd'
             saveenv

重新启动开发板,成功启动u-boot,linux内核和根文件系统。

嵌入式QQ交流群:127085086
原文地址:https://www.cnblogs.com/cslunatic/p/3125247.html