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.
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....
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...
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 /root
veya /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.
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 /run
ve bu nedenle çalışan işlemleri yakınlaştıramazlar.
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
.
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 $PID
her 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 /oldroot
daha sonra systemctl restart
bunları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 systemctl
ve bu yüzden sadece bir tane istemek kill -15
) dahil edildi. Bunlar ayrı ayrı ele alınabilir.
Genellikle bulacağınız son işlem systemd
kendisidir. 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
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.
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.
Geçici kökünden kurtul
/tmp/tmproot
Yerinde 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.
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/fstab
ve 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.