可能的重复:
无分区文件系统的优点
所以我有一个块设备,比如说/dev/sda或/dev/loop0。显然,如果我想从前者启动,或者我想将它细分为具有单独文件系统的段,我需要对其进行分区。但假设我没有这些需求。相反,我只是计划使用我的整个块设备作为存储。也许我会将其作为raid 卷的一部分,或者我将使用cryptsetup 对其进行加密,或者我将其作为LVM 的PV。或者我只是想直接在上面安装一个文件系统。至少在其中一些情况下,使用未分区的设备似乎没有任何技术障碍。这就是我们通常对由losetup生成的块设备所做的事情,使用普通硬盘也可以做到这一点。我知道,因为我已经做到了。
现在,这有危险。例如,如果你继续运行fdisk /dev/sda,你将看不到任何有意义的东西。您可能会不小心将分区表或类似的内容写入您的设备,然后您在未分区设备上的数据将被冲洗掉。也许如果您甚至在连接了设备的情况下启动到 Windows,它就会被冲洗掉。人们会讲可怕的故事。
但我只想了解,如果设备只连接到您的 Unix 设置(为了简单起见,让我们只使用 Linux),并且您永远不会尝试向其写入分区表或 MBR 或类似的东西那,使用未分区的存储设备还有其他缺点吗?我不建议这样做;我只是想了解不这样做的真正原因是什么。
另一方面,对块设备进行分区有什么障碍或缺点/dev/loop0吗?也许这样做没有任何好处。但我希望它会起作用,不是吗?在这里,我也只是问,因为我想了解我们标准做法背后的原因。
如何在已知文件系统标签的情况下获取分区设备名称和挂载点?
有几种可能:
可以通过以下方式获取设备名称blkid:
blkid -l -o device -t LABEL="$label" -c /dev/null
Run Code Online (Sandbox Code Playgroud)
我尝试使用 获取挂载点blkid,但失败了。使用-s
开关可以在提供标签时查询所有其他字段:
blkid -l -t LABEL="$label" -o value -s LABEL # yields label
blkid -l -t LABEL="$label" -o value -s TYPE # yields partition type
blkid -l -t LABEL="$label" -o value -s UUID # yields UUID
blkid -l -t LABEL="$label" -o value -s MOUNTPOINT # yields nothing
Run Code Online (Sandbox Code Playgroud)
显然不支持获取挂载点,尽管在-o list给出选项时列出了它,但不是以易于解析的方式:
blkid -o list -c /dev/null <device>
Run Code Online (Sandbox Code Playgroud)
下一次尝试是使用df -P …
我正在编写一个脚本,它将设备上的所有文件复制到一个目录中。问题是一些设备有多个分区,而一些分区没有文件系统来复制文件。目前,我正在考虑使用lsblk获取设备上的分区列表并file -s检查每个分区上的文件系统。
有没有一种不那么粗暴的方法来做我想做的事情?
以下是有关空分区问题的信息:
# /dev/sdb is a flashdrive with two partitions
# /dev/sdb1 has no filesystem
# /dev/sdb2 has an ext4 partition
$ lsblk -fi
...
sdb vfat CARRIER-R C84B-6A72
|-sdb1 vfat CARRIER-R C84B-6A72
`-sdb2 ext4 CARRIER-R 33ebb632-68a5-4bf5-bd29-90733af9699e
...
$ lsblk -ln -o NAME,FSTYPE
...
sdb vfat
sdb1 vfat
sdb2 ext4
...
# As confirmation, mounting the partition fails
$ mount -t auto /dev/sdb1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sdb1 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要对磁盘进行低级随机访问(读取单个扇区)的实用程序。在 Linux 中,我通过访问相应的块设备(例如/dev/sda)来实现这一点。然而,我刚刚安装了 FreeBSD,我注意到它没有块设备。相反,磁盘显示为字符设备,不允许随机“搜索”。
有没有办法在 FreeBSD 中实现这一点?(即低级随机访问)
我在 VMware + SAN 上有几个 Linux VM。
SAN 上出现问题(失败路径),因此有一段时间,Linux VM 驱动器上出现 I/O 错误。当路径故障转移完成时,为时已晚:每台 Linux 机器都认为其大部分驱动器不再“值得信赖”,将它们设置为只读设备。根文件系统的驱动器也受到影响。
mount -o rw,remount / 没有成功, echo running > /sys/block/sda/device/state 没有成功,/sys以找到解决方案,但没有成功。blockdev --setrw /dev/sda我不得不重新启动我所有的 Linux VM。Windows 虚拟机很好...
问题描述为here。VMware 建议增加 Linux scsi 超时以防止发生此问题。
但是,当问题确实最终会发生,有没有办法让驱动器回读写模式?(一旦 SAN 恢复正常)
当我将闪存盘放入读卡器并使用 制作映像时dd,我会看到磁盘的实际大小,例如以下示例中的 512483328 字节:
1000944+0 records in
1000944+0 records out
512483328 bytes (512 MB) copied, 33.0091 s, 15.5 MB/s
Run Code Online (Sandbox Code Playgroud)
是否可以在不实际复制数据的情况下获得相同的数字?
在 DMESG 我看到:
[sdb] Attached SCSI removable disk
我使用这样的东西来卸载一系列驱动器:
umount /dev/sd[c-k]2
Run Code Online (Sandbox Code Playgroud)
有什么办法可以在 mount 上使用同样的东西吗?像这样:
mount /dev/sd[c-k]2 /[c2-k2]
Run Code Online (Sandbox Code Playgroud) 我经常使用 dd。我一直害怕有一天会犯错,例如在 sda(计算机磁盘)而不是 sdb(USB 磁盘)上写入,然后擦除我计算机上的所有内容。
我知道 dd 应该是一个高级用户工具,但对我来说,你基本上可以通过按错键来破坏整个计算机,这对我来说没有意义。
为什么没有一种安全措施来防止 dd 写入它从中获取命令的磁盘上?不知道怎么会有人故意这样做。
请注意,我自己没有尝试过这个,我只看过它,所以我可能是错的。
今天我了解到 FreeBSD 完全取消了对块设备的支持。在阅读他们做出决定的理由时,我发现了这一点:
块设备是内核为其提供缓存的磁盘设备。这种缓存使块设备几乎无法使用,或者至少危险地不可靠。缓存将重新排序写入操作的顺序,使应用程序无法在任何时刻及时了解确切的磁盘内容。这使得磁盘上数据结构(文件系统、数据库等)的可预测和可靠的崩溃恢复变得不可能。由于写入可能会延迟,因此内核无法向应用程序报告哪个特定的写入操作遇到了写入错误,这进一步加剧了一致性问题。
(来自https://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/driverbasics-block.html)
但是我知道 Linux 几乎只使用块设备(尽管一个 CAN 请求一个原始设备)。
那么 Linux 如何规避此引文中提到的问题?还是大多数驱动程序只是请求原始设备?
block-device ×10
linux ×6
freebsd ×2
mount ×2
partition ×2
bash ×1
cache ×1
dd ×1
disk ×1
filesystems ×1
flash-memory ×1
permissions ×1
posix ×1
readonly ×1
reboot ×1
scripting ×1
scsi ×1
size ×1
solaris ×1
vmware ×1