Tom*_*ski 6 ssd trim luks 12.04
您可以轻松检查 TRIM 是否适用于“正常”ext4 分区:https : //askubuntu.com/a/19480/5920。
如何为 LUKS 加密的加密货币做到这一点?让我们假设由 12.04 Alternate 安装程序(即涉及 LVM 的安装程序)进行的默认 LUKS 设置。
我在这里要问的是,如果文件存储在加密卷中,我如何在删除文件后检查磁盘上的块是否实际填充了零。
有一种方法可以测试它,由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