Potong dengan LVM dan dm-crypt

21

Saya mencoba men-setup TRIM dengan LVM dan dm-crypt di ubuntu 13.04 mengikuti tutorial ini:

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

Lihat catatan tentang konfigurasi saya dan prosedur pengujian saya di bawah ini.

Pertanyaan

  1. Apakah ada tes yang andal jika TRIM bekerja dengan baik?

  2. Apakah tes rutin saya salah atau TRIM saya tidak berfungsi?

  3. Jika tidak berfungsi: apa yang salah dengan pengaturan saya?

  4. Bagaimana saya bisa men-debug TRIM untuk pengaturan saya dan membuat TRIM berfungsi?

Konfigurasi

Di sini ist konfigurasi saya:

cat /etc/crypttab

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

dan

cat /etc/lvm/lvm.conf

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

SSD adalah Samsung 840 Pro.

Inilah prosedur pengujian saya

Untuk menguji pengaturan saya baru saja melakukan sudo fstrim -v /yang menghasilkan

/: [...] bytes were trimmed

Melakukan ini lagi menghasilkan /: 0 bytes were trimmedyang tampaknya masuk akal dan menunjukkan bahwa TRIM tampaknya berfungsi.

Namun kemudian saya melakukan tes ini:

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

Ini tampaknya menunjukkan bahwa TRIM tidak berfungsi. Sejak

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

Edit

Berikut ini adalah output dari 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

Ini milik saya /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 

Edit:

Saya akhirnya melaporkannya sebagai bug di https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1213631

Semoga seseorang akan menemukan solusi di sana atau setidaknya menguji pengaturan dan memverifikasi bug.

Memperbarui

Sekarang berfungsi, lihat jawaban yang diterima.

mahasiswa
sumber
LVM tampaknya hilang, seharusnya issue_discardstidak issue discardsjika itu bukan kesalahan ketik. allow_discardsakan muncul di tabel dmsetup untuk partisi LVM.
frostschutz
Maaf, ini salah ketik. Saya miliki issue_discards = 1di file konfigurasi saya.
siswa
Jika saya jadi Anda, saya akan mencoba menggunakan target iSCSI dan menguji ini melalui tcpdump / wireshark untuk melihat apakah pengaturan bekerja, meskipun saya tidak tahu apakah target Linux iSCSI mendukung trim atau tidak. Saya percaya bahwa dm-crypt tidak boleh mengosongkan blok pada disk fisik karena membuatnya lebih mudah untuk mengabaikan ruang kosong pada perangkat ketika mencoba untuk memaksakannya (saya tidak tahu apakah itu melakukan itu atau tidak, meskipun ). Selain itu, SSD tidak diharuskan untuk mengembalikan nol setelah dikosongkan, karena level-keausan dapat mengarahkan bacaan ke blok yang berbeda dari yang kosong.
Didi Kohen
1
Menurut bugzilla.redhat.com/show_bug.cgi?id=958096 Saya salah paham masalah issue_discards = 1.
frostschutz

Jawaban:

23

Saya sarankan menggunakan metode pengujian yang berbeda. hdparmagak aneh karena memberikan alamat perangkat daripada alamat sistem file, dan itu tidak mengatakan perangkat mana yang terkait dengan alamat tersebut (misalnya, ia menyelesaikan partisi, tetapi bukan target devicemapper, dll.). Jauh lebih mudah untuk menggunakan sesuatu yang tetap dengan alamat filesystem, dengan cara itu konsisten (mungkin kecuali untuk filesystem non-tradisional seperti zfs / btrfs).

Buat file uji: (tidak sengaja sengaja)

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

Dapatkan alamat, panjang, dan pemblokiran: (perintah persis tergantung filefragversi)

# 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

Dapatkan perangkat dan titik mount:

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

Dengan pengaturan ini, Anda memiliki file yang trim.testdiisi dengan yes-pola pada /dev/mapper/somethingalamat 34048dengan panjang 256blok 4096byte.

Membaca bahwa dari perangkat secara langsung akan menghasilkan yes-pola:

# 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

Jika TRIM diaktifkan, pola ini akan berubah ketika Anda menghapus file. Perhatikan bahwa cache juga harus dihapus, jika ddtidak , tidak akan membaca kembali data dari disk.

# 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

Pada sebagian besar SSD yang menghasilkan pola nol:

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

Jika enkripsi terlibat, Anda akan melihat pola acak sebagai gantinya:

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

Itu karena dipangkas secara fisik, lapisan kripto membaca nol dan mendekripsi nol itu menjadi data "acak".

Jika yes-pola berlanjut, kemungkinan besar tidak ada pemangkasan telah dilakukan.

frostschutz
sumber
1
@student: Saya merasa tidak enak karena tidak memperhatikan ini sebelumnya, mengedit jawaban untuk menghapus cache sebelumnya hexdump.
frostschutz
1
Terima kasih, itu adalah poin yang hilang. Sekarang sepertinya berhasil!
siswa
2
Saya masih tidak yakin apakah kernel tidak boleh menjatuhkan cache dengan sendirinya setiap kali memotong sesuatu pada SSD. Tembolok tidak seharusnya mengembalikan data yang salah. Ini juga merupakan pemborosan pada memori cache jika ditempati oleh sesuatu yang tidak lagi ada ... oh well.
frostschutz
1
@ frostschutz Terima kasih atas solusi hebat ini. Saya membuat skrip untuk mengotomatiskan proses jika beberapa orang malas datang ke sini.
desgua
1
Pendatang baru , harap dicatat bahwa perintah TRIM tidak akan selalu "nol-isi" blok segera. Lihat di sini , di sini dan di sini . Meskipun harus, dalam kasus OP, karena hdparm -Ihasilnya menunjukkan "Deterministik membaca NOL setelah TRIM".
Marc.2377
3

Rutin pengujian Anda salah — Anda mendapatkan nomor sektor relatif terhadap perangkat blok tempat sistem file berada — yang dalam hal ini adalah volume logis. Volume logis, tentu saja, tidak dimulai pada sektor pertama dari volume fisik (dan bahkan mungkin tidak bersebelahan).

Bahkan jika volume logis dimulai pada sektor 0 dari volume fisik (yang tidak), maka volume fisik sebenarnya adalah target perangkat-mapper lain, ini untuk enkripsi. Dan mungkin ada header LUKS di depan, jadi nomor sektor juga tidak cocok di sana.

Jika Anda ingin bekerja melalui pemetaan nomor sektor ke disk yang mendasarinya, dmsetup tablesakan memberi Anda info yang Anda butuhkan. Jika Anda menempelkannya di sini, pastikan milik Anda adalah versi yang tidak menunjukkan kunci pada output (seharusnya menampilkan semua 0 sebagai gantinya)! (Tidak ada pemulihan dari pengungkapan kuncinya — itu tidak bisa diubah — itu jauh lebih buruk daripada pengungkapan kata sandi).

Saya menyarankan untuk melakukan debug (setelah pemetaan sektor berhasil) Anda mulai dari level terendah, dan konfirmasikan itu berfungsi di sana. TRIM sistem file secara langsung di / dev / sdaX dan pastikan itu berfungsi (sangat mungkin perangkat itu terletak, dan trim tidak membaca nol). Kemudian dm-crypt di atas itu, dan rapikan filesystem itu, dan pastikan itu berfungsi. Akhirnya, letakkan LVM di atas, dan periksa apakah berhasil.

derobert
sumber
@student OK, itu sektor yang salah (dua paragraf pertama dari jawaban saya). Saya akan mengedit jawaban saya untuk menghapus kalimat tentang sektor 6575104, karena tidak relevan lagi.
derobert
Saya tidak yakin perangkat mana yang harus saya pakai dmsetup. Saya baru saja melakukannya: sudo dmsetup table /dev/mapper/lubuntu--vg-rootyang memberi0 465903616 linear 252:0 2048
siswa
@student Itu berarti sektor 0 ada di sektor 2048 pada perangkat 252: 0. Anda harus mencari tahu apa 252: 0 itu, saya kira itu perangkat crypto dm Anda (itu angka utama dan kecil, akan muncul di / dev misalnya). Dan Anda harus melihat tabel untuk perangkat itu, untuk terus mengejar ke blok di perangkat yang mendasarinya.
derobert
3

Ini hanya naskah yang ingin saya bagikan jika ada orang malas datang ke sini. Itu dibuat dari jawaban yang diterima dari frostschutz .

#! / bin / bash
#
# Skrip ini diberikan "sebagaimana adanya" tanpa jaminan dalam bentuk apa pun, baik tersurat maupun tersirat, termasuk, tetapi tidak terbatas pada, jaminan tersirat mengenai kelayakan untuk diperjualbelikan, kesesuaian untuk tujuan tertentu, atau non-pelanggaran.
#
# Lisensi GPL2
#
# oleh desgua 2014/04/29

fungsi BERSIH {
cd "$ pasta"
[-f test-trim-by-desgua] && rm test-trim-by-desgua && echo "Temp file dihapus"
gema "Selamat tinggal"
keluar 0
}

echo trap '; gema "Dibatalkan." ; BERSIH; gema; keluar 0 'INT HUP

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

baca -n 1 -p 'Menjadi root? [Y / n] 'a
    if [[$ a == "Y" || $ a == "y" || $ a == ""]]; kemudian
        sudo $ 0 $ 1
        keluar 0
    lain
        gema "
        Skrip ini membutuhkan hak akses root.
        "
        keluar 1

    fi

fi


name = $ (echo $ 0 | sed 's /.*#///')
if [$ # -ne 1]; kemudian

gema "
Penggunaan: $ name / folder / to / test /

"
keluar 1
fi

pasta = $ 1

baca -n 1 -p 'Gunakan fstrim? [y / T] 'a
if [[$ a == "Y" || $ a == "y"]]; kemudian
    fs = 1
fi

metode =
sementara [["$ method"! = "1" && "$ method"! = "2"]]; melakukan
baca -n 1 -s -p 'Pilih metode:
[1] hdparm (akan gagal dalam LUKS di LVM)
[2] filefrag (peringatan: Anda mungkin harus memaksa berhenti - tutup terminal - dalam beberapa kasus trim berhasil jika Anda melihat output yang tidak pernah berakhir) 
' metode
selesai

function SDATEST {
disk = $ (fdisk -l | grep / dev / sda)
if ["$ disk" == ""]; kemudian
gema "
fdisk tidak ditemukan / dev / sda 
"
keluar 1
fi
}

function TEST {
gema "Masuk /"; gema
cd $ pasta
echo "Membuat file test-trim-by-desgua di $ pasta"; gema
dd jika = / dev / urandom dari = jumlah test-trim-by-desgua = 10 bs = 512k
echo "Menyinkronkan dan tidur 2 detik." ; gema
sinkronkan
tidur 2

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

echo "Seperti yang Anda lihat, file itu dibuat dan LBA-nya dimulai dari $ lbab"; gema

echo "Menyinkronkan dan tidur 2 detik." ; gema
sinkronkan
tidur 2

echo "Menghapus file test-trim-by-desgua"; gema
rm test-trim-by-desgua

echo trap '; gema; gema "Dibatalkan." ; gema; keluar 0 INT
echo "Menyinkronkan dan tidur 2 detik." ; gema
sinkronkan
tidur 2

if [["$ fs" == "1"]]; kemudian
    gema "fstrim $ pasta && sleep 2"; gema
    fstrim $ pasta
    tidur 2
fi

echo "Ini dibaca dari sektor $ lbab:"
hdparm --baca sektor $ lbab / dev / sda

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

if [[$ pass == ""]]; kemudian
    gema "
Trim gagal ... 
Anda hanya akan melihat 0000 0000 0000 0000 ...
"
lain
    gema "Sukses !!!"
fi
keluar 0

}

function LUKSTEST {
# Referensi: /unix/85865/trim-with-lvm-and-dm-crypt#
gema 1> / proc / sys / vm / drop_caches
cd $ pasta
gema "Membuat file \" ya \ "."
ya | dd iflag = blok penuh bs = 1M hitung = 1 dari = test-trim-by-desgua

# position = `filefrag -s -v test-trim-by-desgua | grep "eof" | awk '{print $ 3}' `
position = `filefrag -s -v test-trim-by-desgua | grep "eof" | sed 's | || g; s |. * 255: || ; s | \. \ .. * || '`
[["$ position" == ""]] && echo "Tidak dapat menemukan posisi file. Apakah Anda menggunakan LUKS di LVM?" && BERSIH;

device = `df test-trim-by-desgua | grep "dev /" | awk '{print $ 1}' `

ya = `dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -C`

echo "Pada baris berikutnya Anda akan melihat pola seperti: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy |
$ ya
"

if [["` echo "$ yes" | grep "yyy" `" == ""]]; kemudian
    echo "Polanya tidak bisa diperiksa. Ada yang salah. Keluar."
    BERSIH;
lain
    gema "Pola dikonfirmasi."
fi

echo "Menghapus file temp." 
rm test-trim-by-desgua

echo "Menyinkronkan."
sinkronkan
tidur 1

if [["$ fs" == "1"]]; kemudian
    echo "fstrim -v $ pasta && sleep 2"; gema
    fstrim -v $ pasta
    tidur 2
fi

# Jatuhkan cache
gema 1> / proc / sys / vm / drop_caches

echo "Pada baris selanjutnya Anda harus ** TIDAK ** melihat pola ya seperti: 
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a | yyyyyyyy | 
Jika Anda melihat, maka trim tidak berfungsi:
`dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -C` "

ya = `dd bs = 4096 skip = $ position count = 256 if = $ device | hexdump -C`
if [["` echo "$ yes" | grep "yyy" `"! = ""]]; kemudian
    gema "TRIM tidak berfungsi."
lain
    gema "TRIM bekerja!"
fi
BERSIH;
}

if [["$ method" == "1"]]; kemudian
    TERKECIL;
    UJI;
elif [["$ method" == "2"]]; kemudian
    LUKSTEST;
fi
keluar 0

desgua
sumber