ddddfang's Blog.

dd

字数统计: 685阅读时长: 2 min
2019/01/23 Share

1. 搞openwrt用到puppy linux时,直接将系统镜像写入到硬盘(重新启动从硬盘加载就变成 openwrt 对应的操作系统了)

1
dd if=openwrt-x86-generic-combined-ext2.img of=/dev/sda

2.将bin文件作为镜像写入软盘 (于渊:所谓镜像,可理解为原始设备的逐字节复制。如软盘的第m个字节对应文件的第m个字节)

1
2
nasm boot.asm -o boot.bin
dd if=boot.bin of=/dev/fd0 bs=512 count=1 conv=notrunc

3.小测试

1
2
3
4
5
dd if=/dev/zero of=a.img bs=1024 count=512       //制作全0镜像,大小为  1024bytes*512 =512k
dd if=main.c of=/dev/tty //这个,其实相当于 cat 啦
dd if=main.c of=a.img obs=1024 seek=1 conv=notrunc //从a.img的 (1024bytes*1) 偏移处开始写入main.c对应的ASCII码,即使 if 较小也不要截断 of
dd if=a.img | gzip > ./a.gz //把我们的这个镜像压缩一下(貌似tar没法这么搞)
gzip -dc ./a.gz | dd of=b.img //把a.gz使用gzip解压后后得到 b.img(和a.img一模一样哈)

总的传输量大小 = ibscount
从 ibs
skip 位置开始读取,从输出文件的 obs*seek 位置开始写入
conv=notrunc, 确保 if 较小时不要截断

4.总结

  • if=
    • 设备:从块设备读取,(映射到CPU地址总线)则原封不动的逐字节读取其物理存储memory(若有文件系统则包括文件系统本身也被读取过来,裸
      设备级别的读,eg./dev/cdrom)。若从字符设备读,则调用字符设备的 read() 驱动函数(eg./dev/zero)
      
    • 文件:从块设备的文件系统中读取某个文件
  • of=
    • 设备:写入到块设备(映射到CPU地址总线的)则原封不动的逐字节写入物理存储memory(裸设备级别的写,需要把文件系统本身也写入,否则块设备将不包含文件系统,eg.写到flash,/dev/sda)。若写到字符设备,则调用其 write() 驱动函数(如/dev/tty, /dev/null)
    • 文件:写入位于(块设备中的)文件系统中的某个文件中(若文件原来不存在则会被创建)
  • ibs=1048576 (设定读取缓冲块大小,单位Byte,即每次读取1024*1024 bytes到缓冲块,或可写作 1024k 或 1M ),配合skip确定 if 读取位置的起始偏移,配合count确定dd传输的数据量大小(否则会一直传输,直到 if 文件末尾)
  • obs=1048576 (设定每次写入的缓冲块大小为 1024*1024 bytes),配合seek确定从 of 写入位置的起始偏移
  • bs=1048576(设定 ibs=obs=1M bytes)
  • conv=notrunc (设定当if文件大小<of文件大小时候,不要截断of。默认是截断的)
CATALOG
  1. 1. 1. 搞openwrt用到puppy linux时,直接将系统镜像写入到硬盘(重新启动从硬盘加载就变成 openwrt 对应的操作系统了)
  2. 2. 2.将bin文件作为镜像写入软盘 (于渊:所谓镜像,可理解为原始设备的逐字节复制。如软盘的第m个字节对应文件的第m个字节)
  3. 3. 3.小测试
  4. 4. 4.总结