LVM ve dm-crypt ile kesin


21

TRIM'i LVM ve dm-crypt ile ubuntu 13.04 üzerine kurmaya çalıştım.

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

Yapılandırmam ve aşağıdaki test prosedürüm hakkında notlara bakın.

Sorular

  1. TRIM düzgün çalışıyorsa güvenilir bir test var mı?

  2. Test rutinim yanlış mı yoksa TRIM'im çalışmıyor mu?

  3. Çalışmıyorsa: kurulumumda yanlış olan ne?

  4. TRIM kurulumum için nasıl hata ayıklayabilir ve TRIM'in çalışmasını nasıl sağlayabilirim?

Yapılandırma

İşte benim yapılandırmam:

cat /etc/crypttab

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

ve

cat /etc/lvm/lvm.conf

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

SSD Samsung 840 Pro'dur.

İşte benim test prosedürüm

Kurulumu test etmek için sadece sudo fstrim -v /sonuçta yaptım

/: [...] bytes were trimmed

Bunu tekrar /: 0 bytes were trimmedyapmak, bunun mantıklı göründüğü sonucunu verdi ve TRIM'in işe yaradığını belirtti.

Ancak o zaman bu testi yaptım:

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

Bu TRIM'in işe yaramadığını gösteriyor gibi görünüyor. Dan beri

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

Düzenle

İşte çıktısı 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

İşte benim /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 

Düzenle:

Sonunda https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1213631 adresinde bir hata olduğunu bildirdim.

Birisi orada bir çözüm bulacağını umuyorum ya da en azından kurulumu test edin ve hatayı doğrulayın.

Güncelleştirme

Şimdi işe yarıyor, kabul edilen cevaba bakınız.


LVM'nin attığı kayıplar var gibi görünüyor, yazım hatası issue_discardsolmasa issue discardsbile olmamalı . allow_discardsLVM bölümleri için dmsetup tablosunda görünmelidir.
frostschutz

Üzgünüm, bu bir yazım hatası oldu. issue_discards = 1Config dosyamda var .
Öğrenci

Yerinde olsam, bir iSCSI hedefi kullanmaya çalışırdım ve kurulumun işe yarayıp yaramadığını görmek için tcpdump / wireshark aracılığıyla test etmeye çalışırdım, ancak Linux iSCSI hedefinin trimini destekleyip desteklemediğini bilmiyorum. Dm-crypt'ın fiziksel diskteki blokları boş bırakmaması gerektiğine inanıyorum çünkü zorla çalıştırmaya çalışırken aygıttaki boş alanı görmezden gelmeyi kolaylaştırıyor (ancak bunu yapıp yapmadığını bilmiyorum) ). Ek olarak, SSD'lerin boşluk bıraktıktan sonra sıfır döndürmesi gerekli değildir, çünkü aşınma seviyelendirme okumayı boşluk bırakılmış olandan farklı bir bloğa yönlendirebilir.
Didi Kohen

1
Bugzilla.redhat.com/show_bug.cgi?id=958096 'ya göre , topic_discards = 1' i yanlış anladım.
frostschutz 28:13

Yanıtlar:


23

Farklı bir test yöntemi kullanmanızı öneririm. hdparmdosya sistemi adreslerinden ziyade aygıt adreslerini vermesi biraz gariptir ve bu adreslerin hangi aygıtla ilişkili olduğunu söylemez (örneğin, bölümleri düzeltir, ancak aygıt belirleyici hedefleri değil). Dosya sistemi adreslerine yapışan bir şeyi kullanmak çok daha kolaydır, bu şekilde tutarlıdır (zfs / btrfs gibi geleneksel olmayan dosya sistemleri hariç).

Bir test dosyası oluşturun: (bilerek rasgele değil)

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

Adres, uzunluk ve blok boyutu al: (kesin komut, filefragversiyona bağlıdır )

# 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

Cihazı ve montaj noktasını alın:

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

Bu kurulumda , adresin bayt bloğu uzunluğunda adresinde -pattern ile trim.testdoldurulmuş bir dosyanız var .yes/dev/mapper/something340482564096

Bunu doğrudan cihazdan okumak yes-pattern'i üretmelidir:

# 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 etkinse, dosyayı silerken bu kalıp değişmelidir. Önbelleklerin de düşürülmesi gerektiğine dikkat edin, aksi takdirde dddiskten verileri yeniden okumaz.

# 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

Çoğu SSD'de sıfır paternle sonuçlanır:

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

Şifreleme varsa, bunun yerine rastgele bir desen göreceksiniz:

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

Bunun nedeni fiziksel olarak kesilmiş, kripto katmanı sıfırları okur ve bu sıfırları "rastgele" verilere şifresini çözer.

Eğer yes-pattern devam ederse büyük ihtimalle hiçbir yapılmıştır düzeltici.


1
@student: Bunu daha önce farketmediğim için kendimi kötü hissediyorum, daha önce önbellekleri bırakma yanıtını değiştirdim hexdump.
frostschutz 28:13

1
Teşekkürler, eksik olan nokta buydu. Şimdi iş gibi görünüyor!
Öğrenci,

2
SSD'ye bir şey düştüğünde çekirdeğin önbellekleri düşürmemesi gerektiğinden hala emin değilim. Önbelleklerin yanlış veri döndürmemesi gerekiyor. Ayrıca, artık orada olmayan bir şey tarafından işgal edilmişse, önbellek kaybıdır.
frostschutz 29:13

1
@frostschutz Bu harika çözüm için teşekkür ederiz. Tembel birileri buraya gelirse işlemi otomatikleştirmek için bir senaryo hazırladım.
desgua

1
Yeni gelenler , TRIM komutunun blokları her zaman "sıfır doldurmayacak" olduğunu unutmayın. Bkz burada , burada ve burada . Olması gerektiği halde, OP'nin durumunda, hdparm -Isonuçları “TRIM'den sonra determinerist SIFIR okuma” ifadesini gösterdiğinden beri .
Marc.2377,

3

Test rutininiz yanlış - dosya sisteminin oturduğu blok cihaza göre sektör numaralarını alıyorsunuz - ki bu durumda mantıklı bir cilt. Mantıksal hacim, elbette, fiziksel hacmin ilk sektöründe başlamaz (ve bitişik olmayabilir).

Mantıksal hacim, fiziksel birimin 0 kesiminde (ki olmadığı) başlasa bile, fiziksel birim aslında şifreleme için bir başka cihaz-eşleyici hedefidir. Muhtemelen önünde bir LUKS başlığı var, bu yüzden sektör sayıları da aynı şekilde uymuyor.

Sektör numarasını altta kalan diske eşleştirmek yoluyla çalışmak dmsetup tablesistiyorsanız, ihtiyacınız olan bilgiyi size verecektir. Buraya yapıştırırsanız, kendinizin çıktıda anahtarı göstermeyen bir sürüm olduğundan emin olun (bunun yerine tüm 0'ları göstermelidir)! ( Anahtarı açıklamaktan kurtarma yapılmaz - değiştirilemez - şifreyi açıklamaktan çok daha kötüdür).

Hata ayıklamak için (sektör haritasını çıkardıktan sonra) en düşük seviyede başlamanızı ve orada çalıştığını onaylamanızı öneririm. Bir dosya sistemini doğrudan / dev / sdaX üzerinde TRIM yapın ve çalıştığından emin olun (cihazın yatması ve trimin sıfırları okuması mümkün değildir). Sonra üzerine dm-crypt yazın ve bunun üzerinde bir dosya sistemi oluşturun ve çalıştığından emin olun. Son olarak, LVM'yi en üste koyun ve çalışıp çalışmadığını kontrol edin.


@ Öğrenci tamam, o zaman yanlış sektör (cevabımın ilk iki paragrafı). 6575104 numaralı sektörle ilgili bu cümleyi kaldırmak için cevabımı düzenleyeceğim, çünkü artık alakalı değil.
derobert

Hangi cihazı kullanmam gerektiğinden emin değilim dmsetup. Ben sadece yaptım: sudo dmsetup table /dev/mapper/lubuntu--vg-roothangi verir0 465903616 linear 252:0 2048
öğrenci

@student Bu, 0 sektörünün 252: 0 cihazında sektör 2048'de olduğu anlamına gelir. 252: 0'ın ne olduğunu bulmak zorunda kalacaksınız, sanırım onun dm şifreleme cihazınız (bu büyük ve küçük sayı, örneğin / dev'te gösterilecek). Ve alttaki cihazın üzerindeki bir bloğa kadar takip etmeye devam etmek için bu cihazın masasına bakmanız gerekir.
derobert,

3

Bu sadece tembel biri buraya gelirse paylaşmak istediğim bir senaryo. Bu üzerinden yapıldığı kabul edilen cevabını dan frostschutz .

#! / Bin / bash
#
# Bu senaryo, satılabilirlik, belirli bir amaca uygunluk veya ihlal edilmemenin zımni garantileri dahil ancak bunlarla sınırlı olmamak üzere, açık veya zımni hiçbir garanti olmadan "olduğu gibi" sağlanmıştır.
#
# Lisans GPL2
#
# desgua tarafından 2014/04/29

işlevi TEMİZLE {
cd "$ makarna"
[-f test-by-desgua] ve & rm test-by-desgua ve & echo "Temp dosyası kaldırıldı"
yankı "Hoşçakal"
Çıkış 0
}

tuzak 'echo; echo "Aborted" ; TEMİZ; Eko ; çıkış 0 'INT HUP

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

oku -n 1 -p 'Kök ol? [E / h] 'a
    eğer [[$ a == "Y" || $ a == "y" || $ a == ""]]; sonra
        $ 0 $ 1 sudo
        Çıkış 0
    Başka
        Eko "
        Bu betiğin kök ayrıcalığına ihtiyacı var.
        "
        çıkış 1

    fi

fi


name = $ (echo $ 0 | sed 's /.*\///')
eğer [$ # -ne 1]; sonra

Eko "
Kullanım: $ isim / klasör / / test /

"
çıkış 1
fi

makarna = $ 1

read -n 1 -p 'Fstrim kullanıyor musunuz? [y / N] 'a
eğer [[$ a == "Y" || $ a == "y"]]; sonra
    FS = 1
fi

yöntem =
[["$ method"! = "1" && "$ method"! = "2"]]; yap
read -n 1 -s -p 'Bir yöntem seçin:
[1] hdparm (LVM'deki LUKS’ta başarısız olur)
[2] filefrag (uyarı: çıkmaya zorlamak zorunda kalabilirsiniz - terminali kapatın - bazı durumlarda başarılı bitirme durumunda, hiç bitmeyen bir çıktı görürseniz) 
' yöntem
tamam

işlev SDATEST {
disk = $ (fdisk -l | grep / dev / sda)
eğer ["$ disk" == ""]; sonra
Eko "
fdisk bulunamadı / dev / sda 
"
çıkış 1
fi
}

fonksiyon testi {
yankı "Girme /"; Eko
cd $ makarna
echo "$ makarnada test-by-desgua dosyası oluşturma"; Eko
dd eğer = / dev / urandom = sınama-trim-by-desgua sayısı = 10 bs = 512k
echo "Eşitleme ve 2 saniye uyku." ; Eko
senkronizasyon
uyku 2

hdparm - fibmap sınama-desgua testi
lbab = $ (hdparm - fibmap test-trim-by-desgua | tail -n1 | awk '{print $ 2}')

echo "Gördüğünüz gibi, dosya oluşturuldu ve LBA'sı $ lbab'da başlıyor"; Eko

echo "Eşitleme ve 2 saniye uyku." ; Eko
senkronizasyon
uyku 2

echo "Test-trim-by-desgua dosyasının kaldırılması"; Eko
rm testi-trim-by-desgua

tuzak 'echo; Eko ; echo "Aborted" ; Eko ; çıkış 0 'INT
echo "Eşitleme ve 2 saniye uyku." ; Eko
senkronizasyon
uyku 2

eğer [["$ fs" == "1"]]; sonra
    yankı "fstrim $ pasta & & uyku 2"; Eko
    fstrim $ makarna
    uyku 2
fi

echo "Bu, $ lbab sektöründen okunur:"
hdparm --read-sector $ lbab / dev / sda

pass = $ (hdparm - okunan sektör $ lbab / dev / sda | grep "0000 0000 0000 0000")

eğer [[$ pass == ""]]; sonra
    Eko "
Kesim başarısız oldu ... 
Sadece 0000 0000 0000 0000 görmelisin ...
"
Başka
    yankı "Başarı !!!"
fi
Çıkış 0

}

işlev LUKSTEST {
# Referans: /unix/85865/trim-with-lvm-and-dm-crypt#
yankı 1> / proc / sys / vm / drop_caches
cd $ makarna
echo "Bir \" evet \ "dosyası yaratılıyor."
evet | dd iflag = tam blok bs = 1M sayısı = 1 = trim-by-desgua =

# position = `filefrag -s -v Sınama-Döşeme-desgua | grep "eof" | awk '{3 $ yazdır}}'
position = `filefrag -s -v tarafından test-trim-by-desgua | grep "eof" | sed 's | || g; s | * 255:. || ; s |. \ \ .. * || ' `
[["$ position" == ""]] && echo "Dosyanın konumu bulunamadı. LVM’de bir LUKS’ta mısınız?" && TEMİZ;

aygıt = `df sınama-desgua | grep "dev /" | awk '{print $ 1}' `

yes = `dd bs = 4096 atla = $ pozisyon sayısı = 256 ise = $ device | hexdump -C`

echo "Bir sonraki satırda şöyle bir kalıp görmelisin: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy |
$ evet
"

eğer [["` echo "$ evet" | grep "yyy" `" == ""]]; sonra
    echo "Desen kontrol edilemedi. Bir şeyler ters gitti. Çıkılıyor."
    TEMİZ;
Başka
    echo "Desen onaylandı."
fi

echo "Temp dosyasını kaldırma." 
rm testi-trim-by-desgua

echo "Eşitleme".
senkronizasyon
uyku 1

eğer [["$ fs" == "1"]]; sonra
    eko "fstrim -v $ makarna ve & uyku 2"; Eko
    fstrim -v $ makarna
    uyku 2
fi

# Bırak önbellek
yankı 1> / proc / sys / vm / drop_caches

echo "Bir sonraki satırda ** NOT ** şöyle bir evet deseni görmelisiniz: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy | 
Görüyorsanız, o zaman trim çalışmıyor:
`dd bs = 4096 atla = $ pozisyon sayısı = 256 ise = $ device | hexdump -C` "

yes = `dd bs = 4096 atla = $ pozisyon sayısı = 256 ise = $ device | hexdump -C`
if [["` echo "$ evet" | grep "yyy" `"! = ""]]; sonra
    echo "TRIM çalışmıyor."
Başka
    echo "TRIM çalışıyor!"
fi
TEMİZ;
}

eğer [["$ method" == "1"]]; sonra
    SDATEST;
    ÖLÇEK;
elif [["$ method" == "2"]]; sonra
    LUKSTEST;
fi
Çıkış 0

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.