从磁盘末端,如何计算到第一个非零位置的 MB(兆字节)数?

从磁盘末端,如何计算到第一个非零位置的 MB(兆字节)数?

我正在使用 Kubuntu 22.04.3 LTS x86_64。

重新利用磁盘时使用:

neofetch --stdout |grep 'OS:'

无需将dd整个磁盘清零的漫长过程,只需dd将磁盘的前几个字节清零,然后dd将磁盘的最后几个字节清零,并保持磁盘的中间字节不变。

我理解下面的命令从磁盘或位置的前面开始000000,然后可以确认零填充的磁盘,或者
如果磁盘不是全零,则停止命令并在第一个非零位置输出:

time sudo dd if=/dev/sdb bs=1M status=progress | od | head  #verify_disk_zero_filled_statusProgress  
  
132120576 bytes (132 MB, 126 MiB) copied, 5 s, 26.3 MB/s  
  
   0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
1004000000 060000 000014 071000 000061 074346 000002 006072 000060
1004000020 057765 000014 000000 000000 000002 000000 000002 000000
1004000040 100000 000000 100000 000000 020000 000000 000000 000000
1004000060 012736 060472 000000 177777 167523 000000 000001 000000
1004000100 012735 060472 000000 000000 000000 000000 000001 000000
1004000120 000000 000000 000013 000000 000400 000001 000074 000000
1004000140 001102 000000 000173 000000 147441 013053 117027 110110
1004000160 002275 160114 106464 074723 000000 000000 000000 000000

real    0m5.224s

问题:

命令是什么?

如何执行与上述命令相同的操作,但从磁盘后部开始,从磁盘末尾开始,然后从磁盘后部以 MB(兆字节)为单位输出到第一个非零位置?

换句话说,如果磁盘是:

128.0 GB 且磁盘全为零,直到 127.9 GB,命令从磁盘末尾开始并向磁盘前面扫描,并将从磁盘末尾输出 000.1 GB 或 100 MB,出现第一个非零字节。

对于上述示例,所需命令将输出 100 MB。

因此允许脚本中的 m_b 从 32 MB 更改
为 128 + MB:

m_b=32  # Megabytes from disk end, for dd command.   
time sudo dd if=/dev/zero  of=/dev/sd_  bs=512  count=$(( 2048 * $m_b )) seek=$(( $(sudo blockdev --getsz /dev/sd_) - 2048 * $m_b )) status=progress     #lastbytes_zero 

sd_=sdb 或 sdc ...

上述命令的输出dd

33047040 bytes (33 MB, 32 MiB) copied, 14 s, 2.4 MB/s
65536+0 records in
65536+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 15.0554 s, 2.2 MB/s
  
real    0m15.089s

从磁盘末端,如何计算到第一个非零位置的 MB(兆字节)数?

答案1

这是用户 psusi 在帖子中接受的答案 擦除硬盘最后 1MB 的数据

在 Linux 上获取磁盘大小的最简单方法是 blockdev --getsz

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))

用户 Gilles 的另一个答案是:

每个分区的大小可在 中找到/proc/partitions。以下命令显示 的大小sdx(以 kB 为单位):

awk '$4 == "sdx" {print $3}' </proc/partitions

因此:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))

相关内容