运行时如何计算最佳块大小dd
?我已经研究了一下,我没有找到任何暗示如何实现这一点的东西.
我的印象是更大的块大小会导致更快dd
...这是真的吗?
我dd
将在运行带有4GB DDR3 1333mhz RAM的Intel Core i3的盒子上运行两个相同的500gb日立硬盘,运行速度为7200rpm,所以我试图找出要使用的块大小.(我将从闪存驱动器启动Ubuntu 10.10 x86,并从中运行它.)
如果你查看如何将整个磁盘克隆到网络上的另一个磁盘,你会发现类似的东西:
dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror
Run Code Online (Sandbox Code Playgroud)
虽然我理解了这一点noerror
,但我很难理解为什么人们认为这notrunc
是"数据完整性"所必需的(例如ArchLinux的Wiki声明).
实际上,如果您将分区复制到另一个磁盘上的另一个分区,并且您不想覆盖整个磁盘,我只是同意一个分区.在这种情况下notrunc
,根据dd的手册页,是你想要的.
但是如果你要克隆整个磁盘,那notrunc
对你有什么改变?只是时间优化?
在Linux中,我们可以做到
dd if=/dev/sdb of=bckup.img
Run Code Online (Sandbox Code Playgroud)
但是如果磁盘是32GB而只使用了4GB,那么32GB的图像文件就浪费了时空.有没有办法或工具来创建只有有效数据的图像?
我一直在努力让这个工作起来.有谁知道如何获取grep或类似的东西来检索文件中的十六进制字符串的偏移量?
我有一堆hexdumps我需要检查字符串,然后再次运行并检查值是否已更改.
我已经尝试过hexdump和dd,但问题是因为它是一个流,我丢失了文件的偏移量.
有人必须遇到这个问题和解决方法.我能做什么?
为了澄清,我有一系列来自GDB的转储内存区域.
我试图通过搜索存储号码的所有位置缩小数字,然后再次执行并检查新值是否存储在同一存储位置.
我无法做grep做任何事情,因为我正在寻找十六进制值,所以我一直尝试过(就像一个bazillion,大致)它不会给我正确的输出.
十六进制转储只是完整的二进制文件,paterns在浮动值范围内大到8个?字节?
模式并没有包裹我所知道的线条.我知道它改变了什么,我可以做同样的过程并比较列表以查看哪个匹配.十六进制转储通常最终(总共)100兆位.
Perl可能是一个选项,但在这一点上,我认为我对bash及其工具缺乏了解是罪魁祸首.
它有点难以解释我得到的输出,因为我真的没有得到任何输出..
我期待(并期待)一些事情:
<offset>:<searched value>
Run Code Online (Sandbox Code Playgroud)
这是我通常会得到的非常好的标准输出 grep -URbFo <searchterm> . > <output>
问题是,当我尝试搜索十六进制值时,我遇到的问题是如果只是不搜索十六进制值,所以如果我搜索00我应该得到一百万次点击,因为那总是空白空间,而是搜索00为文本,所以十六进制,3030.任何想法?
我可以强制它通过hexdump或链接的某些东西,但因为它的流不会给我它发现匹配的偏移量和文件名.
使用grep -b
选项似乎也不起作用,我确实尝试了所有看起来对我的情况有用的标志,但没有任何效果.
使用xxd -u /usr/bin/xxd
作为一个例子,我得到一个输出将是有益的,但我不能使用搜索..
0004760: 73CC 6446 161E 266A 3140 5E79 4D37 FDC6 s.dF..&j1@^yM7..
0004770: BF04 0E34 A44E 5BE7 229F 9EEF 5F4F DFFA ...4.N[."..._O..
0004780: FADE 0C01 0000 000C 0000 0000 0000 0000 ................
Run Code Online (Sandbox Code Playgroud)
不错的输出,就像我看到的那样,但在这种情况下它对我不起作用..
这是我发布以来我尝试过的一些事情:
xxd -u /usr/bin/xxd | grep 'DF'
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S..... …
Run Code Online (Sandbox Code Playgroud) 我有一个二进制文件,我想用一些其他值替换A2
地址的DEADBEEF
值,比方说A1
.
我怎么能这样做dd
?如果有其他工具可以做到这一点,请建议.但我打算在iPhone上这样做,所以我只能使用大多数基本的Unix工具.
我对dd命令很熟悉,但我很少需要自己使用它.今天我需要,但我遇到的行为似乎很奇怪.
我想创建一个100M的文本文件,每行包含单个单词"testing".这是我的第一次尝试:
~$ perl -e 'print "testing\n" while 1' | dd of=X bs=1M count=100
0+100 records in
0+100 records out
561152 bytes (561 kB) copied, 0.00416429 s, 135 MB/s
Run Code Online (Sandbox Code Playgroud)
嗯,这很奇怪.其他组合怎么样?
~$ perl -e 'print "testing\n" while 1' | dd of=X bs=100K count=1K
0+1024 records in
0+1024 records out
4268032 bytes (4.3 MB) copied, 0.0353145 s, 121 MB/s
~$ perl -e 'print "testing\n" while 1' | dd of=X bs=10K count=10K
86+10154 records in
86+10154 records out
42524672 bytes (43 MB) copied, …
Run Code Online (Sandbox Code Playgroud) 要显示创建虚拟软盘映像文件作为超级用户或用户可以运行sudo
命令,有很多帖子.基本步骤是:
dd
命令创建空的1.44MB图像文件mkfs.msdos
umount
虚拟软盘映像文件我的问题是,如果我只是一个无法运行sudo
命令的普通用户,我如何按照上述步骤创建虚拟软盘映像并在其中写入内容?
非常感谢.
我有一台服务器,RAID50配置为24个驱动器(两组12个),如果我运行:
dd if=/dev/zero of=ddfile2 bs=1M count=1953 oflag=direct
Run Code Online (Sandbox Code Playgroud)
我明白了:
2047868928 bytes (2.0 GB) copied, 0.805075 s, 2.5 GB/s
Run Code Online (Sandbox Code Playgroud)
但如果我跑:
dd if=/dev/zero of=ddfile2 bs=1M count=1953
Run Code Online (Sandbox Code Playgroud)
我明白了:
2047868928 bytes (2.0 GB) copied, 2.53489 s, 808 MB/s
Run Code Online (Sandbox Code Playgroud)
我知道O_DIRECT会导致页面缓存被绕过.但据我所知,它绕过页面缓存基本上意味着避免使用memcpy.使用带宽工具在我的桌面上进行测试我的最差情况是顺序内存写入带宽为14GB/s,我想在更新的更昂贵的服务器上,带宽必须更好.那么为什么额外的memcpy会导致> 2x减速?使用页面缓存时是否真的涉及更多内容?这不典型吗?
我正在编写一个C#.Net应用程序,在需要拍摄可移动磁盘映像并将其放入Linux Live USB的Windows上运行.Live USB插入到目标机器并启动,启动时它会运行一个脚本,该脚本使用dd命令将其闪存到另一个驱动器上:
dd if =/path/to/file/from/csharp/program of =/dev/sdX
我遇到的问题是在Windows端创建图像.我已经使用dd在Linux系统上创建的文件尝试了我的Live Linux,并且工作正常,但我需要能够在Windows上的C#.Net应用程序中创建这些文件.我宁愿不必依赖cygwin或其他依赖,所以试图使用Win32 CreateFile函数打开物理设备.
调用CreateFile时,第一个arg设置为"\.\ F:"(如果F:是我要映像的驱动器),如下所示:
SafeFileHandle TheDevice = CreateFile(_DevicePath, (uint)FileAccess.Read, (uint)(FileShare.Write | FileShare.Read | FileShare.Delete), IntPtr.Zero, (uint)FileMode.Open, (uint)FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
if (TheDevice.IsInvalid)
{
throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error());
}
FileStream Dest = System.IO.File.Open(_SaveFile, FileMode.Create);
FileStream Src = new FileStream(TheDevice, FileAccess.Read);
Src.CopyTo(Dest);
Dest.Flush();
Src.Close();
Dest.Close();
Run Code Online (Sandbox Code Playgroud)
但是当使用Live Linux USB将输出文件重新打印到磁盘上时,结果并不像预期的那样(磁盘不可启动等,但是通过在十六进制编辑器中检查输出文件,看起来有一个MBR一开始等).
这是endianess的问题,还是我应该使用FileStream以外的东西将数据复制到文件中.
另外还有一个用于Windows源代码的dd示例(C#或C++,我已经查看了Delphi for http://www.chrysocome.net/dd并且没有完全理解它或者有一个像样的Delphi IDE来选择代码除了)所以我可以看到它是如何工作的?
UPDATE /编辑:
这是dd输出包含的前512个字节的十六进制字符串:
33 C0 FA 8E D8 8E D0 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将压缩图像复制到 Beaglebone 内的分区中。通常,这是一个两步过程:
xz -d console.img.xz # console.img is created
dd if=console.img of=/dev/mmcblk0p3
Run Code Online (Sandbox Code Playgroud)
有没有办法,我可以在不解压缩文件的情况下一步完成*.img.xz
?这是因为解压后的镜像对于当前分区来说太大了。