我有一个 iSCSI 磁盘,位于/dev/rdsk/c5t6d0
我已经在以下位置创建了一个分区(带有 UEFI 标签的切片):/dev/rdsk/c5t6d0s0
现在我将一些数据写入切片:
echo "xyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxy" >/text
dd if=/text of=/dev/dsk/c5t6d0s0
如果我转储磁盘内容,我会看到 UEFI 标签以及偏移量 0x5000 处的数据:
dd if=/dev/rdsk/c5t6d0 bs=512 | xxd
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
...
0000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001b0: 0000 0000 0000 0000 0eb5 7760 0000 00ff ..........w`....
00001c0: ffff eeff ffff 0100 0000 ff3f 0300 0000 ...........?....
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
0000200: 4546 4920 5041 5254 0000 0100 5c00 0000 EFI PART....\...
0000210: 7187 d278 0000 0000 0100 0000 0000 0000 q..x............
0000220: ff3f 0300 0000 0000 2200 0000 0000 0000 .?......".......
0000230: de3f 0300 0000 0000 fd59 3d67 51a0 4d13 .?.......Y=gQ.M.
0000240: abdd a5e8 8251 c7ac 0200 0000 0000 0000 .....Q..........
0000250: 8000 0000 8000 0000 7e8c 8e06 0000 0000 ........~.......
0000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000270: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0000280: 0000 0000 0000 0000 0000 0000 0000 0000 ................
...
0005000: 7879 7879 7879 7879 7879 7879 7879 7879 xyxyxyxyxyxyxyxy
0005010: 7879 7879 7879 7879 7879 7879 7879 7879 xyxyxyxyxyxyxyxy
0005020: 7879 7879 7879 7879 7879 7879 7879 7879 xyxyxyxyxyxyxyxy
0005030: 7879 7879 7879 7879 7879 7879 0ab6 db6d xyxyxyxyxyxy...m
0005040: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
0005050: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
0005060: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
0005070: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
0005080: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
0005090: 6db6 db6d 6db6 db6d 6db6 db6d 6db6 db6d m..mm..mm..mm..m
但是如果我在存储端(iSCSI 目标)执行相同的转储,我看不到写入的数据!我关闭SPARC/solaris 机器和瞧!数据现在就在那里。
怎么会这样? Solaris 是否将我的数据缓存在内存中?我怎样才能禁用这个功能?
注意1:我尝试使用sync
,但它没有帮助,而且它与文件系统中的文件相关,而我的场景中没有该文件系统。
注2:我的机器是带有Solaris 11.3的T5220 UltraSPARC T2服务器
注3:“存储”是本地磁盘后备存储上具有 iSCSI 目标的 Ubuntu 服务器。
答案1
您正在写入dsk
已缓冲的块设备 ( )。如果您想绕过缓冲区,您可以直接写入原始设备(rdsk
,请参阅UNIX 系统中的字符特殊文件和块特殊文件是什么?)通过运行:
dd if=/text of=/dev/rdsk/c5t6d0s0
不过,您的/text
文件的大小可能需要恰好是块大小的倍数才能dd
成功。
或者,您仍然可以使用字符设备,但要求dd
同步其输出:
dd if=/text of=/dev/dsk/c5t6d0s0 conv=sync
或者,如果您想要固定宽度的输出记录:
dd if=/text of=/dev/rdsk/c5t6d0s0 cbs=512 conv=sync,block