我不确定我应该用谷歌搜索什么,或者 FUSE 是否这样做(我怀疑不是)。我想创建一个虚拟块设备,所有形式的访问(例如读取和写入)都直接进入我的应用程序。
我知道我可以通过执行创建一个文件作为块设备
dd if=/dev/zero of=~/test count=100k
Run Code Online (Sandbox Code Playgroud)
然后使用创建一个环回
losetup /dev/loop0 ~/test`
Run Code Online (Sandbox Code Playgroud)
但我希望直接访问我的应用程序而不是文件。我希望这个问题很清楚。
我有一个 USB 密钥,用于每天通过 bash 脚本保存数据。我设法为特定用户安装它,以便能够使用以下命令在其中写入文件夹:
mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop
Run Code Online (Sandbox Code Playgroud)
该脚本可以根据需要运行和创建目录,并且非常完美。在某些时候,USB 密钥将被拔下并替换为新的(相同型号)。新的 USB 密钥是否仍然具有名称/dev/sdc1或将是不同的名称?
如果它是不同的,我如何在我的脚本中包含安装部分以使其自动生成?
例如,如果我知道一个分区是/dev/sda1如何获得/dev/sda包含该分区的磁盘名称(在这种情况下)?
/dev/sda)。 通过阅读本文,似乎将数据复制到不同的硬盘驱动器时, cat 会自动使用最佳块大小(或非常接近)。
我想知道它如何确定最佳块大小,以及 cat 使用的方法是否可以以某种方式应用于 dd。
每次我将文件写入空的原始块设备时,例如
# dd if=image.iso of=/dev/sdb status=progress
Run Code Online (Sandbox Code Playgroud)
我从未使用过任何类型的sync(即sync; conv=fsync; conv=fdatasync; oflag=sync; oflag=dsync)。
我注意到,dd没有永远退出,直到所有的写作完成。
我总是使用 Conky 的 I/O 工具和grep Dirty /proc/meminfo. 此外,设备的校验和始终与写入它的文件的校验和相匹配。所以我总是 100% 确定整个文件已写入设备。
我已将文件写入 ext4 卷进行比较。例如使用:
$ dd if=/dev/urandom of=~/file bs=1M count=50 iflag=fullblock
Run Code Online (Sandbox Code Playgroud)
写入 ext4 卷时,dd退出后在数据实际写入磁盘之前总是有大约 20 秒的延迟。
许多人提倡在sync命令后使用dd命令,或者在写入块设备时sync在dd命令中包含几个选项之一。例如这里和这里。但是,我不知道有人真正证明这是必要的。
此页面上的评论之一是:
sync在这里毫无意义[即直接写入/dev/sdX]。它只影响文件系统操作。
有五个人对这条评论投了赞成票,这与我的经验一致。
那么在写入块设备时,有没有dd在所有写入完成之前退出的情况?这真的发生在任何人身上吗?
其他书写选项如何,例如cp和cat …
像这样将块设备传递给 Qemu 3.0.1 可以工作,但会产生弃用警告:
-blockdev file,node-name=f1,filename=/dev/loop0 \
-blockdev raw,node-name=q1,file=f1 \
-device virtio-blk,drive=q1
Run Code Online (Sandbox Code Playgroud)
警告:
qemu-system-x86_64: -blockdev file,node-name=f1,filename=/dev/loop0:
warning: Opening a block device as a file using the 'file' driver
is deprecated
Run Code Online (Sandbox Code Playgroud)
很公平,但是如何在不使用“文件”驱动程序的情况下将块设备传递给 qemu?
我的 Mac Pro 中有 3 个物理驱动器和 OSX 10.6.4。有时,在重新启动机器后,磁盘编号会发生变化,导致 /dev/disk# 引用的驱动器与重新启动前的驱动器不同。
例子
/dev/disk0 -> 64GB SSD drive
/dev/disk1 -> 640GB Hitachi
/dev/disk2 -> 160GB WD (BootCamp)
Run Code Online (Sandbox Code Playgroud)
重新启动后,映射可能是
/dev/disk0 -> 160GB WD (BootCamp)
/dev/disk1 -> 640GB Hitachi
/dev/disk2 -> 64GB SSD drive
Run Code Online (Sandbox Code Playgroud)
更令人困惑的是,重新映射并不一致。对于大多数东西,这无关紧要。但是,我还安装了 Parallels,以允许从 OSX 中访问 BootCamp 分区。Parallels 在其配置文件中使用 /dev/disk# 路径,因此,在重新启动 OSX 后,我启动了 Parallels,它告诉我磁盘不再存在。
有没有办法告诉 OSX 总是将给定的驱动器分配给 /dev/disk0?
我使用以下方法拍摄了硬盘驱动器的完整图像:
dd if=/dev/sda of=/home/user/harddriveimg bs=4M
Run Code Online (Sandbox Code Playgroud)
在我看来,我应该能够在适当安装后重新调整其中的分区大小。
由于我对命令行不熟悉,我尝试了:
gparted /home/user/harddriveimg
Run Code Online (Sandbox Code Playgroud)
虽然这加载了分区表,但它无法找到分区本身,例如 harddriveimg0。
是否可以像这样修改图像文件而不将其写回某个磁盘,如果可以,如何修改?我会对仅使用终端命令的解决方案感到非常满意。
我一直在通过稀疏文件的虚拟设备将 linux 上的 zfs raidz 池迁移到新磁盘。我在磁盘上使用了分区,因为磁盘的大小各不相同,每个 1.9T。要添加的最后一个磁盘是 4Tb 磁盘,我将它与其他磁盘分区,并使用 1.9T 分区添加到池中。它使用 GPT 分区表。当我尝试用 4T 磁盘上的 1.9T 分区替换最后一个文件时,我得到以下信息
zpool replace -f zfs_raid /zfs_jbod/zfs_raid/zfs.2 /dev/sdd1
cannot replace /zfs_jbod/zfs_raid/zfs.2 with /dev/sdd1: devices have different sector alignment
Run Code Online (Sandbox Code Playgroud)
我如何将分区扇区大小更改为 512 像其他人一样,或者如果失败,是否可以将其他池设备更改为 4024 ?显然逻辑扇区大小都是 512
cat /sys/block/sdd/queue/hw_sector_size
Disk /dev/sdd: 4000.8 GB, 4000787030016 bytes, 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Run Code Online (Sandbox Code Playgroud)
由于我重新分区了包含我试图替换的基于第 4 个文件的原始设备的光盘,但它不起作用,我重新创建了设备文件,因此它目前正在重新同步该文件。
zpool 状态输出: …
参考:下面的问题 驱动器名称?“/dev/sda”的“sda”部分的正确术语是什么?
鉴于:
我想要做什么:我希望能够以编程方式(如果可能的话,在 shell 脚本中)启动它的设备类型,并根据启动设备更改某些特征。
简单的例子:
Boot device = "mmxxxxx"
Print "Booted from SD card!"
Boot device = "sda"
Print "Booted from Attached Storage!"
Run Code Online (Sandbox Code Playgroud)
我想要做的是提取(为了需要一个更好的术语)根分区派生的主要设备类型(即“ sd”、“mm”或其他任何内容,具体取决于作为根安装的设备分割。)
我怀疑我可以以某种方式列出安装在 root 上的设备,而不列出 中的所有内容mount,然后提取最后一个斜杠后的前两个字母。。。