LVM 및 dm-crypt로 트림


21

이 튜토리얼에 따라 우분투 13.04에서 LVM 및 dm-crypt로 TRIM을 설정하려고했습니다.

http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/

아래 구성 및 테스트 절차에 대한 참고 사항을 참조하십시오.

질문

  1. TRIM이 제대로 작동하면 신뢰할 수있는 테스트가 있습니까?

  2. 테스트 루틴이 잘못되었거나 TRIM이 작동하지 않습니까?

  3. 작동하지 않는 경우 : 설정에 어떤 문제가 있습니까?

  4. 설정을 위해 TRIM을 디버깅하고 TRIM을 작동 시키려면 어떻게해야합니까?

구성

여기 내 구성이 아닙니다.

cat /etc/crypttab

sda3_crypt UUID=[...] none luks,discard

cat /etc/lvm/lvm.conf

# [...]
devices  {
      # [ ... ]
      issue_discards = 1
      # [ ... ]
   }
# [...]

SSD는 Samsung 840 Pro입니다.

여기 내 시험 절차가 있습니다

난 그냥했던 설정을 테스트하려면 sudo fstrim -v /결과

/: [...] bytes were trimmed

이 작업을 다시 수행하면 /: 0 bytes were trimmed의미가 있고 TRIM이 작동하는 것으로 나타납니다.

그러나이 테스트를 수행했습니다.

dd if=/dev/urandom of=tempfile count=100 bs=512k oflag=direct

sudo hdparm --fibmap tempfile                                 

tempfile:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    5520384    5521407       1024
      524288    5528576    5529599       1024
     1048576    5523456    5525503       2048
     2097152    5607424    5619711      12288
     8388608    5570560    5603327      32768
    25165824    5963776    5980159      16384
    33554432    6012928    6029311      16384
    41943040    6275072    6291455      16384
    50331648    6635520    6639615       4096

sync

sudo hdparm --read-sector 5520384 /dev/sda                    

/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981

sudo rm tempfile

sync

sudo fstrim /

sync

sudo hdparm --read-sector 5520384 /dev/sda

/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981

이것은 TRIM이 작동하지 않음을 나타냅니다. 이후

sudo hdparm -I /dev/sda | grep -i TRIM                        
       *    Data Set Management TRIM supported (limit 8 blocks)
       *    Deterministic read ZEROs after TRIM

편집하다

출력은 다음과 같습니다 sudo dmsetup table

lubuntu--vg-root: 0 465903616 linear 252:0 2048
lubuntu--vg-swap_1: 0 33308672 linear 252:0 465905664
sda3_crypt: 0 499222528 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 8:3 4096 1 allow_discards

여기 내 /etc/fstab:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/lubuntu--vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda2 during installation
UUID=f700d855-96d0-495e-a480-81f52b965bda /boot           ext2    defaults        0       2
# /boot/efi was on /dev/sda1 during installation
UUID=2296-2E49  /boot/efi       vfat    defaults        0       1
/dev/mapper/lubuntu--vg-swap_1 none            swap    sw              0       0
# tmp
tmpfs /tmp tmpfs nodev,nosuid,noexec,mode=1777          0       0 

편집하다:

나는 마침내 https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1213631 의 버그로보고했습니다.

누군가가 해결책을 찾거나 적어도 설정을 테스트하고 버그를 확인하기를 바랍니다.

최신 정보

이제 작동합니다. 허용되는 답변을 참조하십시오.


LVM은 파기를 누락하는 것,해야 issue_discards하지 issue discards그 오타가 아니었다면. allow_discardsLVM 파티션의 dmsetup 테이블에 표시되어야합니다.
frostschutz

죄송합니다. 오타였습니다. 내가 가진 issue_discards = 1내 config 파일에서.
학생

내가 당신이라면 iSCSI 대상을 사용하고 tcpdump / wireshark를 통해 이것을 테스트하여 설정이 작동하는지 확인하지만 Linux iSCSI 대상이 트림을 지원하는지 여부는 알 수 없습니다. 나는 dm-crypt가 물리적 디스크의 블록을 비워서는 안된다고 생각합니다. 왜냐하면 장치를 무차별 대입하려고 할 때 장치의 여유 공간을 무시하기가 더 쉽기 때문입니다. ). 또한,웨어 레벨링은 판독 된 블록과 다른 블록으로 판독을 리디렉션 할 수 있으므로 SSD는 블랭킹 후 0을 반환하지 않아도됩니다.
Didi Kohen

1
에 따르면 bugzilla.redhat.com/show_bug.cgi?id=958096 나는 오해 issue_discards = 1
frostschutz

답변:


23

다른 테스트 방법을 사용하는 것이 좋습니다. hdparm파일 시스템 주소가 아닌 장치 주소를 제공하기 때문에 약간 이상합니다.이 주소와 관련된 장치를 말하지 않습니다 (예 : 파티션을 확인하지만 devicemapper 대상 등은 아닙니다). 일관된 방식으로 파일 시스템 주소를 고수하는 것을 사용하는 것이 훨씬 쉽습니다 (zfs / btrfs와 같은 비 전통적인 파일 시스템은 제외).

테스트 파일 만들기 : (의도적으로 무작위가 아님)

# yes | dd iflag=fullblock bs=1M count=1 of=trim.test 

주소, 길이 및 블록 크기 가져 오기 : (정확한 명령은 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

장치 및 마운트 지점을 가져옵니다.

# df trim.test
/dev/mapper/something  32896880 11722824  20838512   37% /mount/point

이 설정을 사용하면 바이트 블록 길이의 주소에 -pattern으로 trim.test채워진 파일이 있습니다 .yes/dev/mapper/something340482564096

장치에서 직접 읽으면 yes-pattern 이 생성됩니다 .

# 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

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

패턴이없는 대부분의 SSD에서 :

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000

암호화가 관련된 경우 임의 패턴이 대신 나타납니다.

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..&... ~"..!|.,|

물리적으로 트리밍되기 때문에 암호화 계층은 0을 읽고이 0을 해독하여 "무작위"데이터로 만듭니다.

경우 yes-pattern이 지속, 가장 가능성이 전혀 수행되지 않은 트리밍.


1
@student : 나는 이것을 일찍 알리지 않아서 기분이 좋지 않고, 전에 캐시를 삭제하도록 답변을 편집했습니다 hexdump.
frostschutz

1
고마워요, 그것은 빠진 부분이었습니다. 이제 작동하는 것 같습니다!
학생

2
커널에서 SSD에서 무언가를 다듬을 때마다 캐시가 자체적으로 드롭하지 않아야하는지 확실하지 않습니다. 캐시는 잘못된 데이터를 반환하지 않아야합니다. 더 이상 존재하지 않는 무언가가 차지한다면 캐시 메모리를 낭비하는 것입니다.
frostschutz

1
@frostschutz이 훌륭한 솔루션에 감사드립니다. 게으른 사람이 여기 오면 프로세스를 자동화하는 스크립트를 만들었습니다.
desgua

1
새로 온 사람들은 TRIM 명령이 항상 블록을 "제로 채우기"하지는 않습니다. 여기 , 여기여기를 참조 하십시오 . OP의 경우 hdparm -I결과는 "TRIM 후 결정적 읽기 ZEROs"를 나타 내기 때문 입니다.
Marc.2377

3

테스트 루틴이 잘못되었습니다 (파일 시스템이있는 블록 장치와 관련된 섹터 번호를 얻음).이 경우 논리 볼륨입니다. 물론 논리적 볼륨은 물리적 볼륨의 첫 번째 섹터에서 시작하지 않으며 연속되지 않을 수도 있습니다.

논리 볼륨이 물리 볼륨의 섹터 0에서 시작하더라도 (물론 그렇지 않은 경우) 물리 볼륨은 실제로 다른 장치 매퍼 대상 (암호화 용)입니다. 그리고 아마도 LUKS 헤더가 앞에있을 것이므로 섹터 번호도 일치하지 않습니다.

섹터 번호를 기본 디스크에 매핑하여 작업하려는 경우 dmsetup tables필요한 정보를 제공합니다. 여기에 붙여 넣으면 출력에 키를 표시하지 않는 버전인지 확인하십시오 (대신 0을 모두 표시해야 함)! ( 키를 공개 해도 복구 할 수 없으며, 변경할 수 없습니다 . 비밀번호를 공개하는 것보다 훨씬 나쁩니다.)

디버깅하려면 (섹터 매핑이 해결되면) 가장 낮은 수준에서 시작하여 작동하는지 확인하는 것이 좋습니다. 파일 시스템을 / dev / sdaX에서 직접 트리밍하고 작동하는지 확인하십시오 (장치가 있고 트림이 0을 다시 읽지 않을 가능성이 있음). 그런 다음 그 위에 dm-crypt를 수행하고 파일 시스템을 정리하고 작동하는지 확인하십시오. 마지막으로 LVM을 맨 위에 놓고 작동하는지 확인하십시오.


@student OK, 그것은 잘못된 섹터입니다 (제 답변의 첫 두 단락). 더 이상 관련이 없으므로 섹터 6575104에 대한 해당 문장을 제거하기 위해 답변을 편집하겠습니다.
derobert

어떤 장치를 사용해야하는지 잘 모르겠습니다 dmsetup. 난 그냥 한 : sudo dmsetup table /dev/mapper/lubuntu--vg-root주는0 465903616 linear 252:0 2048
학생

@student 즉, 섹터 0이 장치 252 : 0의 섹터 2048에 있음을 의미합니다. 252 : 0이 무엇인지 알아 내야합니다. dm 암호 장치 (예 : 주 및 부 번호는 / dev에 표시됨)입니다. 그리고 기본 장치의 블록으로 계속 추격하려면 해당 장치의 테이블을 살펴 봐야합니다.
derobert

3

이것은 게으른 사람이 여기 오면 공유하고 싶은 스크립트 일뿐입니다. 그것은 frostschutz받아 들인 대답 으로 만들어졌습니다 .

#! / bin / bash
#
#이 스크립트는 상품성, 특정 목적에의 적합성 또는 비 침해에 대한 묵시적 보증을 포함하되 이에 국한되지 않는 명시 적 또는 묵시적 보증없이 "있는 그대로"제공됩니다.
#
# 라이센스 GPL2
#
# desgua에 의해 2014/04/29

기능 청소 {
cd "$ 파스타"
[-f test-trim-by-desgua] && rm test-trim-by-desgua && echo "Temp 파일이 제거되었습니다"
에코 "안녕"
출구 0
}

트랩 에코; 에코 "중단되었습니다." ; 깨끗한; 에코; 0 'INT HUP 출구

if [[ "$ (echo $ USER)"! = "root"]]; 그때

-n 1 -p를 읽으십시오. '루트가 되셨습니까? [Y / n] '
    if [[$ a == "Y"|| $ a == "y"|| $ a == ""]]; 그때
        sudo $ 0 $ 1
        출구 0
    그밖에
        에코 "
        이 스크립트에는 루트 권한이 필요합니다.
        "
        1 번 출구

    fi

fi


name = $ (에코 $ 0 | sed 's /.*\///)
[$ # -ne 1]이면; 그때

에코 "
사용법 : $ name / folder / to / test /

"
1 번 출구
fi

파스타 = $ 1

-n 1 -p 'fstrim을 사용 하시겠습니까? [y / N] '
if [[$ a == "Y"|| $ a == "y"]]; 그때
    fs = 1
fi

방법 =
while [[ "$ method"! = "1"&& "$ method"! = "2"]]; 해야 할 것
읽기 -n 1 -s -p '방법을 선택하십시오 :
[1] hdparm (LVM의 LUKS에서 실패)
[2] filefrag (경고 : 출력이 끝나지 않는 경우 트림이 성공하는 경우 강제 종료를해야 할 수도 있습니다. 
'방법
끝난

SDATEST 함수 {
disk = $ (fdisk -l | grep / dev / sda)
만약 [ "$ disk"== ""]; 그때
에코 "
fdisk가 / dev / sda를 찾지 못했습니다 
"
1 번 출구
fi
}

기능 검사 {
에코 "입력 /"; 에코
CD $ 파스타
echo "$ pasta에서 파일을 테스트하여 작성합니다"; 에코
dd if = / dev / urandom of = 테스트 트리밍 횟수 = 10 bs = 512k
echo "동기화 및 2 초 절전 모드" ; 에코
동조
수면 2

hdparm --desbby-fibmap 테스트
lbab = $ (hdparm --fibmap test-trim-by-desgua | tail -n1 | awk '{print $ 2}')

echo "보시다시피, 파일이 생성되었고 LBA는 $ lbab에서 시작합니다"; 에코

echo "동기화 및 2 초 절전 모드" ; 에코
동조
수면 2

echo "destriby-trim-bytest 파일 제거"; 에코
rm 테스트 트리밍

트랩 에코; 에코; 에코 "중단되었습니다." ; 에코; 출구 0 'INT
echo "동기화 및 2 초 절전 모드" ; 에코
동조
수면 2

만약 [[ "$ fs"== "1"]]; 그때
    echo "fstrim $ pasta && sleep 2"; 에코
    fstrim $ 파스타
    수면 2
fi

echo "이것은 $ lbab 섹터에서 읽습니다 :"
hdparm-읽기 섹터 $ lbab / dev / sda

pass = $ (hdparm-읽기 섹터 $ lbab / dev / sda | grep "0000 0000 0000 0000")

만약 [[$ pass == ""]]; 그때
    에코 "
트림 실패 ... 
0000 0000 0000 0000 만 표시됩니다 ...
"
그밖에
    에코 "성공 !!!"
fi
출구 0

}

기능 LUKSTEST {
# 참조 : /unix/85865/trim-with-lvm-and-dm-crypt#
에코 1> / proc / sys / vm / drop_caches
CD $ 파스타
echo "\"yes \ "파일 작성."
예 | dd iflag = 풀 블록 bs = 1M 카운트 = 1 of = 테스트-트리-드-데스 구아

# position =`filefrag -s -v 테스트 트림 별 | grep "eof"| awk '{print $ 3}'`
position =`filefrag -s -v 테스트 트림 별 | grep "eof"| sed의 | || g; s |. * 255 : || ; s | \. \ .. * || '`
[[ "$ position"== ""]] && echo "파일의 위치를 ​​찾을 수 없습니다. LVM의 LUKS에 있습니까?" && 깨끗한;

device =`df 테스트 트리밍 기준 | grep "dev /"| awk '{print $ 1}'`

yes =`dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -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 "패턴을 확인할 수 없습니다. 문제가 발생했습니다. 종료하는 중입니다."
    깨끗한;
그밖에
    에코 "패턴 확인."
fi

echo "임시 파일을 제거합니다." 
rm 테스트 트리밍

에코 "동기화."
동조
수면 1

만약 [[ "$ fs"== "1"]]; 그때
    echo "fstrim -v $ pasta && sleep 2"; 에코
    fstrim -v $ 파스타
    수면 2
fi

캐시 삭제
에코 1> / proc / sys / vm / drop_caches

echo "다음 줄에서는 다음과 같은 예 패턴을보아야합니다 **. 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy | 
보이면 다듬기가 작동하지 않는 것입니다.
`dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -C` "

yes =`dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -C`
if [[ "`echo"$ yes "| grep"yyy "`"! = ""]]; 그때
    에코 "TRIM이 작동하지 않습니다."
그밖에
    에코 "TRIM이 작동합니다!"
fi
깨끗한;
}

만약 [[ "$ method"== "1"]]; 그때
    SDATEST;
    테스트;
elif [[ "$ method"== "2"]]; 그때
    뤼크 스트;
fi
출구 0

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.