Pertanyaan Bagaimana cara mengubah ukuran partisi ext4 di luar batas 16 TB?


Ketika mencoba untuk mengubah ukuran dan ext4 lama Partisi yang dibuat tanpa flag 64bit, resize2fs 1,42 akan gagal jika ukuran baru atau melebihi 16TiB.

$ resize2fs -p /dev/mapper/target-device
resize2fs: New size too large to be expressed in 32 bits

Saya tidak ingin menyalin file ke media eksternal. Saya juga tidak ingin mengambil risiko kehilangan data. Bagaimana saya bisa mengubah ukuran volume dengan aman?


18
2018-05-31 06:39


asal


Man, itu satu partisi besar ... - MathuSum Mut


Jawaban:


Mengapa ini terjadi:

Filesystem baru umumnya dibuat dengan opsi -O 64bit Ini memungkinkan mereka untuk menjangkau volume yang lebih besar secara signifikan (1024 PiB bukannya 16 TiB). Sistem file lama, yang dibuat sebelum ini menjadi default, sebelumnya tidak memiliki opsi untuk meningkatkan panjang alamat menjadi 64 bit.

Meskipun bukan bagian dari Ubuntu - Ubuntu 16.04 (2016-04-21) dirilis dengan e2fsprogs Version 1.42.12 (2014-08-25), ini telah diperbaiki dalam rilis terbaru e2fsprogs Version 1.43 (2016-05-17).

Saya sekarang akan menguraikan bagaimana operasi dapat dilakukan, dengan asumsi perangkat target Anda dipanggil /dev/mapper/target-device

Prasyarat:

  1. Cadangan apa pun yang Anda tidak bisa kehilangan. Selalu. Juga perhatikan, ukuran filesystem ini AKAN dirugikan oleh kesalahan disk biasa, jadi konfigurasikan RAID untuk integritas terjamin.
  2. Operasi harus dilakukan secara off-line - artinya Anda tidak dapat melakukannya pada root sistem (serius, jika root Anda adalah> 16TiB, konsultasikan dengan ahli linux)
  3. Pastikan bahwa semua volume di sekitarnya akan sepenuhnya mendukung ukuran yang dihasilkan (apakah terdapat di dalam wadah yang dienkripsi? Tabel partisi apa saja?)
  4. Lanjutkan dengan memperbarui filesystem setelah mengubah ukuran dan mengecek ulang apa pun yang ada di dalamnya - setelah meningkatkan sistem razia, linux mungkin atau mungkin tidak segera mengetahui ukuran maksimum yang baru. memeriksa $ cat /proc/partitions.
  5. Pastikan (periksa uname -r) Anda menjalankan kernel yang dapat menangani filesystem 644 ext4 dengan benar - sembarang 4.4.x kernel (default Ubuntu 16.04) atau lebih baru akan baik-baik saja - kernel yang lebih tua mendukung opsi 64bit, saya hanya tidak tahu apakah mereka bebas dari bug.

Prasyarat 6 - Dapatkan e2fsprogs setidaknya versi 1.43

$ resize2fs
# if this command - without any parameters - prints a version above 1.43, continue to step 1
$ sudo apt update
$ sudo apt install git
$ sudo apt build-dep e2fsprogs  # see https://askubuntu.com/q/158871/158442 to enable source package support
$ cd $(mktemp -d)
$ git clone -b v1.44.2 https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git e2fsprogs && cd e2fsprogs
$ ./configure
$ make
# note: make test is strange in 1.43, see the master changelog for a fix
$ cd resize
$ ./resize2fs
# if this prints 1.43 or higher, use `./resize2fs` instead of `resize2fs` for the rest of the steps
# if this prints any other version, panic

Langkah 1 - Memanfaatkan filesystem dengan tepat

$ sudo umount /dev/mapper/target-device

Langkah 2 - Periksa filesystem untuk kesalahan

$ sudo e2fsck -fn /dev/mapper/target-device

Langkah 3 - mengaktifkan dukungan 64bit di sistem file

$ man tune2fs
# read about the filesystem flags - you may wish to change some
$ man resize2fs
$ sudo resize2fs -b /dev/mapper/target-device
# on a typical HDD RAID, this takes 4 minutes of high IO & CPU load

Langkah 4 - mengubah ukuran filesystem

$ sudo resize2fs -p /dev/mapper/target-device
# resize2fs assumes "grow to all space available" if no size is passed on command line
# the -p flag will enable progress bars - after completing some initial steps
# on a typical HDD RAID, this takes 4 minutes of high IO & CPU load

Langkah 5 - periksa sistem file lagi

$ sudo e2fsck -fn /dev/mapper/target-device

Langkah 6 - remount

Jika kesalahan terjadi, jangan panik; jangan mencoba menulis ke volume; berkonsultasi dengan seseorang yang benar-benar mengetahui hal ini sebelum benar-benar menggigit data Anda. Jika tidak ada kesalahan yang terjadi, pasang kembali perangkat.

$ sudo mount /dev/mapper/target-device

Keberhasilan!

Anda tidak memerlukan versi non-Ubuntu dari e2fsprogs untuk operasi lanjutan dari filesystem yang ditingkatkan - kernel mendukungnya untuk beberapa waktu sekarang. Itu hanya perlu untuk memulai peningkatan.

Catatan: e2fsck versi yang lebih baru mungkin menyarankan untuk memperbaiki stempel waktu atau pohon tingkat yang ditangani versi sebelumnya dengan buruk. Ini bukan masalah dan Anda mungkin memilih untuk memperbaikinya sekarang atau nanti.

Untuk referensi, ada pesan kesalahan serupa mke2fs akan dicetak jika diminta untuk membuat perangkat besar dengan opsi yang tidak pantas:

$ mke2fs -O ^64bit /dev/huge
mke2fs: Size of device (0x123456789 blocks) is too big to be expressed in 32 bits using a blocksize of 4096.

33
2018-05-31 06:39



Ini benar. Saya ingin menambahkan bahwa Redhat (dengan demikian RHEL, Centos, dll) digunakan untuk lebih memilih XFS daripada Ext4 di installer mereka ketika mempartisi filesystem di atas 16TB, dan sekarang hanya lebih memilih XFS sebagai filesystem default. - Diablo-D3
Ya, sebagian besar kernel yang lebih tua masih signifikan di RedHat World tidak mengandung dukungan stabil untuk ext4 64bit. Afaik Ubuntu berjalan dengan apa yang dikatakan banyak guru linux, ext4 akan digantikan oleh btrfs - meskipun ext4 dekat dengan btrfs dalam fitur sekarang, saya percaya btrfs lebih elegan dalam desain dan mungkin bahkan lebih rentan terhadap bug. - anx
btrfs belum siap untuk produksi, dan mungkin tidak pernah siap untuk produksi, karena Oracle telah mengembangkannya di bagian belakang pembakar. Pendapat pribadi saya adalah jika Anda membutuhkan tingkat kompleksitas sistem file, gunakan akar XFS 8GB kecil yang dikombinasikan dengan menggunakan ZFS untuk kebutuhan penyimpanan data aktual Anda. - Diablo-D3
Satu hal yang perlu diperhatikan - tautan Anda untuk mengkloning repo e2fsprogs salah. Ini akan menjadi tautan yang benar: git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git - guest
Anda benar. Saya terlalu terbiasa dengan url "checkout url = web yang dapat dijelajahi" magic of github. - anx