我确信我不明白 blockdev 是如何工作的。
我已经安装了闪存驱动器并将其映射到/dev/sdb1
.然后我在终端中输入(以 root 身份):
root# blockdev --setro /dev/sdb1
root# blockdev --report
报告内容是:
正如你所看到的,报告说/dev/sdb1
设置为只读(ro)。但我仍然可以在闪存驱动器中创建文件和文件夹。
我缺少什么?
答案1
blockdev
这似乎是用于与 HDD 交互的驱动程序的问题。
摘录-RE: 只读环回物理磁盘
> Another option that I recently found was the 'blockdev' command. You can
> specify that the blockdev is ro even before mounting.
>
> $ blockdev --report
> $ blockdev --setro /dev/device
>
> But my professor brought up the point - these probably depend on the
> driver used. Maybe a driver for ntfs totally ignores the ro switch? I
> don't totally agree that blockdev would be based on the driver, but how do
> you test whether the drive actually is in ro without writing? What if
> it fails?
本节也相关:
好吧,文件系统代码将(或应该)穿过块层,所以使用
blockdev --setro
应该是有效的。然而,分区似乎没有继承只读标志!换句话说,如果您有一个/dev/sda
带有单个分区的硬盘/dev/sda1
,您可以这样做blockdev --setro /dev/sda
,但是如果您这样做,blockdev --getro /dev/sda1
您会发现 sda1 的只读标志没有设置!我还没有验证在这种情况下是否可以写入 sda1。
因此,给定的分区似乎不会继承您可能需要使用的读/写权限mount
。
另一个摘录
> Then the saving grace - loopback devices. Mount the partition as a file.
> You don't need to worry about drivers, support, etc.
> To do this use losetup to create a loopback device:
>
> $ losetup -r /dev/loop1 /dev/hda1
>
> This creates a read-only loopback device pointing to `/dev/hda1`
> Then you can mount the loopback device (read-only if you are paranoid)
>
> $ mount -o ro /dev/loop1 /media/test
> This mounts the loopback device loop1 at `/media/test`. You can then
> traverse the directory of `/dev/hda1` just like it was mounted.
> According to the PDF document I mentioned above, doing this:
>
> $ mount -o ro,loop /dev/hda1 /media/test
答案2
blockdev --setro
必须在安装文件系统之前完成,而不是之后完成,否则您需要重新安装。它在联机帮助页中这么说。这比仅仅执行更多的写入操作mount -o ro
,但它仍然不一定阻止所有低级写入(特别是由于软件错误)。可以认为blockdev --setro
是告诉文件系统驱动程序驱动器上的写保护开关/跳线已翻转(记住驱动器/介质实际上有这些开关/跳线),但实际上并没有阻止写入。
mount -o ro
阻止用户/程序创建/更改文件,但文件系统驱动程序本身仍然可以执行诸如更新上次安装日期和重播日志之类的操作。
可以使用只读循环设备(losetup -r
),这可能更有效,但仅当文件系统不跨越设备时才有效。
有一些 Linux 取证 writeblocker 补丁可以提供--setro
更多功能,但是将设备从认为可以写入设备的已安装文件系统下更改为只读仍然是非常粗鲁的。该文档会告诉您有关这些问题的更多信息:
https://github.com/msuhanov/Linux-write-blocker
联机帮助页忽略了在整个磁盘设备 ( ) 上设置时--setro
不一定影响分区设备 ( ) 的情况。/dev/sdb1
/dev/sdb