Tạo khối lượng mã hóa tăng trưởng theo yêu cầu với LUKS


12

Tôi đang cố gắng tạo ra một hệ thống tệp được mã hóa, đang phát triển khi cần với Linux. Tôi quen thuộc với LUKS và cryptsetup.

Tôi có thể tạo một tập tin trống:

fallocate -l 512M /root/image

Tôi có thể tạo một thùng chứa LUKS trên đó:

cryptsetup -y luksFormat /root/image

Và sau đó "mở" nó:

cryptsetup luksOpen /root/image luksvolume

Tại thời điểm này, tôi chỉ có thể tạo một hệ thống tệp trên đó:

mkfs.ext4 -j /dev/mapper/luksvolume

Đây là tất cả tốt đẹp và bảnh bao. Tuy nhiên, nó không giải quyết phần "tăng trưởng theo yêu cầu" của câu hỏi.

Ý tưởng là sao chép tệp 2Gb trên hệ thống tệp được mã hóa sẽ "mở rộng" hình ảnh để nó đủ lớn để chứa tệp.

Nó thậm chí có thể làm được?


Tại sao không làm cho hệ thống tập tin có kích thước phù hợp ngay từ đầu và vấn đề là bạn đang cố gắng giải quyết vấn đề gì?
Matthew Ife

3
Đôi khi bạn không biết bạn cần một hệ thống tập tin lớn đến mức nào. Vấn đề là có một tệp trên hệ thống tệp được mã hóa và có thể thêm nhân viên vào đó mà không phải 1) Lo lắng về không gian hết 2) Có TẤN không gian không sử dụng. Thêm vào đó, có thể sao chép một tập tin được mã hóa ở một nơi khác và gửi lại nó.
Merc

Câu trả lời:


20

Đúng! Có vẻ như nó có thể. Hãy kiểm tra làm thế nào nó có thể đạt được. Lưu ý rằng điều này không tạo ra một hệ thống tệp theo yêu cầu tăng trưởng thực sự, vì khi hệ thống tệp đạt kích thước tối đa của tệp thưa thớt, nó sẽ báo cáo lỗi 'hết dung lượng' nếu vẫn cần ghi thêm dữ liệu.

Ban đầu, tôi đang nghiên cứu Thin Granting , một công nghệ nổi tiếng để tiết kiệm không gian lưu trữ trong các tình huống ảo hóa. Thật không may, trong các trường hợp sử dụng Linux phổ biến, nó dường như chỉ khả dụng với LVM . Vì điều này có vẻ hơi ngoài phạm vi câu hỏi của bạn, tôi đã tìm kiếm thứ khác.

Khái niệm thứ hai tôi đã điều tra là Spzzy File . Điều này hoàn toàn phù hợp với câu hỏi của bạn và ... nghi ngờ ban đầu của tôi là: " OK. Tôi có thể tạo một tệp thưa. Nhưng điều gì xảy ra khi tôi khởi tạo nó dưới dạng thùng chứa LUKS? Việc khởi tạo như vậy có phân bổ tất cả không gian có sẵn không? Nếu không, Điều gì sẽ xảy ra khi tôi sẽ khởi tạo hệ thống tập tin trong một thùng chứa như vậy? Sẽ mkfs.ext4phân bổ tất cả không gian có sẵn? ". Vì không có câu trả lời, tôi quyết định thử. Vì vậy, hãy xem những gì đã xảy ra.

Hãy bắt đầu từ hệ thống hiện tại của tôi, nơi tôi chỉ có 3,3G dung lượng trống trong /repositoryhệ thống tệp:

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

Hãy tạo một tệp thưa thớt 10G trong một hệ thống tệp như vậy, với:

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

và hãy xác minh rằng ... nó thực sự là một tệp thưa thớt:

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

ĐỒNG Ý. Vì vậy, chúng tôi có một tệp 10G , trong một hệ thống tệp trước đây có 3,3G không gian trống. Tôi còn bao nhiêu không gian trống?

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

Vẫn 3,3G. Đẹp. Tệp thưa thớt thực sự là ... tệp thưa thớt ;-) Hãy tiến lên phía trước, bằng cách tạo một thùng chứa LUKS trong tệp 10G như vậy và ... hãy xem liệu chúng ta có hết dung lượng không:

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

Vì vậy, bây giờ tôi có một secretsthùng chứa đã mở được xác định trên đầu tệp thưa thớt 10G của tôi được lưu trữ trong một hệ thống tệp chỉ có 3,3G không gian trống.

Tôi còn bao nhiêu không gian trống?

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

Tuyệt vời! Vẫn 3,3GB. Container mã hóa của chúng tôi yêu cầu chủ yếu là không có không gian!

Hãy kiểm tra xem mọi thứ có ổn không hoặc nếu có gì lạ với thiết lập của chúng tôi:

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

Mọi thứ có vẻ ổn, vì vậy hãy bắt đầu sử dụng một thùng chứa như vậy để lưu trữ một cái gì đó. Hãy bắt đầu bằng cách tạo một hệ thống tệp EXT4 bên trong nó:

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

Có vẻ như nó hoạt động, vì không có dấu vết của "ngoài không gian". Hãy kiểm tra:

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

Uhm .... vậy là có chuyện xảy ra. Chúng tôi đã mất khoảng 100 triệu dung lượng nhưng .... đó là một hành vi được mong đợi: việc tạo ra hệ thống tập tin EXT4 DO yêu cầu viết rất nhiều siêu dữ liệu. Vì vậy, thật bình thường khi một số không gian đã được sử dụng bởi quá trình tạo.

Đây có phải là một hệ thống tập tin EXT4 "làm việc" không?

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

Đúng! Có vẻ ổn

Vì vậy, bây giờ chúng ta có một hệ thống tệp EXT4 được viết bên trong một thùng chứa LUKS đã mở được xác định ở trên cùng của tệp thưa thớt 10G được lưu trữ trong hệ thống tệp 3.3G.

Hãy xem liệu mọi thứ hoạt động chính xác, bằng cách phân bổ không gian "theo yêu cầu".

Hãy bắt đầu bằng cách ghi 500 triệu dữ liệu giả vào FS được mã hóa

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

Chúng tôi đã thành công trong việc tạo tập tin?

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

Có vẻ như vậy.

Điều gì đã xảy ra với hệ thống tập tin thực sự của chúng tôi?

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

Ơ! Chúng tôi "mất" hơn 500 triệu. Điều đó thật tốt, BTW, vì không gian vật lý thực sự được phân bổ theo yêu cầu!

Hãy lưu trữ tệp 2GB khác:

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

Chuyện gì đã xảy ra?

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

Thực sự tốt đẹp. Điều gì xảy ra nếu chúng ta xóa một tập tin?

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

Như mong đợi, với tệp thưa thớt, hành vi giống hệt như cung cấp mỏng: một khi được phân bổ, không gian lưu trữ có thể được lấy lại khi tệp bị xóa. Nhưng điều này, nói chung, là OK. Không bạn

Vì vậy, tại thời điểm này, câu trả lời cho câu hỏi của bạn nên được hoàn thành. Đúng?


Thêm vào:

Hãy xem điều gì xảy ra khi bộ lưu trữ gạch chân bị đầy:

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

Gì? có vẻ như nó bị khuất phục! Làm thế nào điều này đã có thể? Hãy kiểm tra!

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 ... Có vẻ ổn. Chúng tôi có chắc không

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

chúng ta đã hết chỗ Không có lỗi!

Ngay cả khi thật tuyệt khi điều tra những gì thực sự đã xảy ra ... Tôi sẽ để điều này cho sự tò mò và / hoặc kỹ năng xử lý sự cố của các thành viên ServerFault khác ;-)

Chúc vui vẻ!


BTW: Tôi đã thử nghiệm tất cả những điều trên, tại đây:

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

Tôi nhận thấy rằng bạn phải root để các lệnh đó hoạt động. Có phải đó luôn là trường hợp cho các tập tin thưa thớt?
Merc

Không xin lỗi. Họ cũng nên làm việc như người dùng bình thường, được cấp quyền ghi thích hợp trên thư mục chính.
Damiano Verzulli

Cảm ơn câu trả lời tuyệt vời này. Để lại cho tôi một câu hỏi và một lo lắng. Lo lắng: Giả vờ đã viết thành công tệp 2GB thứ hai khi thực sự không còn chỗ cho nó? Rắc rối ... Điều gì xảy ra khi bạn cố đọc lại (với sha1sum hoặc một cái gì đó)? Câu hỏi: Có cách nào để sao lưu một tệp thưa thớt trên mạng mà giữ cho nó thưa thớt (tức là chỉ thực sự sao chép các phần được sử dụng)?
Thilo

Tôi đã cố gắng điều tra sâu hơn nhưng .... thật không may, tôi đã thiếu thời gian và thực sự, đó chắc chắn là một không gian hợp lệ cho một câu hỏi SF khác. Dù sao, có thể dễ dàng tránh được bằng cách không đặt trước quá nhiều dung lượng lưu trữ của bạn: Ý tôi là, bạn có thể tạo các tệp thưa thớt nhưng ... để có tổng không gian phân bổ tối đa phù hợp trong đĩa phisical của bạn. Không bạn Thay vào đó, nếu bạn đang tìm kiếm các giải pháp "đặt trước quá nhiều" .... hơn là có thể cần phải điều tra cái gì khác (LVM?)
Damiano Verzulli

@Thilo Tôi cũng tò mò chuyện gì sẽ xảy ra nếu bạn cố đọc tập tin mà âm thầm tràn ra. rsynccó một --sparsetùy chọn sẽ tạo các tệp thưa thớt trên đĩa đích.
localhost
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.