Canlı dosya önyüklemeden kök dosya sistemini nasıl daraltabilirim?


93

Daha önce kök dosya sistemi altındaki verileri özel bağlama noktalarına taşımak için bir sistemin bölümlerini yeniden düzenlemeye ihtiyacım var. Birimlerin tümü LVM'dedir, bu nedenle nispeten kolaydır: yeni birimler oluşturun, verileri içine taşıyın, kök dosya sistemini daraltın, ardından yeni birimleri uygun noktalara monte edin.

Sorun, kök dosya sistemini küçülten adım 3'tür. İlgili dosya sistemleri ext4'tür, bu nedenle çevrimiçi yeniden boyutlandırma desteklenir; ancak, monte edilirken, dosya sistemleri yalnızca büyütülebilir. Bölmeyi küçültmek, sökülmesini gerektirir ki bu normal çalışma sırasında kök bölüm için elbette mümkün değildir.

Web'in etrafındaki yanıtlar, bir LiveCD veya başka bir kurtarma ortamını önyükleme, küçültme işlemini gerçekleştirme ve ardından tekrar kurulu sisteme yeniden başlatma işleminin etrafında dönüyor gibi görünmektedir. Ancak, söz konusu sistem uzak ve sadece SSH ile erişebiliyorum. Yeniden başlayabilirim, ancak bir kurtarma diskini önyüklemek ve konsoldan işlem yapmak mümkün değildir.

Uzaktan kabuk erişimini korurken kök dosya sistemini nasıl sökebilirim?


Kök dosya sistemini geçici olarak farklı bir sunucuya bağlama imkanı var mı? örneğin, başka bir VM'i döndürüp bu disk hacmini ona gösterme?
steve

Sunucu fiziksel, yani hayır.
Tom Hunt,

4
Kök tmpfs ve pivot_rootoraya kopyalayın . Burada bir örnek dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - zor ama denemek için bir test kutunuz varsa, dikkate değer.
steve

1
Burada ssh üzerinden uzaktan erişimin ivarch.com/blogs/oss/2007/01/…
steve

2
Kök LVM yeterince küçükse, başka bir LVM'ye klonlayabilir ve kullanmak için grub içinde önyükleme eatery (temp yeni varsayılan) oluşturabilir ve sonra önyükleme yapabilirsiniz (onu "canlı sisteminiz" yapar)
Rabin

Yanıtlar:


170

Bu sorunun çözümünde http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml adresinde verilen bilgiler çok önemliydi. Bununla birlikte, bu rehber RHEL'in çok eski bir versiyonu içindir ve çeşitli bilgiler eskiydi.

Aşağıdaki talimatlar, CentOS 7 ile çalışmak için hazırlanmıştır, ancak sistemi çalıştıran herhangi bir dağıtıma kolayca aktarılabilir olmalıdır. Tüm komutlar root olarak çalıştırılır.

  1. Sistemin kararlı bir durumda olduğundan emin olun

    Başka kimsenin kullanmadığından ve önemli bir şeyin olmadığından emin olun. Dış bağlantıların ortadaki işleri aksatmaması için httpd veya ftpd gibi servis sağlayan birimleri durdurmak muhtemelen iyi bir fikirdir.

    systemctl stop httpd
    systemctl stop nfs-server
    # and so on....
    
  2. Kullanılmayan tüm dosya sistemlerini çıkarın

    umount -a
    

    Bu, kök hacminin kendisi ve çeşitli geçici / sistem FS'leri için bir dizi 'Hedef meşgul' uyarısı yazacaktır. Bunlar şimdilik göz ardı edilebilir. Önemli olan, kök dosya sisteminin kendisi dışında, diskteki hiçbir dosya sisteminin takılı kalmamasıdır. Bunu doğrula:

    # mount alone provides the info, but column makes it possible to read
    mount | column -t
    

    Hala takılı diskteki herhangi bir dosya sistemi görüyorsanız, olmaması gereken bir şey çalışıyor demektir. Ne kullandığını kontrol edin fuser:

    # if necessary:
    yum install psmisc
    # then:
    fuser -vm <mountpoint>
    systemctl stop <whatever>
    umount -a
    # repeat as required...
    
  3. Geçici kök olun

    mkdir /tmp/tmproot
    mount -t tmpfs none /tmp/tmproot
    mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot}
    cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/
    cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/
    cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
    

    Bu, (diğer şeylerin yanı sıra) manpage görüntüleme (hayır /usr/share), kullanıcı düzeyinde özelleştirmeler (hayır /rootveya /home) ve benzeri şeyleri kıran çok az bir kök sistemi yaratır . Bu, kasıtlı bir durumdur, çünkü böyle bir jüri donanımına sahip bir kök sisteminde gereğinden fazla kalmamaya özendirmek.

    Bu noktada, ayrıca tüm gerekli yazılımların yüklendiğinden emin olmalısınız, çünkü paket yöneticisini de kesin bir şekilde kıracaktır. Tüm adımlara göz atın ve gerekli çalıştırılabilir kodlara sahip olduğunuzdan emin olun.

  4. Kök içine döndürme

    mount --make-rprivate / # necessary for pivot_root to work
    pivot_root /tmp/tmproot /tmp/tmproot/oldroot
    for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
    

    systemd, bağlantıların varsayılan olarak alt ağaç paylaşımına izin vermesine (olduğu gibi mount --make-shared) neden olur ve bu pivot_root, başarısızlığa neden olur. Dolayısıyla, bunu küresel olarak kapatıyoruz mount --make-rprivate /. Sistem ve geçici dosya sistemleri toptan olarak yeni köke taşınır. Bu çalışmasını sağlamak için gereklidir; systemd ile iletişim kurmak için soketler, diğer şeylerin yanı sıra, içinde yaşarlar /runve bu nedenle çalışan işlemleri yakınlaştıramazlar.

  5. Uzaktan erişimin değişimden kurtulduğundan emin olun

    systemctl restart sshd
    systemctl status sshd
    

    Sshd'yi yeniden başlattıktan sonra, başka bir terminal açarak ve makineye tekrar ssh ile bağlayarak içeri girebildiğinizden emin olun. Yapamazsanız, devam etmeden önce sorunu düzeltin.

    Tekrar bağlanabileceğinizi doğruladıktan sonra, kullanmakta olduğunuz kabuğundan çıkın ve tekrar bağlanın. Bu kalan çatalın sshdçıkmasına izin verir ve yenisinin tutmamasını sağlar /oldroot.

  6. Hala eski kökü kullanarak her şeyi kapat

    fuser -vm /oldroot
    

    Bu, hala eski kök dizinde tutulan işlemlerin bir listesini yazdıracaktır. Sistemimde şöyle görünüyordu:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
                 root          1 ...e. systemd
                 root        549 ...e. systemd-journal
                 root        563 ...e. lvmetad
                 root        581 f..e. systemd-udevd
                 root        700 F..e. auditd
                 root        723 ...e. NetworkManager
                 root        727 ...e. irqbalance
                 root        730 F..e. tuned
                 root        736 ...e. smartd
                 root        737 F..e. rsyslogd
                 root        741 ...e. abrtd
                 chrony      742 ...e. chronyd
                 root        743 ...e. abrt-watch-log
                 libstoragemgmt    745 ...e. lsmd
                 root        746 ...e. systemd-logind
                 dbus        747 ...e. dbus-daemon
                 root        753 ..ce. atd
                 root        754 ...e. crond
                 root        770 ...e. agetty
                 polkitd     782 ...e. polkitd
                 root       1682 F.ce. master
                 postfix    1714 ..ce. qmgr
                 postfix   12658 ..ce. pickup
    

    Çıkarmadan önce bu işlemlerin her birini ele almanız gerekir /oldroot. Kaba kuvvet yaklaşımı kill $PIDher biri için basit , ama bu işleri kırabilir. Daha yumuşak yapmak için:

    systemctl | grep running
    

    Bu, çalışan servislerin bir listesini oluşturur. Bunu, tutulan süreçler listesi ile ilişkilendirerek /oldrootdaha sonra systemctl restartbunların her birini düzenleyebilmelisiniz . Bazı hizmetler geçici kökene gelmeyi reddedecek ve başarısız bir duruma girecektir; bunlar şu an için önemli değil.

    Yeniden boyutlandırmak istediğiniz kök sürücü bir LVM sürücüsü ise, oluşturduğu listede görünmese bile, diğer bazı çalışan hizmetleri de yeniden başlatmanız gerekebilir fuser -vm /oldroot. LVM sürücüsünü 7. Adımın altında yeniden boyutlandıramadığınızı tespit ederseniz deneyin systemctl restart systemd-udevd.

    Bazı işlemler basit yollarla ele alınamaz systemctl restart. Benim için bunlar auditd(öldürülmekten hoşlanmayan systemctlve bu yüzden sadece bir tane istemek kill -15) dahil edildi. Bunlar ayrı ayrı ele alınabilir.

    Genellikle bulacağınız son işlem systemdkendisidir. Bunun için koşun systemctl daemon-reexec.

    İşiniz bittiğinde, masa şöyle görünmelidir:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
    
  7. Eski kökünün bağlantısını kes

    umount /oldroot
    

    Bu noktada, istediğiniz herhangi bir manipülasyonu gerçekleştirebilirsiniz. Asıl soru basit bir resize2fsçağrıya ihtiyaç duyuyordu , ama burada ne istersen yapabilirsin; Diğer bir kullanım senaryosu ise kök dosya sistemini basit bir bölümden LVM / RAID / ne olursa olsun aktarmak.

  8. Kökü geri döndürün

    mount <blockdev> /oldroot
    mount --make-rprivate / # again
    pivot_root /oldroot /oldroot/tmp/tmproot
    for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
    

    Bu 4. adımın basit bir tersine çevrilmesidir.

  9. Geçici kökünden kurtul

    /tmp/tmprootYerinde kullanmak dışında 5. ve 6. adımları tekrarlayın /oldroot. Sonra:

    umount /tmp/tmproot
    rmdir /tmp/tmproot
    

    Bu bir tmpfs olduğundan, bu noktada geçici kök eter içinde çözünür, bir daha asla görülmez.

  10. Eşyaları tekrar yerine koyun

    Dosya sistemlerini tekrar bağlayın:

    mount -a
    

    Bu noktada, ayrıca 7. adımda yaptığınız ayarlara göre /etc/fstabve güncellemelisiniz grub.cfg.

    Başarısız olan hizmetleri yeniden başlatın:

    systemctl | grep failed
    systemctl restart <whatever>
    

    Paylaşılan alt ağaçlara tekrar izin ver:

    mount --make-rshared /
    

    Durdurulan servis birimlerini başlatın - bu tek komutu kullanabilirsiniz:

    systemctl isolate default.target
    

Ve bitti.

Bu evrimi RHEL4'te gerçekleştiren Andrew Wood'a ve bana eskiyle bağlantı kuran Steve'ye çok teşekkürler.


11
Müthiş cevap. Neredeyse büyülü ve çok açık ve anlaşılır. Herhangi bir sorun olmadan debian VPS ile kullanıldı umount /oldroot/boot(Tabii ki, 6. aşamada elbette). Cevabınızı cevap veya olumsuz cevabı olmayan diğer SE sorularına bağlarım.
vaab

3
Ve çözüldü, konu @ vaab'ın belirtildiği gibi oldu; daha umount /oldroot/bootönce yapmalısınumount /oldroot
ToBeReplaced

3
Önemli olan fiziksel bir konsola ihtiyaç duymadan kök dosya sistemini söküp değiştirmek. Bildiğim kadarıyla, bu bölümü sökerken bir bölümden okuyan bir servisi açık tutmanın yolu yok. Hizmetiniz kök FS'ye dokunmuyorsa, onu mount --movetmpfs kullanarak açık tutabilirsiniz , ancak bu desteklenmiyor.
Tom Hunt,

2
Init daemon'u yeniden başlatmak için işletim sistemi olanaklarını kullanmanız gerekir. Ben sonradan görme hiç kullanmadım ama wiki.ubuntu.com/FoundationsTeam/Specs/... düşündürmektedir telinit uistediğini yapabilir.
Tom Hunt,

3
Ben koştum Ek bir kırışıklık: / tmp sistemimde ramdisktir, bu yüzden monte ramdisk'e ile sona erdi /oldroot/tmpunmounting beni engelledi, /oldrootfakat içinde ortaya çıkmazsa fuserveya lsofçıkışı. Bunu çözmek için sisteme bakmaya biraz zaman aldı ...
Chris Kitching

7

Ne yaptığınızdan eminseniz - bu nedenle deneme yapmazsanız, etkileşimli olmayan ve hızlı olan initrd'ye bağlanabilirsiniz.

Burada Debian tabanlı bir sistem var.

Koduna bakınız: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh

Başka bir örnek var: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh


Bir cevap verirken, cevabın NEDEN olduğuna dair bir açıklama yapmak tercih edilir .
Stephen Rauch

1
Bu sağlam bir yaklaşım. Gerekli manipülasyonları etkileşimli olarak yapmama izin verdiğim için benimkini seviyorum; Ancak, bu muhtemelen daha hızlı. Cevabın içine biraz daha detay vermek veya başka platformları düşünmek iyi olabilir (bu genel yaklaşımın hala dracut veya mkinitcpio veya başka herhangi bir belirsiz modern initramfs üreteci ile çalışacağı görülüyor).
Tom Hunt,

Üzgünüm @ stephen-rauch Sadece infazı değil fikrine işaret ediyordum.
Szépe Viktor,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.