如何检查 TRIM 是否适用于加密卷?

Tom*_*ski 6 ssd trim luks 12.04

您可以轻松检查 TRIM 是否适用于“正常”ext4 分区:https : //askubuntu.com/a/19480/5920

如何为 LUKS 加密的加密货币做到这一点?让我们假设由 12.04 Alternate 安装程序(即涉及 LVM 的安装程序)进行的默认 LUKS 设置。

更新

我在这里要问的是,如果文件存储在加密卷中,我如何在删除文件后检查磁盘上的块是否实际填充了零。

des*_*gua 5

有一种方法可以测试它,由frostschutz在unix.stackexchange.com回答(这个答案是他的优点,所以感谢他),复制如下:

“创建一个测试文件:(不是故意随机的)

# yes | dd iflag=fullblock bs=1M count=1 of=trim.test 
Run Code Online (Sandbox Code Playgroud)

获取地址:(具体命令可能因filefrag版本而异)

# filefrag -s -v trim.test
File size of trim.test is 1048576 (256 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0    34048             256 eof
trim.test: 1 extent found
Run Code Online (Sandbox Code Playgroud)

获取设备:

# df trim.test
/dev/mapper/something  32896880 11722824  20838512   37% /
Run Code Online (Sandbox Code Playgroud)

通过此设置,您将拥有一个在地址上trim.test填充yes-pattern且长度为字节块的文件。/dev/mapper/something340482564096

直接从设备读取应该产生yes- 模式:

# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C
00000000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00100000
Run Code Online (Sandbox Code Playgroud)

如果启用 TRIM,则当您删除文件时,此模式应该会更改。请注意,还需要删除缓存,否则dd将无法从磁盘重新读取数据。

# rm trim.test
# sync
# fstrim -v /mount/point/ # when not using 'discard' mount option
# echo 1 > /proc/sys/vm/drop_caches
# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C
Run Code Online (Sandbox Code Playgroud)

在大多数 SSD 上,这会导致零模式:

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000
Run Code Online (Sandbox Code Playgroud)

如果涉及加密,您将看到一个随机模式:

00000000  1f c9 55 7d 07 15 00 d1  4a 1c 41 1a 43 84 15 c0  |..U}....J.A.C...|
00000010  24 35 37 fe 05 f7 43 93  1e f4 3c cc d8 83 44 ad  |$57...C...<...D.|
00000020  46 80 c2 26 13 06 dc 20  7e 22 e4 94 21 7c 8b 2c  |F..&... ~"..!|.,|
Run Code Online (Sandbox Code Playgroud)

这是因为经过物理修剪,加密层读取零并将这些零解密为“随机”数据。

如果yes- 模式持续存在,很可能没有进行任何修剪。”


这是我的自动化脚本:

#!/bin/bash
#
# 本脚本按“原样”提供,不附有任何明示或暗示的保证,包括但不限于适销性、特定用途适用性或不侵权的暗示保证。
#
# 许可证 GPL2
#
# 由德斯瓜 2014/04/29

功能清洁{
cd“$面食”
[ -f test-trim-by-desgua ] && rm test-trim-by-desgua && echo "临时文件已删除"
回声“再见”
出口0
}

陷阱回声;回声“已中止”。; 干净的; 回声;退出 0' INT HUP

if [[ "$(echo $USER)" != "root" ]]; 然后

read -n 1 -p '成为root?[是/否]'a
    如果 [[ $a == "Y" || $a == "y" || $a == "" ]]; 然后
        须藤 $0 $1
        出口0
    别的
        回声”
        该脚本需要root权限。
        ”
        1号出口

    菲

菲


name=$(echo $0 | sed 's/.*\///')
如果 [ $# -ne 1 ]; 然后

回声”
用法:$名称/文件夹/到/测试/

”
1号出口
菲

意大利面=1美元

读取 -n 1 -p '使用 fstrim?[是/否]'a
如果 [[ $a == "Y" || $a == "y" ]]; 然后
    FS=1
菲

方法=
while [[ "$method" != "1" && "$method" != "2" ]]; 做
read -n 1 -s -p '选择一个方法:
[1] hdparm(在 LVM 上的 LUKS 中将失败)
[2] filefrag(警告:您可能必须强制退出 - 关闭终端 - 在某些成功修剪的情况下,如果您看到永不结束的输出)
' 方法
完毕

函数 SDATEST {
磁盘=$(fdisk -l | grep /dev/sda)
if [ "$disk" == "" ]; 然后
回声”
fdisk 未找到 /dev/sda
”
1号出口
菲
}

功能测试 {
echo "正在输入/" ; 回声
cd $面食
echo "在 $pasta 创建文件 test-trim-by-desgua" ; 回声
dd if=/dev/urandom of=test-trim-by-desgua 计数=10 bs=512k
echo“正在同步并休眠 2 秒。” ; 回声
同步
睡觉2

hdparm --fibmap 测试修剪-by-desgua
lbab=$(hdparm --fibmap test-trim-by-desgua | tail -n1 | awk '{ print $2 }')

echo "如您所见,文件已创建,其 LBA 从 $lbab 开始" ; 回声

echo“正在同步并休眠 2 秒。” ; 回声
同步
睡觉2

echo "正在删除文件 test-trim-by-desgua" ; 回声
rm 测试修剪 by desgua

陷阱回声;回声;回声“已中止”。; 回声;退出 0' INT
echo“正在同步并休眠 2 秒。” ; 回声
同步
睡觉2

如果[[“$fs”==“1”]]; 然后
    echo "fstrim $pasta && sleep 2" ; 回声
    fstrim $意大利面
    睡觉2
菲

echo "这是从扇区 $lbab 读取的:"
hdparm --读取扇区 $lbab /dev/sda

pass=$(hdparm --read-sector $lbab /dev/sda | grep "0000 0000 0000 0000")

if [[ $pass == "" ]]; 然后
    回声”
修剪失败...
您应该只看到 0000 0000 0000 0000 ...
”
别的
    回声“成功!!!”
菲
出口0

}

函数LUKSTEST {
# 参考:https://unix.stackexchange.com/questions/85865/trim-with-lvm-and-dm-crypt#
echo 1 > /proc/sys/vm/drop_caches
cd $面食
echo“正在创建一个“是”文件。”
是的 | dd iflag=fullblock bs=1M count=1 of=test-trim-by-desgua

#position=`filefrag -s -v test-trim-by-desgua | grep “eof”| awk '{ print $3 }'`
位置=`filefrag -s -v test-trim-by-desgua | grep “eof”| sed 的| ||克; s|.*255:|| ; s|\.\..*||'`
[[ "$position" == "" ]] && echo "无法找到文件的位置。您是否在 LVM 上使用 LUKS?" && 干净的;

设备=`df test-trim-by-desgua | grep“dev/”| awk '{ 打印 $1 }'`

yes=`dd bs=4096 跳过=$位置计数=256 if=$设备 | 十六进制转储-C`

echo "在下一行中,您应该看到如下模式:
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |yyyyyyyy|
$是的
”

if [[ "`echo "$yes" | grep "yyy"`" == "" ]]; 然后
    echo“无法检查模式。出了问题。正在退出。”
    干净的;
别的
    echo“模式已确认。”
菲

echo“删除临时文件。”
rm 测试修剪 by desgua

回显“正在同步”。
同步
睡觉 1

如果[[“$fs”==“1”]]; 然后
    echo "fstrim -v $pasta && sleep 2" ; 回声
    fstrim -v $意大利面
    睡觉2
菲

# 删除缓存
echo 1 > /proc/sys/vm/drop_caches

echo "在下一行中,您不应该看到类似以下的 yes 模式:
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |yyyyyyyy|
如果您看到,则修剪不起作用:
`dd bs=4096 跳过=$位置计数=256 if=$device | 十六进制转储-C`"

yes=`dd bs=4096 跳过=$位置计数=256 if=$设备 | 十六进制转储-C`
if [[ "`echo "$yes" | grep "yyy"`" != "" ]]; 然后
    echo“修剪不工作。”
别的
    echo “TRIM 正在工作!”
菲
干净的;
}

if [[ "$method" == "1" ]]; 然后
    数据测试;
    测试;
elif [[ "$method" == "2" ]]; 然后
    运气测试;
菲
出口0