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用于写指定文件到指定位置
#将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个;