是否有一个实用程序(或一些 shell 魔法)可以让我比较两个块设备?
详细信息:我有一个大型 (0.5 TB) RAID 设备,我已使用 dd 将其备份到稍大的 SATA 设备。该设备上有多个分区,但是我从“父”设备而不是分区设备节点复制(例如,我复制 /dev/hda 而不是 /dev/hda1)。
我想验证备份是否良好/正确。
我曾考虑过在每个设备上运行 md5sum,但是这不会给我一个准确的结果,因为第二个设备比第一个设备稍大,因此额外的字节会改变散列。
bcache允许一个或多个快速磁盘驱动器(例如基于闪存的固态驱动器 (SSD))充当一个或多个较慢硬盘驱动器的缓存。
如果我理解正确,
我想知道哪种方法更明智。我突然想到,使用一种或其他技术增加 RAID5/6 可能更简单,但我不确定是哪一种!
选择一种方法而不是另一种方法(对于包含 VM 后备文件的大型非根文件系统)是否有充分的理由(例如增加后备存储或其他任何东西)?
* “一个 SSD”是指某种冗余 SSD 设备,例如两个物理 SSD 的 RAID1
考虑一个 100MB 的原始块设备作为一个简单的例子。即 204800 个块,每个块 512 字节,总共 102760448 字节。
挑战在于移动前 98MB(200704 个块),因此在它前面有 2MB(4096 个块)的间隙。就地执行此操作要求未向尚未读取的扇区写入任何内容。实现此目的的一种方法是引入缓冲区:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
Run Code Online (Sandbox Code Playgroud)
期望是mbuffer在将任何内容传递给写入器之前将存储 4096 个块,从而确保没有任何内容写入尚未读取的区域,并且写入器滞后读取器缓冲区的大小。缓冲区应该允许读取器和写入器在这些约束内尽可能快地操作。
但是,它似乎不能可靠地工作。我试过使用真实的设备,但它从来没有在它们上工作过,而对文件的实验在我的 64 位机器上有效,但在我的 32 位机器上无效。
首先,一些准备工作:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Run Code Online (Sandbox Code Playgroud)
这不起作用:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 …Run Code Online (Sandbox Code Playgroud) $ df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 480589544 42607368 413546516 10% /
$ ls /dev/root
ls: cannot access /dev/root: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我想检查我的默认 Debian 安装位置是/tmp在 RAM 中还是在磁盘上,但现在完全糊涂了。为什么不存在的设备会被报告为文件系统类型?“安装在/”是什么意思?
这是输出mount:
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=811520k,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=1013960,mode=755)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1623020k) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用dd并打印其偏移量在块设备上找到第一个非零字节(从可选偏移量开始),但我被卡住了。我没有dd在标题中提及,因为我认为可能有比dd这样做更合适的工具,但我认为dd应该是一个好的开始。如果您知道更合适的工具和/或更有效的方法来实现我的目标,那也没关系。
与此同时,我将向您展示我dd在 bash 方面的进展,到目前为止。
#!/bin/bash
# infile is just a temporary test file for now, which will be replaced with /dev/sdb, for instance
infile=test.txt
offset=0
while true; do
byte=`dd status='none' bs=1 count=1 if="$infile" skip=$offset`
ret=$?
# the following doesn't appear to work
# ret is always 0, even when the end of file/device is reached
# how do I correctly determine if dd has reached the end of file/device?
if …Run Code Online (Sandbox Code Playgroud) 给定一个设备文件,比如说/dev/sdb,是否可以确定它背后的驱动程序?
具体来说,我想确定我的存储设备正在使用什么驱动程序。fdisk -l列出 2 个设备:/dev/sda和/dev/sdb. 一个是 SATA 硬盘驱动器,另一个是 USB 大容量存储设备 - 实际上是 SD 卡。
我如何以编程方式确定哪个是哪个?
我正在编写一个软件,我想保护初学者免于擦除他们的硬盘驱动器,同时允许他们擦除他们的 SD 卡。
我正在从现有的dd工厂映像自动化 SD 卡映像。SD 卡始终通过外部 USB 读卡器连接,因此在系统中显示为 SCSI 块设备/dev/sd*。
目前我的命令的语法是:SD 卡块设备write-image DEVICE在哪里DEVICE,例如。/dev/sdd.
我已经在做一个基本的检查DEVICE来验证它的形式,/dev/sd*但这还不够:我担心用户(不习惯 Linux 的生产人员)犯错误并指定另一个看似有效的设备,例如。/dev/sda. 您可以看到迫在眉睫的灾难,特别是因为我的映像脚本需要root权限(请注意,不是编写映像本身,而是稍后修改SD卡,包括根据SD卡的实际大小调整分区大小)...
我想验证指定的设备实际上是某个 USB 大容量存储设备(或者至少是一个可移动设备),以便我可以保护系统磁盘不被意外丢弃。我怎样才能做到这一点?
我/proc在网上或网上找不到任何相关内容,我现在很茫然。
我想知道确定(没有 root 权限)是否安装了块设备(例如sdb)或其任何部分(以及它的哪一部分)的最简单方法是什么。
检查/proc/mountssdb 是不够的,因为sdbLVM 可能使用它的分区之一。您可以检查,/sys/block/sdb/sdb*/holders/但您会得到dm-x必须解析为/dev/mapper名称才能检查的条目/proc/mounts。可能,但如果有更简单的解决方案......(应该不需要 root 权限)
我得到一个目录或文件的路径。
哪个实用程序/shell 脚本可以可靠地为我提供此目录/文件所在的文件系统的 UUID?
通过文件系统的 UUID 我的意思是UUID=...如所示的条目blkid
我正在使用红帽 Linux。
(有人建议我应该在 unix.stackexchange.com 上问这个问题,所以我把它从原来的 stackexchange.com 移了过来)
fstrim需要挂载Linux块设备,而且不是很冗长。blkdiscard可以看出,但这也需要写操作。
我能否以某种方式判断块设备是否支持修剪/丢弃,而不实际尝试修剪/丢弃其上的某些内容?