LUKS के साथ बढ़ती मांग पर एन्क्रिप्टेड वॉल्यूम बनाना


13

मैं लिनक्स के साथ एक एन्क्रिप्टेड, बढ़ते-बढ़ते-आवश्यक फ़ाइल सिस्टम बनाने की कोशिश कर रहा हूं। मैं LUKS और cryptsetup से परिचित हूं।

मैं एक खाली फाइल बना सकता हूं:

fallocate -l 512M /root/image

मैं इस पर एक LUKS कंटेनर बना सकता हूं:

cryptsetup -y luksFormat /root/image

और फिर इसे "खोलें":

cryptsetup luksOpen /root/image luksvolume

इस बिंदु पर, मैं बस इस पर एक फ़ाइल सिस्टम बना सकता हूं:

mkfs.ext4 -j /dev/mapper/luksvolume

यह सब ठीक है और बांका है। हालाँकि, यह प्रश्न के "विकास-ऑन-डिमांड" भाग को संबोधित नहीं करता है।

विचार यह है कि एन्क्रिप्टेड फ़ाइल सिस्टम पर 2Gb फ़ाइल की प्रतिलिपि बनाने से छवि का "विस्तार" होगा ताकि यह फ़ाइल को शामिल करने के लिए पर्याप्त बड़ा हो।

क्या ऐसा करना संभव भी है?


फाइलसिस्टम को पहले स्थान पर सही आकार क्यों नहीं दिया गया और आप किस समस्या को हल करने की कोशिश कर रहे हैं?
मैथ्यू इफ

3
कभी-कभी आपको नहीं पता होता है कि आपको फ़ाइल सिस्टम की कितनी बड़ी आवश्यकता है। समस्या एक एन्क्रिप्टेड फ़ाइल सिस्टम पर एक फ़ाइल हो रही है, और 1 में बिना स्टाफ को जोड़ने में सक्षम हो रही है) अंतरिक्ष 2 के बारे में चिंता करें) अप्रयुक्त स्थान के टन होने। साथ ही, उस एन्क्रिप्टेड फ़ाइल को कहीं और कॉपी करने और उसे रिमूव करने में सक्षम होने के नाते।
Merc

जवाबों:


21

हाँ! ऐसा लग रहा है कि यह संभव है। आइए देखें कि इसे कैसे प्राप्त किया जा सकता है। ध्यान दें कि यह एक वास्तविक ग्रो-ऑन-डिमांड फाइल सिस्टम नहीं बनाता है, क्योंकि जब फाइल सिस्टम स्पार्स फाइल के अधिकतम आकार तक पहुंच जाता है, तो यह 'आउट ऑफ स्पेस' त्रुटियों की रिपोर्ट करेगा यदि अधिक डेटा अभी भी लिखने की आवश्यकता है।

प्रारंभ में, मैं वर्चुअलाइजेशन परिदृश्यों में भंडारण स्थान को बचाने के लिए एक प्रसिद्ध तकनीक थिन प्रोविजनिंग की जांच कर रहा था । दुर्भाग्य से, सामान्य लिनक्स उपयोग-मामलों में, यह केवल एलवीएम के साथ उपलब्ध लगता है । जैसा कि यह आपके प्रश्न के दायरे से थोड़ा बाहर लगता है, मैंने कुछ और खोजा।

दूसरी अवधारणा जिसकी मैंने जांच की वह स्पार्स फाइल है । यह आपके प्रश्न के बिल्कुल अनुकूल है और ... मेरा प्रारंभिक संदेह था: " ठीक है। मैं एक स्पार्स फ़ाइल बना सकता हूं। लेकिन क्या होता है जब मैं इसे LUKS कंटेनर के रूप में इनिशियलाइज़ करता हूं? क्या इस तरह के इनिशियलाइज़ेशन से सभी उपलब्ध स्पेस को आवंटित किया जा सकता है? यदि नहीं। क्या होगा जब मैं इस तरह के कंटेनर में फाइलसिस्टम को इनिशियलाइज़ करूँगा? क्या mkfs.ext4सभी उपलब्ध स्पेस को आवंटित करेगा ? "। जैसा कि मेरे पास कोई जवाब नहीं था, मैंने कोशिश करने का फैसला किया। तो, आइए देखें कि क्या हुआ।

आइए अपने वर्तमान सिस्टम से शुरू करें, जहाँ मेरे पास फाइल सिस्टम के भीतर केवल 3.3G खाली जगह है /repository:

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

आइए ऐसे फाइलसिस्टम के भीतर 10G विरल-फाइल बनाएं , जिसके साथ:

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

और सत्यापित करें कि ... यह वास्तव में एक विरल फ़ाइल है:

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

ठीक। तो हमारे पास एक 10G फाइल है, एक फाइलसिस्टम में जो पहले 3.3G की खाली जगह थी। अभी भी मेरे पास कितना खाली स्थान है?

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

अभी भी 3.3 जी। अच्छा लगा। विरल-फ़ाइल वास्तव में हैं ... विरल-फाइल ;-) ऐसी 10G फ़ाइल के भीतर LUKS कंटेनर बनाकर आगे बढ़ते हैं और ... देखते हैं कि क्या हम अंतरिक्ष से बाहर भागते हैं:

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

तो अब मेरे पास एक खुला हुआ secretsकंटेनर है जो मेरे 10G विरल-फ़ाइल के शीर्ष पर परिभाषित है जो एक फाइल सिस्टम में संग्रहीत है जिसमें केवल 3.3G मुक्त स्थान है।

अभी भी मेरे पास कितना खाली स्थान है?

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

आश्चर्यजनक! अभी भी 3.3GB। हमारे एन्क्रिप्टेड कंटेनर को ज्यादातर जगह की आवश्यकता नहीं थी!

आइए देखें कि क्या सब कुछ ठीक है या हमारे सेटअप के साथ कुछ अजीब है:

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

सब कुछ ठीक लगता है तो चलो कुछ को स्टोर करने के लिए ऐसे कंटेनर का उपयोग करना शुरू करें। चलिए इसके अंदर एक EXT4 फाइल सिस्टम बनाकर शुरू करते हैं:

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

ऐसा लगता है कि यह काम किया है, क्योंकि "अंतरिक्ष से बाहर" का कोई ट्रैक नहीं था। चलो देखते है:

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

उम्म .... तो कुछ हुआ। हम अंतरिक्ष के 100M की तरह कुछ खो दिया है लेकिन .... यह एक अपेक्षित व्यवहार है: ext4 फाइलसिस्टम के निर्माण डीओ मेटाडाटा के बहुत सारे के लेखन की आवश्यकता है। इसलिए यह सामान्य है कि कुछ जगह का उपयोग निर्माण प्रक्रिया द्वारा किया गया है।

यह एक "काम" EXT4 फाइल सिस्टम है?

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

हाँ! यह ठीक लग रहा है।

तो अब हमारे पास एक EXT4 फाइल सिस्टम है, जो एक खुले LUKS कंटेनर के अंदर लिखा है, जो कि एक 10G स्पार्स-फाइल के शीर्ष पर परिभाषित है, जो 3.3G फाइलसिस्टम में संग्रहीत है।

चलो देखते हैं कि क्या सब कुछ सही ढंग से काम करता है, अंतरिक्ष "ऑन-डिमांड" आवंटित करके।

आइए एन्क्रिप्टेड एफएस पर 500 मिमी डमी डेटा लिखकर शुरू करें

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

क्या हम फाइल बनाने में सफल रहे हैं?

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

ऐसा लग रहा है।

हमारे वास्तविक फाइल सिस्टम का क्या हुआ?

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

Uau! हमने 500 मीटर से अधिक "खो" दिया। यह अच्छा है, BTW, क्योंकि भौतिक स्थान वास्तव में मांग पर आवंटित किया गया है!

चलिए एक और 2GB फाइल स्टोर करते हैं:

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

क्या हुआ?

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

बहुत अच्छे। यदि हम कोई फ़ाइल हटाते हैं तो क्या होता है?

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

जैसा कि अपेक्षित था, विरल-फ़ाइल के साथ व्यवहार बिल्कुल पतले-प्रावधान जैसा होता है: एक बार आवंटित होने के बाद, फ़ाइल को हटाए जाने पर भंडारण-स्थान का दावा नहीं किया जा सकता है। लेकिन यह, सामान्य रूप से, ठीक है। क्या तुम नहीं?

तो इस बिंदु पर, आपके प्रश्न का उत्तर पूर्ण होना चाहिए। सही?


इसके अलावा:

आइए देखें कि जब अंडरलाइनिंग स्टोरेज फुल हो जाता है तो क्या होता है:

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

क्या? ऐसा लगता है कि यह succeded है! यह कैसे संभव हुआ है? चलो देखते है!

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

बेनाम: उम्म ... यह ठीक लग रहा है। क्या हमें यकीन है?

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

हम अंतरिक्ष से बाहर भाग चुके हैं! बिना किसी त्रुटि के!

यहां तक ​​कि अगर यह जांच करने के लिए अच्छा होगा कि वास्तव में क्या हुआ ... मैं इसे आपकी जिज्ञासा और / या अन्य सर्वरफॉल्ट सदस्यों के कौशल का निवारण करने जा रहा हूं;;

मज़े करो!


BTW: मैंने उपरोक्त सभी का परीक्षण किया है:

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

मैंने देखा कि आपको उन कमांड के लिए काम करना होगा। क्या विरल फाइलों के लिए हमेशा ऐसा ही होता है?
Merc

कोई खेद नहीं। उन्हें सामान्य उपयोगकर्ता के रूप में अच्छी तरह से काम करना चाहिए, मुख्य फ़ोल्डर पर उचित लिखित अनुमति दी गई है।
डेमियानो वेरज़ुल्ली

इस बेहतरीन जवाब के लिए धन्यवाद। एक सवाल और एक चिंता के साथ मुझे छोड़ देता है। चिंता: जब उस के लिए वास्तव में कोई जगह नहीं थी, तो उस दूसरी 2GB फ़ाइल को सफलतापूर्वक लिखा जाना चाहिए? समस्या ... क्या होता है जब आप इसे वापस पढ़ने की कोशिश करते हैं (sha1sum या कुछ के साथ)? प्रश्न: क्या पूरे नेटवर्क में एक विरल फ़ाइल का बैकअप लेने के तरीके हैं जो इसे विरल रखता है (यानी केवल वास्तव में उपयोग किए जाने वाले भागों को कॉपी करता है)?
थिलो

मुझे भविष्य की जांच करने का लालच दिया गया था .... लेकिन दुर्भाग्य से मैं समय पर छोटा था और वास्तव में, यह निश्चित रूप से एक अलग एसएफ प्रश्न के लिए मान्य स्थान है। वैसे भी, यह आपके समग्र भंडारण को ओवरबुक नहीं करने से आसानी से बचा जा सकता है: मेरा मतलब है, आप विरल-फाइलें बना सकते हैं, लेकिन ... ताकि आपके फिशिकल डिस्क में अधिकतम कुल आवंटन योग्य स्थान फिटिंग हो। क्या तुम नहीं? यदि, इसके बजाय, आप "ओवरबुकिंग" समाधान खोज रहे हैं .... शायद कुछ और जांच की जाए (LVM?)
डेमियानो वेरज़ुल्ली

@ थिलो मैं भी उत्सुक हूं कि यदि आपने उस फ़ाइल को पढ़ने की कोशिश की जो चुपचाप बह निकले। rsyncएक --sparseविकल्प है जो गंतव्य डिस्क पर विरल फ़ाइलें बनाना चाहिए।
लोकलहोस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.