【发布时间】:2022-06-12 00:21:08
【问题描述】:
我需要将从 /dev/urandom 获得的 5MB 数据块写入分区中特定位置的分区。然后我需要检查写入是否正确执行。我之前在 C++ 中成功地做到了这一点,但现在我想在 bash 脚本中实现它。
我的 C++ 代码包括:
- 创建从 /dev/urandom (RANDOM_ARRAY) 填充的 10MB 数据数组
- 用 open() 打开分区
- 使用 lseek() 导航到分区中的所需位置
- 使用 write() 将数组写入分区
- 关闭并重新打开分区,使用 lseek 导航回所需位置
- 使用 read() 在此位置读取 5MB 并使用此数据填充另一个数组 (WRITTEN_ARRAY)
- 将 (RANDOM_ARRAY) 中的每个元素与 (WRITTEN_ARRAY) 进行比较
我没有编写 bash 脚本的经验,但这是我目前所掌握的,虽然它似乎不起作用:
random_data="$(cat /dev/urandom | head -c<5MB>)"
printf $random_data | dd of=<partition_path> bs=1 seek=<position_in_partition> count=<5MB>
file_data=$(dd if=<partition_path> bs=1 skip=<position_in_partition> count=<5MB>)
if [ "$random_data" == "$file_data" ]
then
echo "data write successful"
fi
感谢乐于助人的评论者,我的脚本现在看起来像这样:
# get 10MB random data
head -c<10MB> /dev/urandom > random.bin
# write 10MB random data to partition
dd if=random.bin of=<partition_location>
# copy the written data
dd if=<partition_location> count=<10MB/512 bytes> of=newdata.bin
# compare
cmp random.bin newdata.bin
此时 cmp 返回第一个字符不同。查看 cmp 的详细输出,结果 newdata.bin 中的所有值都是 0。
【问题讨论】:
-
你不能像这样
printf你的二进制数据。使用中间文件:head -c 5MB /dev/urandom > data.bin。然后:dd if=data.bin of=<partition_path>...另一个方向相同:dd if=<partition_path> of=newdata.bin... -
bash 中的变量是以
\0结尾的字符串:这不适合二进制。这就是random_data=...小于 5 MB 的原因。正如@RenaudPacalet 所写,需要使用中间文件。 -
二进制文件可以用
cmp命令比较。 -
感谢@RenaudPacalet。当我将分区位置设为二进制文件时,这很有效。分区是一个RAM块,由于某种原因,newdata.bin文件全为0。就好像由于某种原因写入没有正确执行。
-
@Jayjargot 谢谢,这是有道理的,我根据你所说的对我的脚本进行了更改,所以我相信我现在离找到一个可行的解决方案更近了。