Membuat volume terenkripsi sesuai permintaan dengan LUKS

13

Saya mencoba membuat sistem file terenkripsi, tumbuh sesuai kebutuhan dengan Linux. Saya kenal dengan LUKS dan cryptsetup.

Saya dapat membuat file kosong:

fallocate -l 512M /root/image

Saya dapat membuat wadah LUKS di atasnya:

cryptsetup -y luksFormat /root/image

Dan kemudian "buka" itu:

cryptsetup luksOpen /root/image luksvolume

Pada titik ini, saya bisa membuat sistem file di atasnya:

mkfs.ext4 -j /dev/mapper/luksvolume

Ini semua bagus dan keren. Namun, itu tidak membahas bagian "tumbuh sesuai permintaan" dari pertanyaan.

Idenya adalah bahwa menyalin file 2Gb pada sistem file terenkripsi akan "memperluas" gambar sehingga cukup besar untuk memuat file tersebut.

Apakah mungkin untuk melakukannya?

Merc
sumber
Mengapa tidak membuat filesystem dengan ukuran yang tepat di tempat pertama dan masalah apa yang Anda coba selesaikan?
Matthew Ife
3
Terkadang Anda tidak tahu seberapa besar Anda membutuhkan sistem file. Masalahnya adalah memiliki satu file pada sistem file terenkripsi, dan mampu menambah staf tanpa harus 1) Khawatir tentang kehabisan ruang 2) Memiliki TON ruang yang tidak terpakai. Plus, bisa menyalin satu file yang dienkripsi ke tempat lain dan mengirimnya kembali.
Merc

Jawaban:

21

Iya! Sepertinya itu mungkin. Mari kita periksa bagaimana itu bisa dicapai. Perhatikan bahwa ini tidak membuat sistem file grow-on-demand sejati, karena ketika filesystem mencapai ukuran maksimum file jarang, itu akan melaporkan kesalahan 'di luar ruang' jika lebih banyak data masih perlu ditulis.

Awalnya, saya menyelidiki Thin Provisioning , sebuah teknologi terkenal untuk menghemat ruang penyimpanan dalam skenario virtualisasi. Sayangnya, dalam kasus penggunaan Linux yang umum, tampaknya hanya tersedia dengan LVM . Karena ini tampaknya sedikit di luar cakupan pertanyaan Anda, saya mencari sesuatu yang lain.

Konsep kedua yang saya selidiki adalah File Jarang . Ini persis sesuai dengan pertanyaan Anda dan ... keraguan awal saya adalah: " Oke. Saya dapat membuat File Jarang. Tetapi apa yang terjadi ketika saya menginisialisasi sebagai wadah LUKS? Apakah inisialisasi tersebut akan mengalokasikan semua ruang yang tersedia? Jika tidak, apa yang akan terjadi ketika saya akan menginisialisasi sistem file dalam wadah seperti itu? Apakah akan mkfs.ext4mengalokasikan semua ruang yang tersedia? " Karena saya tidak punya jawaban, saya memutuskan untuk mencoba. Jadi, mari kita lihat apa yang terjadi.

Mari kita mulai dari sistem saya saat ini, di mana saya hanya memiliki ruang kosong 3.3G dalam sistem /repositoryfile:

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,3G  99% /repository

Mari kita buat file 10G jarang dalam sistem file seperti itu, dengan:

root@iMac-Chiara:~# dd of=/repository/file_container.img bs=1G count=0 seek=10
0+0 record dentro
0+0 record fuori
0 byte (0 B) copiati, 0,000119606 s, 0,0 kB/s

dan mari kita verifikasi bahwa ... ini benar-benar file yang jarang:

root@iMac-Chiara:~# ls -lh /repository/file_container.img 
-rw-r--r-- 1 root root 10G dic 12 19:48 /repository/file_container.img

BAIK. Jadi kita memiliki file 10G , dalam sistem file yang sebelumnya memiliki ruang kosong 3,3G. Berapa banyak ruang kosong yang saya miliki?

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,3G  99% /repository

Masih 3.3G. Bagus. File jarang benar-benar ... file jarang ;-) Mari selangkah lebih maju, dengan membuat wadah LUKS dalam file 10G dan ... mari kita lihat apakah kita kehabisan ruang:

 root@iMac-Chiara:~# losetup /dev/loop0 /repository/file_container.img
 root@iMac-Chiara:~# cryptsetup -y luksFormat /dev/loop0

 WARNING!
 ========
 Ciò sovrascriverà i dati in /dev/loop0 in modo irreversibile.

 Are you sure? (Type uppercase yes): YES
 Inserire la passphrase LUKS: 
 Verify passphrase: 
 root@iMac-Chiara:~# cryptsetup luksOpen /dev/loop0 secretfs
 Inserire la passphrase per /dev/loop0: 
 root@iMac-Chiara:~#

Jadi sekarang saya memiliki secretswadah terbuka yang ditetapkan di atas file jarang 10G saya yang disimpan dalam sistem file yang hanya memiliki ruang kosong 3,3G.

Berapa banyak ruang kosong yang saya miliki?

 root@iMac-Chiara:~# df -h /repository
 File system     Dim. Usati Dispon. Uso% Montato su
 /dev/sda3       275G  258G    3,3G  99% /repository

Hebat! Masih 3.3GB. Wadah terenkripsi kami sebagian besar tidak membutuhkan ruang!

Mari kita periksa apakah semuanya baik-baik saja atau ada sesuatu yang aneh dengan pengaturan kami:

root@iMac-Chiara:~# cryptsetup status secretfs
/dev/mapper/secretfs is active.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /repository/file_container.img
  offset:  4096 sectors
  size:    20967424 sectors
  mode:    read/write

Semuanya tampak baik-baik saja jadi mari kita mulai menggunakan wadah seperti itu untuk menyimpan sesuatu. Mari kita mulai dengan membuat sistem file EXT4 di dalamnya:

root@iMac-Chiara:~# mkfs.ext4 /dev/mapper/secretfs 
mke2fs 1.42.5 (29-Jul-2012)
Etichetta del filesystem=
OS type: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2620928 blocks
131046 blocks (5.00%) reserved for the super user
Primo blocco dati=0
Maximum filesystem blocks=2684354560
80 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
8192 inode per gruppo
Backup del superblocco salvati nei blocchi: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: fatto                           
Scrittura delle tavole degli inode: fatto                           
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto

root@iMac-Chiara:~#

Sepertinya itu berhasil, karena tidak ada jejak "di luar angkasa". Mari kita periksa:

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,2G  99% /repository

Uhm .... jadi sesuatu terjadi. Kami kehilangan sekitar 100M ruang tetapi .... ini adalah perilaku yang diharapkan: pembuatan sistem file EXT4 DO memerlukan penulisan banyak metadata. Jadi wajar jika beberapa ruang telah digunakan oleh proses pembuatan.

Apakah itu sistem file EXT4 "yang berfungsi"?

root@iMac-Chiara:~# tune2fs -l /dev/mapper/secretfs
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          e63321c3-cee7-478d-a6af-cbdcaf1be1f7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              655360
Block count:              2620928
Reserved block count:     131046
Free blocks:              2541265
Free inodes:              655349
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      639
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Dec 12 19:58:05 2015
Last mount time:          n/a
Last write time:          Sat Dec 12 19:58:05 2015
Mount count:              0
Maximum mount count:      -1
Last checked:             Sat Dec 12 19:58:05 2015
Check interval:           0 (<none>)
Lifetime writes:          131 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      c8b3bf1b-9f05-4267-85d3-2ecfdbaa6dc3
Journal backup:           inode blocks

Iya! Ini terlihat oke.

Jadi sekarang kita memiliki sistem file EXT4 yang ditulis di dalam wadah LUKS terbuka yang didefinisikan di atas file jarang 10G yang disimpan dalam sistem file 3.3G.

Mari kita lihat apakah semuanya bekerja dengan benar, dengan mengalokasikan ruang "sesuai permintaan".

Mari kita mulai dengan menulis 500 juta data boneka ke FS terenkripsi

root@iMac-Chiara:~# mkdir /mnt/temp
root@iMac-Chiara:~# mount /dev/mapper/secretfs /mnt/temp
root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/random_data.bin bs=1M count=512
512+0 record dentro
512+0 record fuori
536870912 byte (537 MB) copiati, 2,35214 s, 228 MB/s
root@iMac-Chiara:~#

Sudahkah kita berhasil membuat file?

root@iMac-Chiara:~# ls -lh /mnt/temp/random_data.bin 
-rw-r--r-- 1 root root 512M dic 12 20:09 /mnt/temp/random_data.bin

Terlihat begitu.

Apa yang terjadi pada sistem file kita yang sebenarnya?

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  259G    2,5G 100% /repository

Uau! Kami "kehilangan" sligthly lebih dari 500 juta. Itu bagus, BTW, karena ruang fisik benar-benar dialokasikan sesuai permintaan!

Mari kita simpan file 2GB lainnya:

root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/another_random_data.bin bs=1G count=2
2+0 record dentro
2+0 record fuori
2147483648 byte (2,1 GB) copiati, 25,6539 s, 83,7 MB/s
root@iMac-Chiara:~#

Apa yang terjadi?

root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 2,6G
-rw-r--r-- 1 root root 512M dic 12 20:09 random_data.bin
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:12 .
root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  261G    484M 100% /repository
root@iMac-Chiara:~#

Sangat bagus. Apa yang terjadi jika kami menghapus file?

root@iMac-Chiara:~# rm /mnt/temp/random_data.bin 
root@iMac-Chiara:~# sync
root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 2,1G
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:14 .
root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  261G    484M 100% /repository
root@iMac-Chiara:~#

Seperti yang diharapkan, dengan file-sparse perilaku persis seperti penyediaan tipis: sekali dialokasikan, ruang penyimpanan tidak dapat diklaim kembali ketika file dihapus. Tapi ini, secara umum, tidak masalah. Bukan?

Jadi pada titik ini, jawaban atas pertanyaan Anda harus lengkap. Baik?


Tambahan:

Mari kita lihat apa yang terjadi ketika penyimpanan garis bawah menjadi penuh:

root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/a_third_random_data.bin bs=1G count=2
2+0 record dentro
2+0 record fuori
2147483648 byte (2,1 GB) copiati, 26,7142 s, 80,4 MB/s
root@iMac-Chiara:~#

Apa? sepertinya berhasil! Bagaimana ini bisa terjadi? Mari kita periksa!

root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 4,1G
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:17 a_third_random_data.bin
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:17 .
root@iMac-Chiara:~#

Uhm ... Kelihatannya ok. Apakah kita yakin

root@iMac-Chiara:~# df /repository
File system    1K-blocchi     Usati Disponib. Uso% Montato su
/dev/sda3       288110208 275070448         0 100% /repository

kita kehabisan ruang! Tanpa kesalahan!

Bahkan jika akan lebih baik untuk menyelidiki apa yang sebenarnya terjadi ... Saya akan menyerahkan ini pada keingintahuan Anda dan / atau keterampilan pemecahan masalah anggota ServerFault lainnya ;-)

Selamat bersenang-senang!


BTW: Saya sudah menguji semua hal di atas, di sini:

root@iMac-Chiara:~# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.04
DISTRIB_CODENAME=raring
DISTRIB_DESCRIPTION="Ubuntu 13.04"
root@iMac-Chiara:~# uname -r
3.8.0-31-generic
root@iMac-Chiara:~# dpkg -l cryptsetup-bin
[...]
ii  cryptsetup-bin             2:1.4.3-4ubuntu2   amd64              disk encryption support - command line tools
root@iMac-Chiara:~#
Damiano Verzulli
sumber
Saya perhatikan bahwa Anda harus menjadi root agar perintah itu berfungsi. Apakah itu selalu terjadi untuk file jarang?
Merc
Tidak, maaf. Mereka harus berfungsi sebagai pengguna biasa juga, diberi izin menulis yang tepat pada folder utama.
Damiano Verzulli
Terima kasih atas jawaban yang bagus ini. Meninggalkan saya dengan pertanyaan dan kekhawatiran. Khawatir: Berpura-pura berhasil menulis file 2GB kedua ketika benar-benar tidak ada ruang untuk itu? Mengganggu ... Apa yang terjadi ketika Anda mencoba membacanya kembali (dengan sha1sum atau sesuatu)? Pertanyaan: Apakah ada cara untuk mencadangkan file jarang di seluruh jaringan yang membuatnya jarang (yaitu hanya benar-benar menyalin bagian yang digunakan)?
Thilo
Saya tergoda untuk menyelidiki lebih lanjut tetapi .... sayangnya saya kekurangan waktu dan, memang, ini jelas merupakan ruang yang valid untuk pertanyaan SF lain yang berbeda. Pokoknya, hal itu dapat dengan mudah dihindari dengan tidak melakukan overbooking terhadap keseluruhan penyimpanan Anda: Maksud saya, Anda dapat membuat file-file yang jarang tetapi ... jadi untuk memiliki ruang pengalokasian total maksimum yang maksimum dalam disk fisik Anda. Bukan? Sebaliknya, jika Anda mencari solusi "overbooking" .... daripada mungkin sesuatu yang lain harus diselidiki (LVM?)
Damiano Verzulli
@Thilo Saya juga ingin tahu apa yang akan terjadi jika Anda mencoba membaca file yang secara diam-diam meluap. rsyncmemiliki --sparseopsi yang seharusnya membuat file jarang pada disk tujuan.
localhost