请教关于 dd 命令问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
drlittlemouse
V2EX    Linux

请教关于 dd 命令问题

  •  
  •   drlittlemouse 2015 年 10 月 12 日 4569 次点击
    这是一个创建于 3756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在用 dd 命令当作 16 进制编辑器来组装文件

    用法类似于

    dd status=none if=/dev/zero bs=1048576 count=${size} | tr '\000' '\377' > ${tmpfile}

    先生成指定大小${size}的一个文件并用 0xFF 填充

    分别写入几个小文件

    dd status=none cOnv=notrunc if=${art} of=${tmpfile} seek=${artoffset} bs=1
    dd status=none cOnv=notrunc if=${uboot} of=${tmpfile} seek=0 bs=1
    dd status=none cOnv=notrunc if=${firmware} of=${tmpfile} seek=${ubootsize} bs=1

    (估计有人看出来了,其实就是用来做编程器镜像的:P )

    这个肯定是没问题的,但是在写入${firmware}的时候,会发现效率很低,因为 bs=1 嘛

    于是我尝试修改了一下 bs ,结果带来 2 个问题

    1 、因为一开始没意识到 seek 和 bs 的关系按照 man 说明, seek 其实是 blocks ,也就是 seek * bs 才是最终 offset ,结果生成了一个超大的文件( 1.7TB ),这已经远远超出了我磁盘的空间,但是删除后没发现有什么文件被覆盖,为什么呢?是因为其实前面都被 seek 掉了么,其实写入的还是${firmware}流的大小?

    2 、既然 seek 和 bs 紧密相关,有没有提高 I/O 效率的方式呢?

    10 条回复    2015-10-12 07:41:56 +08:00
    ryd994
        1
    ryd994  
       2015 年 10 月 12 日   1
    1.应该是 seek 超出大小又写入的话会自动 extend 文件
    2.提高效率就不要用 dd ,写个 python 脚本绝对比这个简单
    msg7086
        2
    msg7086  
       2015 年 10 月 12 日   1
    正常情况下 seek 不占用空间的。

    $ truncate --size 15TiB a
    $ dd if=/dev/null of=b seek=15 bs=1TiB count=0
    $ ll
    总用量 0
    -rw-r--r-- 1 msg7086 msg7086 15T 10 月 11 16:47 a
    -rw-r--r-- 1 msg7086 msg7086 15T 10 月 11 16:47 b
    msg7086
        3
    msg7086  
       2015 年 10 月 12 日   1
    seek 并非和 bs 相关。
    Let me google it for you: http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html

    ‘ seek=n ’

    Skip n ‘ obs ’-byte blocks in the output file before copying.

    if ‘ oflag=seek_bytes ’ is specified, n is interpreted as a byte count rather than a block count.
    drlittlemouse
        4
    drlittlemouse  
    OP
       2015 年 10 月 12 日
    @ryd994
    1.应该是 seek 超出大小又写入的话会自动 extend 文件
    请问是否有这样的资料可以参考?对您提到的这个 extend 机制。

    2.提高效率就不要用 dd ,写个 python 脚本绝对比这个简单
    因为一些原因无法安装 python ,所以仅限在 bash 下解决,目前我能想到的变通的方法是,单独生成填充块,然后用 cat 拼接,但是感觉这样做好 low 的。
    drlittlemouse
        5
    drlittlemouse  
    OP
       2015 年 10 月 12 日
    @msg7086 谢谢!解释了我第一个问题的。
    drlittlemouse
        6
    drlittlemouse  
    OP
       2015 年 10 月 12 日
    @msg7086

    是的, Skip n ‘ obs ’-byte blocks in the output file before copying.

    但是当定义 bs 的时候会覆盖 obs 和 ibs

    不过您提到的
    oflag=seek_bytes

    是否对 dd 版本有要求?

    dd (coreutils) 8.4
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

    报错
    dd: invalid output flag: `seek_bytes'
    ryd994
        7
    ryd994  
       2015 年 10 月 12 日 via Android
    @drlittlemouse
    1.http://linux.die.net/man/2/lseek
    2.tr '\000' '\377' </dev/zero | dd of=out 这样应该就可以指定合适的块大小而不是 1 了
    drlittlemouse
        8
    drlittlemouse  
    OP
       2015 年 10 月 12 日
    @ryd994

    2.tr '\000' '\377' </dev/zero | dd of=out 这样应该就可以指定合适的块大小而不是 1 了

    生成 0xFF 文件没有问题,现在是 MB 生成的

    问题在于后面写入镜像碎片的时候
    drlittlemouse
        9
    drlittlemouse  
    OP
       2015 年 10 月 12 日
    @msg7086

    编译到
    dd (coreutils) 8.24
    Copyright (C) 2015 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    Written by Paul Rubin, David MacKenzie, and Stuart Kemp.

    可以使用 'seek_bytes' 参数,多谢!

    问题已经解决。
    introom
        10
    introom  
       2015 年 10 月 12 日 via Android
    这个东西叫做 file hole, 大部分文件系统都支持。主要用处是 sparse file, 比如 vm 镜像。可以看 man 2 lseek 还是 man 2 seek, 手机码字不去确认了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     945 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 20:06 PVG 04:06 LAX 12:06 JFK 15:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86