我创建了一个带有随机数据的 1TB 文件dd if=/dev/urandom of=file bs=1M count=1000000
。现在我检查kill -SIGUSR1 <PID>
进度并得到以下信息:
691581+0 Datensätze ein
691580+0 Datensätze aus
725174190080 Bytes (725 GB) kopiert, 86256,9 s, 8,4 MB/s
800950+1 Datensätze ein
800950+0 Datensätze aus
839856947200 Bytes (840 GB) kopiert, 99429,5 s, 8,4 MB/s
dd: warning: partial read (809620 bytes); suggest iflag=fullblock
803432+1 Datensätze ein
803431+1 Datensätze aus
842459273876 Bytes (842 GB) kopiert, 99791,3 s, 8,4 MB/s
Run Code Online (Sandbox Code Playgroud)
我无法解释警告。它说什么?警告后我的文件真的是随机的还是有问题?什么+ 0或+1的800950+1 Datensätze ein
和800950+0 Datensätze aus
是什么意思?警告后为+1。它是一个错误计数吗?
只有read -r
是通过POSIX规定; read -n NUM
,用于读取NUM
字符,不是。从标准输入读取给定数量的字符后,是否有一种可移植的方式自动返回?
我的用例正在打印这样的提示:
Do the thing? [y/n]
Run Code Online (Sandbox Code Playgroud)
如果可能,我希望程序在键入后自动运行y
或n
,而无需用户随后按 Enter 键。
我有一张 64GB 的 MicroSD 卡。我向其中写入了一个大小为 16GB 的图像:
$ sudo dd if=my_image.img of=/dev/sdb bs=4M
3798+1 records in
3798+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 657.848 s, 24.2 MB/s
Run Code Online (Sandbox Code Playgroud)
现在,我想使用 dd 拍摄同一张 64GB SD 卡的前 15931539456 字节 (16GB) 的图像,最终得到一个与我开始使用的图像具有相同校验和的图像。
据我了解,上面 dd 的结果(3798+1)表明,从源图像中有 3798 个完整读取,以及 1 个部分读取,因为源图像的大小没有均匀地分割成 4M 块。那么我如何告诉 dd 现在将 15931539456 字节从 SD 卡复制到一个新文件中,一次 4M?
我假设我可以做类似的事情:
sudo dd if=/dev/sdb of=new_image.img bs=1 count=15931539456
Run Code Online (Sandbox Code Playgroud)
但缓冲区这么小会使操作永远持续下去。有没有办法告诉它使用 4M 的缓冲区,但只复制 X 个字节,即使这会导致最后的读取很短?