Bagaimana saya bisa mengubah ukuran partisi root saat runtime?

236

Bagaimana saya bisa meningkatkan ukuran partisi root dari suatu sistem saat runtime?

Saya memiliki partisi yang tidak dialokasikan setelah partisi root (yang juga ext4), bagaimana saya bisa menambahkan ruang yang tidak dialokasikan ke ruang yang dialokasikan ke partisi root tanpa harus mematikan server?

BonboBingo
sumber
3
Aku benci kedengaran seperti tongkat di lumpur, tapi ini mengandung risiko yang lumayan? Mengapa ini perlu terjadi? Apakah uptime menjadi kendala utama?
Cloud
Anda tidak dapat mengubah ukuran partisi ke kiri, karena itu sebenarnya akan menjadi langkah.
Zaz
5
Meningkatkan ukuran parititions online adalah mudah. Bagian yang sulit akan menyusut (judul Anda adalah tentang "mengubah ukuran"). Bagi orang-orang yang tertarik dengan manipulasi APAPUN pada partisi root (memindahkan, mengecilkan, mengubah sistem file, perangkat) pada saat runtime harus berkonsultasi dengan jawaban saya: askubuntu.com/a/728141/21888
vaab
Gunakan growpart
guettli

Jawaban:

214

GUI (Ubuntu 14.04 dan yang lebih baru) : GParted v0.17 dan yang lebih baru menyediakan GUI yang bagus untuk ini. (Versi yang lebih lama akan menolak untuk mengubah ukuran partisi yang dipasang).

Baris perintah (semua versi Ubuntu): Ada tiga langkah untuk ini.

Langkah 1. Partisi harus diubah ukurannya terlebih dahulu. Jika Anda menggunakan LVM, mudah, dan Anda mungkin tahu bagaimana melanjutkan. Jika Anda menggunakan partisi klasik, ini sedikit lebih rumit, dan mungkin memerlukan reboot (walaupun Anda tidak perlu mem-boot sistem lain atau live CD).

Beginilah cara saya melakukannya: Gunakan fdiskuntuk menghapus dulu partisi (idenya adalah data pada disk akan disimpan), kemudian dengan hati-hati membuatnya kembali dengan ukuran yang lebih besar di posisi yang sama.

Contoh:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Sekali lagi, sangat penting bahwa partisi baru dimulai pada blok yang sama dengan yang lama. Id juga harus cocok (83 untuk sistem Linux). Bersiaplah untuk kehilangan semua data Anda dengan kesalahan ketik sedikit pun.

Agar aman, Anda juga dapat mengembalikan bendera boot (yang menurut Wikipedia masih diperlukan di beberapa komputer) dengan menekan a.

Lihat bagian komentar untuk apa yang harus dilakukan jika partisi swap Anda menghalangi.

Sekarang ini sudah jelas mengapa orang merekomendasikan untuk menggunakan live CD. ;-)

Langkah 2. Saat ini fdiskmengingatkan Anda, Anda harus memuat ulang tabel partisi sebelum melanjutkan. Cara paling aman adalah dengan hanya reboot; tetapi Anda juga dapat menggunakan partprobeatau kpartx (informasi lebih lanjut) .

Langkah 3. Setelah partisi diubah ukurannya dan tabel partisi dimuat ulang, ini adalah masalah sederhana untuk menjalankan resize2fssistem file, dan Anda dapat melakukan ini bahkan ketika sudah dipasang sebagai partisi root.

Contoh:

$ sudo resize2fs /dev/sda1
Søren Løvborg
sumber
16
Ini bekerja dengan baik untuk saya. Namun saya juga memastikan bahwa flag boot yang disimpan adalah kondisi asli.
Augustus Kling
4
@ jbo5112: Seperti yang fdiskdikatakan, partprobeatau kpartxmungkin berfungsi sebagai ganti reboot; lihat juga pertanyaan ini . Bahkan jika Anda reboot, solusinya masih lebih baik daripada menggunakan live CD ketika datang ke downtime, di mana reboot sederhana bisa kurang dari 10 detik untuk mesin virtual. Ini juga lebih cepat dalam waktu operator, itulah sebabnya saya biasanya menggunakan pendekatan ini sendiri. :)
Søren Løvborg
1
@ Raymond: Jika tekanan memori memungkinkan (lihat free -h), nonaktifkan swap ( swapoff /dev/sda2), ubah tabel partisi (termasuk menghapus dan membuat ulang partisi swap) dan 1) reboot atau 2) muat ulang tabel partisi dan swaponlagi. (Jika memori terlalu ketat untuk menonaktifkan swap sementara, Anda masih dapat membuat dan mengaktifkan partisi swap baru ( /dev/sda3), lalu swapoff sda2; tetapi kemudian Anda harus memperbarui /etc/fstabdengan nama perangkat swap baru.)
Søren Løvborg
1
Jika Anda menggunakan vmware dan memperbesar ukuran disk, Anda harus menjalankan sudo lshw -C disk untuk memindai ulang sistem file sehingga vm mengenali drive yang lebih besar. Kemudian ikuti instruksi di atas.
Guy
2
Bagaimana dengan menyusut?
Aaron Franke
114

Dimungkinkan untuk melakukan resize on-line dari sistem file ext4, bahkan jika itu partisi root Anda. Gunakan resize2fsperintah.

sudo resize2fs /dev/sda1

EDIT: Penyusutan online tidak diperbolehkan:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported
Putusan Kode
sumber
55
Dari man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8).Pertanyaan ini adalah tentang mengubah ukuran partisi , bukan sistem file . Perbedaannya halus tetapi sangat penting.
Eliah Kagan
8
Anda dapat menggunakan fdisk untuk menghapus partisi root dan kemudian membuatnya kembali di blok awal yang sama. fdisk akan menuliskan perubahannya, tetapi tidak akan berpengaruh sampai setelah reboot. setelah reboot, Anda dapat menggunakan program resize2fs untuk mengirim disk untuk mengisi partisi.
James Becwar
3
Saya baru saja mengubah ukuran partisi root ext4 online. Karena itu saya dapat mengkonfirmasikan itu mungkin. Tetapi alih-alih meneruskan / dev / sda * sebagai parameter ke resize2fs, Anda harus memberikan nama volume logis.
CDR
10
Saya menemukan paragraf pertama dari halaman manual resize2fs paling menarik untuk pertanyaan awal:The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.).
mo '
5
Tolong jangan muck dengan fdiskkapan growpartakan melakukan ini dengan sangat mudah untuk Anda.
STRML
54

Solusi yang lebih mudah - gunakan growpart <device> <partition>:

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

Seperti biasa, buat cadangan tabel partisi Anda ( sfdisk -d /dev/xvda > partition_bak.dmp) untuk berjaga-jaga.

STRML
sumber
Bagaimana dengan menyusut?
Aaron Franke
Berharap untuk menggunakan metode ini, tetapi mendapat sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(menggunakan dual boot dengan windows)
monkut
Penyusutan tidak memungkinkan dilakukan secara online. Saya sarankan menggunakan gparteduntuk itu.
STRML
4
growpart adalah bagian dari cloud-utils. Jika Anda belum menginstal, Anda dapat menginstal denganapt-get install cloud-utils
klor
1
@monkut Terlambat ke pesta, tetapi kemungkinan besar cakram Anda /dev/nvme0n1. p5 adalah partisi 5 pada disk ini. Bandingkan dengan irisan disk BSD tradisional, mereka menggunakan skema penomoran yang serupa.
Per Lundberg
12

Ya, Anda dapat mengecilkan / memindahkan / menumbuhkan partisi root online tanpa harus menyalakan ulang (atau livecd, atau usbkey): lihat jawaban ini . Ini ditulis dengan sangat baik dan mudah diikuti, meskipun cukup panjang dan sedikit berisiko. Jadi jika Anda hanya ingin menumbuhkan partisi ext4 Anda, Anda dapat tetap menggunakan resize2fssolusi kerja konvensional .

Solusi umum yang saya temukan akan bekerja pada semua jenis solusi khusus atau VPS misalnya.

TLDR; solusi ini menyiratkan untuk pivot_rootke tmpfssehingga Anda dapat umountdengan aman partisi root Anda hidup dan biola dengan itu. Setelah selesai, Anda akan pivot_rootkembali ke partisi root baru Anda.

Ini memungkinkan hampir semua manipulasi pada sistem file root (pindahkan, ubah filesystem, ubah perangkat fisiknya ...).

Reboot tidak diperlukan dalam proses, dan ini memungkinkan untuk memotong pembatasan dari resize2fs tidak mampu mengecilkan ext4 partisi.

Saya pribadi menggunakan ini, dan ini bekerja dengan sangat baik pada sistem debian juga, jadi itu harus bekerja pada Ubuntu. Saya sangat terkejut tidak melihat solusi mendalam ini sedikit lebih terkait dengan banyak pertanyaan di situs web stackexchange yang berhubungan dengan masalah yang sama.

Catatan: Tentu saja jika Anda ingin menumbuhkan partisi Anda, sederhana resize2fsakan cukup seperti yang dinyatakan di berbagai tempat dan di jawaban lain di sini.

vaab
sumber
4
Saya pikir bagi kebanyakan orang, setelah Anda menghentikan semua program dan layanan mengakses partisi root, Anda mungkin juga telah me-reboot mesin. Untuk menyusut / bergerak, itu mungkin masih lebih cepat daripada menggunakan live CD, tetapi untuk pertumbuhan (sejauh ini tugas yang paling umum, dan apa yang ditanyakan OP), ada beberapa cara yang tidak melibatkan penghentian sementara sebagian besar sistem .
Søren Løvborg
2
@ SørenLøvborg: Anda dapat memulai kembali layanan inti yang membutuhkan produksi terus-menerus sambil melakukan prosedur lengkap. Ada banyak konfigurasi di mana Anda tidak dapat meletakkan LiveCD (instance VPS, dedicated server ...) atau keadaan di mana Anda ingin menghindari reboot apa pun karena alasan tertentu. Judul pertanyaan aslinya menyebutkan "ukuran", yang menarik orang yang mencari partisi yang menyusut secara online. ** Tidak ada solusi lain yang memungkinkan menyusutnya ext4 online. ** Solusi ini berisiko, kompleks, tetapi yang paling kuat dari semuanya dan itu mengisi kekurangan yang lain.
vaab
1
Tolong jangan memposting jawaban tergantung pada tautan eksternal. Masukkan bagian yang relevan ke dalam jawaban Anda atau kirim tautan sebagai komentar untuk pertanyaan itu. Lihat Cara Menjawab untuk detailnya.
Melebius
10

Anda juga bisa menggunakan GParted - selama partisi yang Anda ubah ukurannya bukan yang Anda boot dari - kalau tidak saya sarankan opsi live CD agak lebih mudah bagi pemula.

GParted pada dasarnya melakukan semua langkah - hanya berdasarkan GUI yang digawangi

jaket kulit
sumber
Saya mem-boot sistem saya dengan Ubuntu 12.04 Live CD dan saya mengubah ukuran partisi ext4 dengan GParted. Bekerja baik untukku. Bagaimanapun, sebelum operasi ini, saya mencadangkan semua data penting saya.
StandDuPp
Saya pikir, partisi gparted perlu dilepas. tetapi saya bisa salah.
Nick
Pertanyaannya jelas tentang partisi tempat mereka boot, dan mem-boot CD live memerlukan restart mesin. -1
wjandrea
5

Baru saja selesai mengubah ukuran partisi root ext4 pada sistem live ketika root sedang di-mount.

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 
CDR
sumber
5

Saya ingin membuat ekstensi pada jawaban @ Søren Løvborg: memperluas partisi dengan hadiah partisi swap.

Pertama-tama tata letak disk setelah memperpanjangnya:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

Jadi sda1 perlu diperluas dengan ruang kosong di akhir disk, tetapi partisi swap ada di antara mereka. Ini adalah bagaimana Anda dapat melakukannya:

Pertama, kita perlu menonaktifkan swap. Periksa berapa banyak digunakan dan jika Anda dapat mematikannya.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

swap tidak digunakan di sini sehingga kami dapat mematikannya

$sudo swapoff /dev/sda5

Sekarang kita akan mengubah tabel partisi:

$sudo fdisk /dev/sda

(catatan: jika Anda memiliki partisi pertama dimulai di sektor 63 bukan 2048, Anda perlu menambahkan opsi -c=dos)

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 6.9 GiB, 7340032000 bytes, 14336000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

Command (m for help): d
Partition number (1,2,5, default 5): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

Catatan: ukuran sda1 adalah jumlah total sektor dikurangi ukuran sektor dari partisi swap Anda: 14335999-2093058 = 12242941

Seperti yang disebutkan fdisk: kernel masih menggunakan tabel partisi lama sehingga kita perlu memuatnya kembali.

$partprobe

Sekarang kita perlu menjalankan resize2fs di sda1 (jangan lupakan ini!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

Sekarang, semuanya belum berakhir. Seperti yang mungkin Anda perhatikan, sda2 dipartisi sebagai tipe Linux (Ext4). Untuk beberapa alasan, tidak ada cara di fdisk untuk memilih jenisnya. Jadi kita harus menggantinya menggunakancfdisk

$ sudo cfdisk

Pilih sda2 dan ubah jenisnya 82 Linux swap / Solarisdan pastikan Anda menuliskannya (ketik ya untuk mengonfirmasi)

Sekarang kita dapat mengaktifkan kembali swap

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

Dan akhirnya nyalakan:

$swapon /dev/sda2

Satu-satunya hal yang perlu kita lakukan adalah memperbarui fstab untuk memasang partisi swap secara otomatis saat boot

$sudo nano /etc/fstab

Dan ubah UUID dari partisi swap ke output di atas:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Sekarang semuanya baik-baik saja dan Anda dapat reboot tanpa masalah.

wouter205
sumber
untuk bolak-balik tipe partisi swap, itu bisa dilakukan di fdisk, pilih beli t lalu 5 (partisi 5) lalu 82 (ketik Linux swap / Solaris)
Oz Edri
bukankah seharusnya partisi 2 diperpanjang? (dan kemudian di fdisk kita harus memilih e daripada p) Juga, bukankah seharusnya perintah mkswap dan swapon harus dijalankan di / dev / sda5 bukan sda2?
Oz Edri
1
Untuk tipe partisi swap: Saya menemukan dalam instruksi lain bahwa Anda memang dapat memilih jenis di fdisk tetapi karena beberapa alasan itu tidak berfungsi di versi saya. Bagaimanapun, ini akan selalu bekerja dengan cfdisk
wouter205
1
Untuk partisi swap: Anda dapat menggunakan partisi extended tetapi kemudian Anda perlu menambahkan dua partisi: partisi extended dan logis (lihat tata letak partisi awal saya). Dalam contoh saya, saya berakhir dengan 2 partisi primer: partisi sda1 - ext4 - root & sda2 - partisi swap. Jadi perintah mkswap& swaponharus dijalankan di sda2. Saya memang membuat kesalahan di awal posting saya: swapoffperlu dieksekusi pada sda5. Komentar selalu diterima, sulit untuk dicatat.
wouter205
1
Ketika partisi swap dienkripsi, pertama-tama kita harus menghentikan cryptdisks cryptdisks_stop, kemudian perbarui / etc / crypttab alih-alih /etc/fstabdan restart cryptdisks dengan cryptdisks_start.
Dmitri Chubarov
1

Saya baru saja berhasil melakukannya tanpa umount,, pivot_rootatau penghapusan sementara partisi utama, menggunakan parted 3.2 pada Ubuntu 16.04, 4.4.0 kernel. Untuk berhati-hati saya melakukan segalanya dari konsol virtual dengan jaringan dinonaktifkan, dan mengambil snapshot sebelumnya untuk berjaga-jaga, tapi snapshot itu tidak diperlukan, jadi saya bisa saja melakukan ini melalui SSH dan tanpa mengubah runlevel.

Tentukan ukuran partisi: parted /dev/sda1 print | egrep "Disk.*GB"

Secara opsional beralih ke mode multi-pengguna tanpa jaringan (harus dilakukan dari konsol, bukan SSH):

runlevel     # remember the original runlevel
init 2

Opsional mengambil snapshot VM untuk berhati-hati.

Ubah ukuran partisi:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Ubah ukuran sistem file: resize2fs /dev/sda1

Jika terjadi kesalahan, Anda dapat memulihkan foto Anda di sini. Jika semua berjalan baik, kembali ke runlevel normal (yang diperoleh di atas) - biasanya 5: init 5. Mungkin lebih baik untuk melakukan reboot penuh pada saat ini untuk memastikan semuanya kembali dengan benar (saya mengalami masalah tanggal / ntp sesudahnya).

Roger Dueck
sumber
1

Ikuti langkah ini.

  1. terminal terbuka sebagai superuser su
  2. Lari parted
  3. ketik puntuk melihat partisi yang tersedia
  4. mengidentifikasi nomor partisi root Anda (mis: 'sda 3' berarti angka 3) dan menghapus partisi yang berdekatan dengan menggunakan rm PARTITION NUMBERuntuk membuat ruang kosong.
  5. sekarang tingkatkan ukuran root dengan mengetik resizepart ROOT NUMBERdan reboot sistem jika perlu
  6. keluar parteddengan mengetik exitdan dalam tipe terminal partprobedan tekan enter (ini dapat dilakukan bahkan setelah reboot)
  7. akhirnya jalankan resize2fs /dev/sda PARTITION NUMBERdan nikmati partisi root yang luas.
Gurunadha Reddy
sumber
0

Seperti yang dinyatakan sebelumnya:

  • memperluas langsung dari sistem root dimungkinkan. (tidak ada kesulitan, karena bagian boot tidak dapat dipindahkan)

  • menyusutkan partisi root secara langsung perlu dilakukan dari perangkat boot eksternal (boot dari live system cd / usb-stick), seolah-olah ada kesalahan, ketidakcocokan .. apa pun .. sistem Anda hang, perlu reboot dan akhirnya tidak akan dapat boot dengan benar.

Semacam "tapi saya berhasil dan berhasil" adalah keberuntungan murni.

ascervera
sumber