Sistem file BTRFS multi-perangkat dengan disk dengan ukuran berbeda

14

Saya memiliki sistem file BTRFS yang ada yang terdiri dari satu disk 500GB dan saya baru saja membeli disk 2TB untuk meningkatkan kapasitas penyimpanan server rumah saya dan saya ingin menambahkan disk baru ke sistem file yang ada. Dari apa yang saya baca, sepertinya tidak ada pengaturan BTRFS yang dapat menangani disk dengan ukuran yang berbeda tanpa menyia-nyiakan perbedaan ukuran antara disk yang lebih besar dan yang lebih kecil, tetapi saya baru menggunakan BTRFS dan saya mungkin telah melewatkan sesuatu, jadi apakah ada pengaturan yang dapat memungkinkan saya untuk menggabungkan dua disk dalam sistem file tanpa membuang ruang?

fokenrute
sumber
Bagaimana Anda menangani disk yang mendasarinya? Dengan LVM?
Andy Smith
@Andy, btrfs menangani banyak disk dengan gaya LVM / RAID, periksa ini .
OneOfOne
Aduh ... salahku. Ceria untuk itu ;-)
Andy Smith

Jawaban:

4

Btrf dapat menggunakan tingkat serangan yang berbeda untuk data dan Metadata:

default (bahkan untuk satu disk) adalah raid1 untuk metadata (direktori dll) dan raid0 untuk data.

Jika Anda tidak mengubah ini maka kemungkinan Anda tidak akan memiliki masalah menambahkan disk kedua dan menjalankan kembali keseimbangan. karena hanya metadata yang akan disalin ke kedua disk (Anda dapat melihat ukuran metadata Anda dengan btrfs filesystem df /). Perlu diketahui bahwa jika salah satu disk Anda gagal Anda kehilangan data.

karena disk 2tb sangaaaat lebih besar dari 500g itu mungkin akan memberi Anda peluang yang lebih baik jika Anda menambahkan yang baru dan kemudian menghapus yang lama (kemungkinan satu drive gagal spesifik jauh lebih kecil daripada peluang salah satu drive kegagalan).

jika Anda berencana memiliki array raid nanti (dengan drive berukuran lebih mirip) Anda mungkin ingin membuat kembali sistem file pada drive baru dengan raid1 untuk data dan metadata dan kemudian menyalin semuanya. kemudian ketika Anda memiliki lebih banyak uang, beli drive 2tb kedua.

ps: menggunakan raid1 pada drive singl berarti data akan disimpan di dua lokasi pada drive yang satu (untuk melindungi dari korupsi) dan akan mengurangi ruang penyimpanan Anda (itu ide yang sangat bagus untuk metadata).

pss: serius, jangan tergoda untuk tidak menggunakan raid1 untuk metadata. psss: ada peluang yang sangat bagus bahwa btrf akan mendapatkan kemampuan untuk mengubah level serangan secara dinamis.

Arthur Ulfeldt
sumber
secara pribadi saya berencana membuat kembali btrfs saya fs / array / what-do-i-call-ini segera setelah btrfs memiliki dukungan raid5 dan raid6.
Arthur Ulfeldt
12

Itu tergantung pada profil apa yang Anda gunakan untuk blok data dari sistem Btrfs multi-perangkat.

  • Ketika Anda menggunakan RAID0 (default untuk blok data), setiap disk hanya dapat diisi hingga kapasitas disk terkecil dalam array.

  • Saat Anda menggunakan profil "tunggal" untuk blok data, setiap disk akan terisi hingga kapasitas penuhnya. misalnyamkfs.btrfs -d single /dev/sda /dev/sdb

Saya memiliki server file dengan disk 2TB dan 3TB. Ini mem-boot Ubuntu 12.10 dari flash drive USB. Pertama saya membuat sistem file Btrfs tanpa -d singleopsi:

mkfs.btrfs /dev/sda /dev/sdb

Hasilnya adalah saya hanya bisa menyimpan sekitar 4TB (3,45 data file TB biner).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 3.22TB
 devid    2 size 2.73TB used 1.82TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data, RAID0: total=3.45TB, used=3.22TB
Data: total=8.00MB, used=0.00
System, RAID1: total=8.00MB, used=264.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.29GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  3.3T  241G  94% /mnt/btrfs1

Perhatikan used 1.82TBuntuk drive 3TB.

Lalu saya menggunakan perintah "balance" untuk mengubah blok data dari RAID0 ke profil "tunggal":

btrfs balance start -dconvert=single /mnt/btrfs1

Butuh waktu yang sangat lama (sekitar 30 jam) untuk menyeimbangkan data 4TB. Tetapi setelah selesai, saya bisa menggunakan 5TB penuh (4,36 data file TB biner).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 4.34TB
 devid    2 size 2.73TB used 2.73TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data: total=4.36TB, used=4.34TB
System, RAID1: total=40.00MB, used=500.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.01GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  4.4T   27G 100% /mnt/btrfs1
Christian d'Heureuse
sumber
2

Saya telah menggunakan banyak perangkat dengan btrfs di Ubuntu, dan itu berfungsi dengan baik. Perlu diingat bahwa btrf sebenarnya tidak menerapkan level RAID standar. Ini mengimplementasikan striping dan mirroring opsional, tetapi tidak benar RAID.

Michael Trausch
sumber
1

Dimungkinkan untuk menggabungkan drive dengan ukuran berbeda dalam btrfs.
Tetapi saat ini btrfs tidak menangani ENOSPC (Tidak ada ruang tersisa di perangkat) dengan sangat baik.

Misalnya saya menginstal 3 drive dalam array RAID0 (striped). 1x500GB, 1x250GB, 1x160GB.
Anda akan mengasumsikan bahwa Anda akan memiliki ruang disk antara 800-900GB.

Inilah yang df -hmenunjukkan:
/ dev / sdf 848G 615G 234G 73% / media / btrfs

Tapi saya tidak dapat menyimpan data lagi di array. (Tidak ada ruang tersisa)

btrfs filesystem df /media/btrfsmenunjukkan kepada saya ini:
Data: total = 612.51GB, digunakan = 612.51GB
Metadata: total = 1.62GB, digunakan = 990.73MB
Sistem: total = 12.00MB, digunakan = 48.00KB

Bahkan penyeimbangan kembali tidak membantu.

Pada milis saya melihat kalibrasi ini:
ukuran drive terkecil * jumlah drive dalam array
(walaupun saya memiliki lebih banyak ruang: 612GB bukannya 160GB * 3 = 480GB)

Jadi dalam keadaan saat ini kemungkinan pengembangan adalah bahwa Anda tidak akan dapat menggunakan semua ruang yang Anda miliki meskipun btrfs mendukung ukuran yang berbeda dalam satu array.

Saya menggunakan Ubuntu 10.10 dengan kernel 2.6.35-22-generik.

torusJKL
sumber
Saya tidak berpikir itu akan pernah mendukung apa yang Anda inginkan, setidaknya sampai mendukung tingkat serangan yang berbeda pada basis file / per direktori. Untuk raid0 (stripe), btrfs diperlukan untuk menjaga ukuran bagian yang sama dari setiap file pada ketiga perangkat. Bagaimana cara melakukannya jika memungkinkan Anda untuk menggunakan semua 500GB dari satu perangkat? Jika alih-alih "raid0" Anda menggunakan "tunggal" (tidak yakin opsi ini tersedia ketika Anda memposting), maka btrfs tidak mencoba untuk menduplikasi file di mana saja dan akan memungkinkan Anda menggunakan semua ruang di semua perangkat. Tetapi untuk tingkat serangan, itu tidak masuk akal: Anda mencoba melanggar definisi tingkat serangan.
bobpaul
Tidak apa-apa, aku salah. btrfs raid0 / 1 hanya strip / mirror ke 1 perangkat lain, tidak semua perangkat, sehingga 1TB + 500GB + 500GB bekerja persis sama dengan 1TB + 1TB untuk raid0 dan raid1 (setidaknya pada Linux 3.0). Sebelum Linux 3.0, ada masalah yang Anda jelaskan.
bobpaul
1

pembaruan: jawaban di bawah ini ditulis sebelum Linux 3.0 dirilis. Linux 3.0 termasuk patch quasi-round-robin.

Ketika Anda melakukan mirroring atau striping data, mirror kedua atau strip strip perlu dialokasikan pada perangkat lain dengan ruang kosong. BTRFS mengalokasikan potongan ke perangkat dalam mode round-robin, yang dapat menyebabkan ruang kosong jika Anda memiliki perangkat dengan ukuran berbeda.

Ada patch quasi-round-robin di dalam pipa untuk memperbaiki ini. Tentu saja, masih tidak mungkin untuk memasangkan semua potongan pada perangkat yang berbeda jika Anda memiliki disk 500GB dan 2TB. Patch ini lebih ditujukan untuk situasi seperti 1 x 1TB + 2 x 500GB di mana setiap disk kecil sebaiknya memilih mirror / stripe dengan disk besar daripada disk kecil lainnya.

Dalam situasi Anda, saya hanya akan menggunakan mode "tunggal" untuk data Anda ( mkfs.btrfs -d single). Bongkahan tidak dipasangkan dalam mode itu, jadi saya pikir tidak akan ada masalah dengan perangkat dengan ukuran yang berbeda. Saya belum mengujinya.

Wim Coenen
sumber
0

Masalah ini hanya berlaku untuk pengaturan btrfs-raid1, dari halaman Gotchas :

  • Alokasi dilakukan atas dasar round-robin. Jika Anda memiliki strategi raid1 pada volume yang terdiri dari drive yang tidak cocok (volume dengan ukuran berbeda), volume Anda yang lebih kecil dapat mengisi sambil meninggalkan banyak ruang kosong di drive tunggal terbesar Anda. Anda dapat memverifikasi bahwa ini adalah masalah jika ada perbedaan antara sistem file 'df' dan 'btrfs df [mountpoint]' DAN jika perintah yang terakhir juga menunjukkan bahwa "total" dan "digunakan" sama pada baris "Data" . Sebuah penyeimbangan kembali dapat mengurangi masalah ini. (2.6.33)
    • Jika volume Anda terisi dengan cara ini, penyeimbangan kembali dapat dengan cepat menyebabkan ENOSPC ("Kesalahan TANPA SPASI tersisa di perangkat") oops. Anda mungkin harus menghapus file yang relatif besar untuk mengatasi kebuntuan ini, maka penyeimbangan kembali akan berhasil. (2.6.33)
    • Penyeimbangan ulang dapat menyebabkan penggunaan CPU yang sangat intensif untuk waktu yang lama. (2.6.34 & 2.6.35)
OneOfOne
sumber
Maaf membuat Anda mengulang sendiri, tapi saya akan menambahkan perangkat baru dan saya harus yakin. Semua sumber yang diperiksa tentang RAID0 menyatakan bahwa disk harus memiliki ukuran yang sama (mis. Dokumen freebsd geom: "Setiap disk dalam strip RAID0 harus memiliki ukuran yang sama, karena permintaan I / O interleaved untuk membaca atau menulis ke beberapa disk secara paralel. "). Bisakah Anda mengonfirmasi itu berfungsi dengan Btrfs?
fokenrute
Maaf, saya tidak memiliki btrf multi-perangkat yang tidak dapat saya konfirmasikan, namun tidak ada yang dapat saya temukan mengatakan tentang memiliki ukuran perangkat yang sama untuk raid0 + btrfs, namun jika Anda punya cukup waktu, bagi disk baru untuk membagi 1tb / 1tb, cadangkan disk lama ke salah satu partisi, tambahkan 1tb yang kosong, jika berhasil tambahkan partisi ke-2.
OneOfOne