LUKS ile isteğe bağlı büyüyen şifreli birim oluşturma


13

Linux ile şifreli, ihtiyaca göre büyüyen bir dosya sistemi oluşturmaya çalışıyorum. LUKS ve kripto kurulumuna aşinayım.

Boş bir dosya oluşturabilirim:

fallocate -l 512M /root/image

Üzerinde bir LUKS kapsayıcı oluşturabilirsiniz:

cryptsetup -y luksFormat /root/image

Ve sonra "aç":

cryptsetup luksOpen /root/image luksvolume

Bu noktada, üzerinde sadece bir dosya sistemi yapabilirsiniz:

mkfs.ext4 -j /dev/mapper/luksvolume

Bunların hepsi iyi ve züppe. Ancak, sorunun "talep üzerine büyüme" kısmını ele almaz.

Buradaki fikir, şifrelenmiş dosya sistemine bir 2Gb dosyası kopyalamanın, dosyayı içerecek kadar büyük olması için görüntüyü "genişletmesi" dir.

Yapmak bile mümkün mü?


Neden dosya sistemini ilk etapta doğru boyutta yapmıyorsunuz ve çözmeye çalıştığınız problem nedir?
Matthew Ife

3
Bazen bir dosya sistemine ne kadar büyük olmanız gerektiğini bilmezsiniz. Sorun şifrelenmiş bir dosya sisteminde bir dosya olması ve buna gerek kalmadan personele personel ekleyebilmenizdir 1) Alanın bitmesi konusunda endişe 2) TONS kullanılmayan alanın olması. Ayrıca, şifrelenmiş bir dosyayı başka bir yere kopyalayıp yeniden monte edebilmek.
Merc

Yanıtlar:


21

Evet! Mümkün gibi görünüyor. Nasıl elde edilebileceğini kontrol edelim. Bunun gerçek bir isteğe bağlı büyüme dosya sistemi oluşturmadığına dikkat edin, çünkü dosya sistemi seyrek dosyanın maksimum boyutuna ulaştığında, hala daha fazla verinin yazılması gerekiyorsa 'alan dışı' hatalarını rapor edecektir.

Başlangıçta, sanallaştırma senaryolarında depolama alanından tasarruf etmek için iyi bilinen bir teknoloji olan Thin Provisioning'i araştırıyordum . Ne yazık ki, yaygın Linux kullanım durumlarında, sadece LVM ile kullanılabilir gibi görünüyor . Bu, sorunuzun kapsamının biraz dışında göründüğü için başka bir şey aradım.

Araştırdığım ikinci kavram Seyrek Dosyası . Bu, sorunuza tam olarak uygundur ve ... ilk şüphem şuydu: " Tamam. Bir Seyrek Dosya oluşturabilirim. Ama LUKS kapsayıcısı olarak başlattığımda ne olur? Böyle bir başlatma tüm kullanılabilir alanı tahsis eder mi? Dosya sistemini böyle bir kapta başlattığımda ne olacak? mkfs.ext4Mevcut tüm alanı tahsis edecek mi? ". Cevabım olmadığı için denemeye karar verdim. Bakalım neler oldu.

Dosya sisteminizde yalnızca 3.3G boş alanım olan mevcut sistemimden başlayalım/repository :

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

Böyle bir dosya sisteminde 10G seyrek dosyası oluşturalım :

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

ve şunu doğrulayalım ... bu gerçekten seyrek bir dosya:

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

TAMAM. Bu yüzden daha önce 3.3G boş alana sahip bir dosya sisteminde 10G dosyamız var . Hala ne kadar boş alanım var?

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

Hala 3.3G. Güzel. Seyrek dosya gerçekten ... seyrek dosya ;-) Böyle bir 10G dosyası içinde bir LUKS kapsayıcısı oluşturarak ilerleyelim ve ... bakalım yerimiz tükeniyor mu:

 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:~#

Şimdi secretssadece 3.3G boş alana sahip bir dosya sisteminde saklanan 10G seyrek dosyamın üstünde tanımlanan açık bir kapsayıcı var .

Hala ne kadar boş alanım var?

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

Olağanüstü! Hala 3.3GB. Şifrelenmiş konteynerimiz çoğunlukla yer gerektirmiyordu!

Her şeyin yolunda olup olmadığını veya kurulumumuzda garip bir şey olup olmadığını kontrol edelim:

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

Her şey yolunda görünüyor, bu yüzden bir şey saklamak için böyle bir kap kullanmaya başlayalım. İçinde bir EXT4 dosya sistemi oluşturarak başlayalım:

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:~#

Görünüşe göre işe yaradı, çünkü "alan dışı" nın izi yoktu. Hadi kontrol edelim:

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

Hımm ... bir şey oldu. EXT4 dosya sistemi yaratılması: Biz beklenen bir davranıştır .... uzayın 100M gibi bir şey kaybetti ama DO meta kura yazma gerektirir. Bu nedenle, yaratım süreci tarafından bir miktar alanın kullanılması normaldir.

"Çalışan" bir EXT4 dosya sistemi mi?

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

Evet! Tamam görünüyor.

Şimdi 3.3G dosya sisteminde saklanan 10G seyrek dosyanın üstünde tanımlanan bir açık LUKS kapsayıcısının içine yazılmış bir EXT4 dosya sistemimiz var.

Bakalım her şey düzgün çalışıyor mu, "isteğe bağlı" alan ayırarak.

Şifrelenmiş FS'ye 500M sahte veri yazarak başlayalım

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:~#

Dosyayı oluşturmakta başarılı olduk mu?

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

Öyle görünüyor.

Gerçek dosya sistemimize ne oldu?

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

Uau! 500 milyondan fazla kaybettik. Bu iyi, BTW, fiziksel alan gerçekten talep üzerine tahsis edildiğinden!

Şimdi başka bir 2GB dosya depolayalım:

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:~#

Ne oldu?

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:~#

Gerçekten hoş. Bir dosyayı silersek ne olur?

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:~#

Beklendiği gibi, seyrek dosyada davranış tam olarak ince provizyona benzer: ayrıldıktan sonra dosya silindiğinde depolama alanı geri talep edilemez. Ama bu genel olarak sorun değil. Değil mi?

Bu noktada, sorunuzun cevabı eksiksiz olmalıdır. Sağ?


İlave:

Altı çizili depolama alanı dolduğunda ne olacağını görelim:

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:~#

Ne? başarılı olmuş gibi görünüyor! Bu nasıl mümkün oldu? Hadi kontrol edelim!

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:~#

Hmm ... Tamam görünüyor. Emin miyiz?

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

alanımız bitti! Herhangi bir hata olmadan!

Gerçekte ne olduğunu araştırmak güzel olsa bile ... Bunu diğer ServerFault üyelerinin merakına ve / veya sorun giderme becerilerine bırakacağım ;-)

İyi eğlenceler!


BTW: Yukarıdakilerin tümünü test ettim, burada:

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:~#

Bu komutların çalışması için kök olmanız gerektiğini fark ettim. Seyrek dosyalar için her zaman böyle mi?
Merc

No.Sorry. Ana klasör üzerinde düzgün yazma izni verildiğinde normal kullanıcı olarak da çalışmalıdırlar.
Damiano Verzulli

Bu harika cevap için teşekkürler. Bana bir soru ve endişe bırakıyor. Endişe: Gerçekten boş yer olmadığında ikinci 2GB dosyasını başarıyla yazmış gibi mi yapıyorsunuz? Sorun yaratır ... Tekrar okumaya çalıştığınızda ne olur (sha1sum falan ile)? Soru: Ağdaki seyrek bir dosyayı yedeklemenin bir yolu var mı (yani yalnızca kullanılan parçaları kopyalar)?
Thilo

Daha fazla araştırmaya cazip geldim ama .... ne yazık ki zamanında kısaydım ve gerçekten de başka bir SF sorusu için geçerli bir alan. Her neyse, genel depolama alanınızı overbooking ile kolayca önlenebilir: Yani, seyrek dosyalar oluşturabilirsiniz, ancak ... böylece fiziksel diskinize maksimum toplam ayrılabilir alan sığdırmak için. Değil mi? Bunun yerine, "overbooking" çözümleri arıyorsanız .... belki başka bir şey araştırılması gerekir (LVM?)
Damiano Verzulli

@Thilo Sessizce taşan dosyayı okumaya çalışırsanız ne olacağını merak ediyorum. rsync, --sparsehedef diskte seyrek dosyalar oluşturması gereken bir seçeneğe sahiptir .
localhost
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.