- fdisk命令对存储设备进行分区
在fdisk模式下常用命令:
m:使用帮助
n: 创建一个分区
d: 删除一个分区
p:打印分区信息
t:修改分区ID,通过修改ID我们可以改变分区格式,例如windows的fat32格式id为6和linux下ext3格式id为83
w:保存分区信息并退出
q:退出但不保存
#1.1 打开某个sd卡设备,进入fdisk模式
sudo fdisk /dev/sdX
#1.2进入fdisk操作界面后,即可使用命令对sd卡等存储设备进行分区操作
#1.2.1 p 显示分区信息
#1.2.2 d 删除分区,删除时会让你选择哪个分区
#1.2.3 n建立新的分区->进入建立新分区操作界面
#1.2.3.1 选择是分区类型 p为主分区即启动分区(linux分区),e为扩展分区(如后面要制作为fat32系统的盘)
#1.2.3.2 选择分区盘号,如果想该存储设备既做嵌入式linux启动盘,又作u盘使用,那么将第一分区做成扩展分区(最后做成fat32系统),并留到最后再分盘,所以linux主分区从分区盘号2开始分;
#1.2.3.3 a该分区起始扇区(sd卡扇区大小为512byte),回车选择默认值;
# b大小:可以直接输入数字指定结束扇区,也可以指定容量(如+100M)
#1.2.4 t设置分区格式;t设置进入分区格式操作界面,然后输入l查看不同的16进制数字对应的具体格式
# 如b 是fat32的,83是linux的等等
#1.2.5 设置完分区格式后输入w保存分区信息
#注:分区完成后需要使用mkfs命令对对应的分区进行格式化才能使用
-
dd命令对存储设备进行写操作
dd 命令用指定大小的块拷贝一个文件,或在拷贝的同时进行指定的转换;
命令参数
-iflag: 读取标志
-oflag: 写入标志
-if:输入文件名
-of:输出文件名
-ibs:一次读取的block size大小,单位byte
-obs:一次写入的block size大小,单位byte
-bs:一次读写的block size大小(相当于同时设置一次读和写的block size大小)单位为byte
-count:只拷贝输入文件block size(bs)个数(写入的总大小=count*bs)
-seek:写入位置偏移的block size数
-cbs:针对格式转换,一次转换的block size大小
-conv:指定转换的格式
-skip:输入开头跳过ibs个block size再读取
-status:错误信息打印级别:
‘none’除了错误信息,其他都取消了,
“noxfer”压制了最终的转移数据,
‘progress’ 显示周期性转移统计数据flag参数选择:
append append模式(仅对输出有意义;建议conv = notrunc时使用)
direct 直接使用I/O口的数据
directory fail unless a directory
dsync 使用同步I/O数据
sync 类似同步I/O数据, 也用与元数据
fullblock 计算输入的总块数 (iflag only)
nonblock 使用非阻塞I/O
noatime 不更新访问时间
nocache 请求删除缓存,See also oflag=sync
noctty do not assign controlling terminal from file
nofollow do not follow symlinks
count_bytes treat ‘count=N’ as a byte count (iflag only)
skip_bytes treat ‘skip=N’ as a byte count (iflag only)
seek_bytes treat ‘seek=N’ as a byte count (oflag only)conv参数选择:
ascii EBCDIC码转换为ASCIl码
ebcdic ASCIl码转换为EBCDIC码
ibm ASCIl码转换为alternate EBCDIC码
block 变动位转换成固定字符
ublock 固定位转换成变动位
lcase 字母由大写转换为小写
ucase 字母由小写转换为大写
sparse try to seek rather than write the output for NUL input blocks
notrunc 不截短输出文件
swab 交换每一对输入字节
sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)
excl fail if the output file already exists
nocreat do not create the output file
notrunc do not truncate the output file
noerror 出错时不停止处理
fdatasync physically write output file data before finishing
fsync likewise, but also write metadata
用于擦除指定大小数据
#将sd卡前1M数据置零
dd iflag=dsync oflag=dsync if=/dev/zero of=/dev/sdx bs=1M count=1 seek=1
用于写指定文件到指定位置
#将xxx.img 文件写入/dev/sdb,偏移地址为bs*seek bytes
sudo dd iflag=dsync oflag=dsync if=./xxx.img of=/dev/sdb bs=512 seek=206848
- mkfs命令给分区格式化
mkfs命令用于给特定的分区建立文件系统
#格式化为ext4文件系统
sudo mkfs -t ext4 /dev/sdbx
#vfat即为fat32格式
sudo mkfs -t vfat /dev/sdbx
- 举例sd卡linux启动盘制作
#1 使用fdisk对sd卡进行分区
#进入fdisk模式
sudo fdisk /dev/sdx
#p 一个个删除原来所有分区
#n 重新分区 分为3个分区,第一分区为扩展分区(fat32文件系统当u盘用),第二分区和第三分区为主分区
#先分第二分区,再分第三分区,最后分第一分区
#t 设置分区格式
#第一分区设置成fat32格式,第二第三分区保持为linux主分区
#2 使用mkfs命令对分区进行格式化为对应的文件系统
#2.1 第一分区为fat32文件系统
sudo mkfs -t vfat /dev/sdx1
#2.2 第二分区烧写uboot kernel 和设备树,不用挂载,可以不用操作
#2.3 第三分区是根文件系统分区,格式化为ext3文件系统
#3 使用dd命令烧写uboot kernel 及dtb到第二分区
sudo mkfs -t ext3 /dev/sdx3
sudo dd iflag=dsync oflag=dsync if=./uboot.img of=/dev/sdb bs=512 seek=1
sudo dd iflag=dsync oflag=dsync if=./kernel.img of=/dev/sdb bs=512 seek=xxx
sudo dd iflag=dsync oflag=dsync if=./devicetree.dtb of=/dev/sdb bs=512 seek=xxx1
#启动xxx 和xxx1为uboot对kernel和设备树的在存储设备中的读取地址
#4 根文件系统复制,将制作好的根文件系统(未压缩)复制到第三分区
#先挂载第三分区
mount /dev/sdx3 /media/xxx
#文件系统复制
cp ./root_fs /media/xxx -rf
#拷完卸载
umount /dev/sdx3
#制作完成
注:
1 sd卡通过读卡器插入电脑中,如果只连接到windows端,虚拟机里访问不到,要在虚拟机界面,右下角点击连接XXX Card Reader;
2 在分区时FAT32放在第一分区,这样它既可以当U盘平常使用,也可以当做启动盘;
3 主分区(p)可以作启动盘,属于linux分区,可用做启动盘;扩展分区(e)不能用作启动盘,逻辑分区是扩展分区进一步划分;
4 当四个主分区不够用时,可以删除一个主分区,分一个扩展分区,然后将该扩展分区分成多个分区,这样分区个数就能大于4个;