标签: block-device

虚拟块设备

我不确定我应该用谷歌搜索什么,或者 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)

但我希望直接访问我的应用程序而不是文件。我希望这个问题很清楚。

block-device

9
推荐指数
1
解决办法
3949
查看次数

每次挂载 USB 密钥时都会有相同的名称吗?

我有一个 USB 密钥,用于每天通过 bash 脚本保存数据。我设法为特定用户安装它,以便能够使用以下命令在其中写入文件夹:

mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop
Run Code Online (Sandbox Code Playgroud)

该脚本可以根据需要运行和创建目录,并且非常完美。在某些时候,USB 密钥将被拔下并替换为新的(相同型号)。新的 USB 密钥是否仍然具有名称/dev/sdc1或将是不同的名称?

如果它是不同的,我如何在我的脚本中包含安装部分以使其自动生成?

linux udev mount block-device removable-storage

9
推荐指数
2
解决办法
5394
查看次数

如何获取包含特定分区的磁盘名称

例如,如果我知道一个分区是/dev/sda1如何获得/dev/sda包含该分区的磁盘名称(在这种情况下)?

  • 输出应该只是磁盘路径(如/dev/sda)。
  • 它不应该需要字符串操作,因为我需要它为不同的磁盘类型工作。

linux partition block-device disk

9
推荐指数
1
解决办法
8973
查看次数

cat 如何“知道”要使用的最佳块大小?

通过阅读本文,似乎将数据复制到不同的硬盘驱动器时, cat 会自动使用最佳块大小(或非常接近)。

我想知道它如何确定最佳块大小,以及 cat 使用的方法是否可以以某种方式应用于 dd。

dd block-device cat

9
推荐指数
1
解决办法
1959
查看次数

使用“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命令,或者在写入块设备时syncdd命令中包含几个选项之一。例如这里这里。但是,我不知道有人真正证明这是必要的。

此页面上的评论之一是:

sync在这里毫无意义[即直接写入/dev/sdX]。它只影响文件系统操作。

有五个人对这条评论投了赞成票,这与我的经验一致。

那么在写入块设备时,有没有dd在所有写入完成之前退出的情况?这真的发生在任何人身上吗?

其他书写选项如何,例如cpcat …

linux cache dd synchronization block-device

9
推荐指数
1
解决办法
1248
查看次数

将块设备传递给 Qemu

像这样将块设备传递给 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?

block-device qemu

9
推荐指数
1
解决办法
2464
查看次数

防止在 OSX 中重新启动时磁盘重新编号

我的 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?

osx mount parallels block-device

8
推荐指数
1
解决办法
788
查看次数

如何在完整的硬盘驱动器映像中重新调整分区大小?

我使用以下方法拍摄了硬盘驱动器的完整图像:

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。

是否可以像这样修改图像文件而不将其写回某个磁盘,如果可以,如何修改?我会对仅使用终端命令的解决方案感到非常满意。

storage filesystems dd block-device gparted

8
推荐指数
1
解决办法
308
查看次数

是否可以在 Linux 中更改 zfs raidz 池的分区的扇区大小?

我一直在通过稀疏文件的虚拟设备将 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 状态输出: …

storage zfs partition block-device

8
推荐指数
1
解决办法
5863
查看次数

如何以编程方式确定根分区的设备名称/基本名称?

参考:下面的问题 驱动器名称?“/dev/sda”的“sda”部分的正确术语是什么?

鉴于:

  1. 我有一个系统(在本例中是 Raspberry Pi,但这可能与任何 'nix 系统相关。)
  2. 它正在运行一个 Linux 版本,并且可以假设所有正常的 Linux 命令都可以工作。
  3. 启动设备可以是 SD 卡或 USB 连接存储设备。
  4. 如果从连接的存储设备启动,则设备“基本名称”为 sd(x)
  5. 如果从 SD 卡启动,设备“basename”将变为类似“mm(xxxx)”

我想要做什么:我希望能够以编程方式(如果可能的话,在 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,然后提取最后一个斜杠后的前两个字母。。。

linux block-device root-filesystem usb-device

8
推荐指数
2
解决办法
1159
查看次数