Paket yükseltmesinden sonra yeniden okunamıyor / salt okunur olarak geri yüklenemiyor


13

Debian Stretch kullanıyorum. Kök bölümüm takılı read-only. Sadece ben paketi kurma ve yükseltirken, bir /karşı yeniden monte read-write(apt kanca kullanarak) ve sonra geri remounted ro.

Bazen paket yükseltmesinden sonra /salt okunur olarak yeniden takamıyorum :

mount -o remount,ro /
mount: / is busy

Eski Debian sürümlerinde (Wheezy), bağlantısı kaldırılmış olan açık dosyaları listeleyebilirim lsof:

 lsof +L1

veya daha spesifik olarak, /yeniden roya dönüştürülmesini engelleyen dosyalar :

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

Ancak, Debian Stretch'te lsof +L1herhangi bir dosya listelemez.

Ben herhangi bir değişiklik görmüyorum +|-Liçinde man lsofçalışma durduruldu açıklıyor söyledi.

Neden lsof + L1 artık bağlantısı kaldırılmış olan açık dosyaları listelemiyor?

Yeniden okunmasını engelleyen / salt okunur olan dosyaları nasıl listeleyebilirim?

GÜNCELLEME

Ben durdurulabilir tüm işlemleri durduruldu ve sadece var initve gettyhala çalışıyor, ama yine de değil remount can /için ro.


Bağlantısı kaldırılmış açık dosyalar tek engel değil. Arayın wveya uiçinde FDsütun lsofçıkış veya için Fçıktısında fuser -vm /örneğin. Yine de, size kapsamlı bir liste veremem. Ayrıca needrestart paketini de kurmak isteyebilirsiniz .
Ferenc Wágner

ama aptalca bir soru rootmu yapıyorsun ?
Kiwy

1
Kiwy - evet, kök olarak yürütüyorum.
Martin Vegter

1
gelmez fuser -m / kök kullanarak hangi söyle?
Rui F Ribeiro

1
@Marcus Linsner - systemd kullanmıyorum. İnit kullanıyorum.
Martin Vegter

Yanıtlar:


2

Yeniden okunmasını engelleyen / salt okunur olan dosyaları nasıl listeleyebilirim?

A) fuserbulunabilir psmiscpaketi; Bu, fuserparıltı bulduğum ve daha kullanışlı bir kullanım durumudur lsof.

# fuser -v -m / 2>&1 | grep '[Ff]r.e'

Bu, okuma (f) ve yazma (F) için / için dosyaları açık olan tüm işlemleri gösterecektir. Yeniden okunmasını önleyen / salt okunur olan dosyalar (F) yazmak için açılan dosyalardır.

Yazmaya açık kök dizin dosyaları ile çalıştırılan yürütülebilir bir işlemi öldür .

# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done

systemdBir uyarı ile yorumların üstünde . Eğer systemdbir initsonra fuseronu görmek ve diğer hususlar vardır olacaktır. İle systemdonlar sadece tespit edilip ile öldürülmüş bile çalışan, bu (yeniden), arkanda süreçleri başlatabilir fuser. systemdgeleneksel olandan çok daha gelişmiş sysvinit.

B) Açıklamadaki GÜNCELLEME sistemin sadece ... initve gettyhala çalıştığını ... belirtir .

Sistemin kullanmadığını systemd, kullandığını söyleyen yorumu görüyorum init. Streç, systemd öyle init . Yorum açıkça söylemedi sysvinitvarsayılan streç kullanıyor olabilir, söz konusu sistemin farz ediyorum, böylece systemdiçin init. Ya da bu yazıya systemdrastlayan, streç kullanan diğer insanlar bu kısmı faydalı buluyorlar.

Başına Debian Wiki ,

Sistem başlatma işlemi init arka plan programı tarafından gerçekleştirilir. Sıkıştırılmış ve önceki sürümlerde, bu daemon sysvinit paketi tarafından sağlanır ve hiçbir alternatif desteklenmez. Gelen hışıltılı varsayılan init cin hala,sysvinit ama systemd bir "teknoloji önizlemesi" mevcuttur. Gelen jessie ve streç , varsayılan init sistemidirsystemd , ama sysvinit için anahtarlama desteklenir.

Jessie beri, sadece systemd tamamen desteklenir; sysvinit çoğunlukla desteklenir, ancak Debian paketlerinin sysvinit başlangıç ​​komut dosyaları sağlaması gerekmez. runit de paketlenmiştir, ancak diğerleriyle aynı düzeyde test ve destek almamıştır ve şu anda PID 1 olarak desteklenmemektedir.

İle systemdçalışan, bu sorun olmadan yeniden monte edilebilmesi için / boşaltmak için alınması gereken birkaç ek adımlar vardır.

Muhtemelen veya (ikisi de soket bağımlılığı olan) system.sliceiçin açık dosyalar tutuyor . Veya çalışıyorsa , / var / ... (& / var / her zaman kendi cihazı değildir), vb. Kiralamaları yeniden yazabilir , vb. Bulabilir ve öldürebilir, ancak hemen yedeklemeye başlayabilir. systemd-journald.servicesystemd-udevd.serviceNetworkManagerdhclientfuserdhclientNetworkManager

Ahlaki bir çok şey otomatik olabilir 'isteyebilir' / (ve hatta daha fazla systemd).

Emin olmak için, mümkünse systemd, çalışma seviyesi 1'in eşdeğeri ile eşleştirilir rescue.target(ve runlevel1.targetsimgesel bir bağlantıdır rescue.target).

1) Sistemi izole ederek rescue.target

# systemctl isolate rescue.target

Sizden kök parolayı girmeniz istenmelidir; ekrandaki talimatları izleyin.

2) Kurtarma kabuğunda ne istediğini öğrenin.

# systemctl show -p Wants /

Genellikle system.slice; İsteyen herşeyi durdur. Örneğin

# systemctl stop system.slice

3) Bu noktada, yeniden bağlama gerekir değil rapor mount: / is busyve mount -o remount,ro / gerektiği çalışır. Değilse, ile tekrar kontrol edin fuser.

4) FWIW; Ayrıca umountbaşka bir bağlantının alt dizinine başka bir aygıt bağlandığında / yani iç içe bağlanmalarda başarısız olduğunda da gördüm . Örneğin, / var / veya / boot / başka bir aygıtta (ve umount /takılıysa) başarısız olur . Yine de bu durumda çalışması gerekir.mount -o remount,ro /

lsblk yuvalanmış bağları görselleştirmek için yardımcı olabilir.

Neden lsof + L1 artık bağlantısı kaldırılmış olan açık dosyaları listelemiyor?

Kullanılabilir olmadıkları için (soketler veya çoğu FIFO ve boru) artık dosya açmıyorlar (üst süreç dosya tanımlayıcıyı kapattı) veya (hala) 1'den büyük bir bağlantı sayısı var.

erkek lsof (8) detayları ...

+ | -L [l]

Bu seçenek, kullanılabilir olduklarında dosya bağlantı sayılarının listelenmesini etkinleştirir ('+') veya devre dışı bırakır ('-') - örneğin, soketler veya çoğu FIFO ve boru için kullanılamaz.

Aşağıdaki numara olmadan + L belirtildiğinde, tüm bağlantı sayıları listelenir. -L belirtildiğinde (varsayılan), hiçbir bağlantı sayısı listelenmez.

+ L'yi bir sayı izlediğinde, yalnızca bağlantı sayısı o sayıdan az olan dosyalar listelenir . (Hiçbir sayı -L'yi izleyemez.) '' + L1 '' formunun bir belirtimi, bağlantısı kaldırılmış olan açık dosyaları seçer. Formun bir belirtimi +aL1 <file_system>, belirtilen dosya sistemindeki bağlantısız açık dosyaları seçer.


0

/procMonte ettin mi?

Görünüşe göre /çoğu zaman salt okunur monte edilmeye özen gösteren biri olarak, procfs monte etmemeyi de seçebileceğinizi hayal edebiliyorum. Ancak lsofaçık dosyaları bulmak için gereklidir .

İşlemler tarafından açık tutulan dosyalar, procfs'deki sembolik bağlantılar aracılığıyla çekirdek tarafından gösterilir. Dizinler /proc/<pid>/fd, açık tutulan her dosya için bir sembolik bağlantı içerir. Simge bağlantılarının adı dosya tanımlayıcı numaralarıdır ve simge bağlantısının başvurduğu yol dosya yoludur.

/procHalihazırda silinmiş olan açık dosyalar için sarkan semboller hala kalır . Ve dosyanın başvurulan yolu "(silinmiş)" ile bitecek şekilde yeniden adlandırılır.

Ne lsof +L1yaptığı gibi hızlıca tek astarından esasen farklı değildir:

stat -c%N /proc/[0-9]*/fd/* | grep deleted

Böylece, kök dosya sisteminin yeniden çalışmasını engelleyebilecek (çalışma sağlanmışsa ) açık olan tüm dosyaları listelemek için benzer bir astar kullanabilirsiniz /proc.

Ancak /procmonte ettiyseniz / yaptıysanız , aklıma gelen tek neden hatalar ... Her neyse, FYI, şu anki Debian Stretch sistemimde. lsof +L1beklendiği gibi çalışır.

bash# lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)

bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux

bash# lsof -v
lsof version information:
    revision: 4.89
    [...]

evet, /procmonte ettim . Neden sahip olamayacağımı düşünmene uymuyorum. Her neyse, stat -c%N /proc/[0-9]*/fd/* | grep deletedbana hiçbir şey göstermiyor.
Martin Vegter

0

Bu sorunu sadece bir kez çoğaltabilir ve sadece -n seçeneği mountile çözebilirim .

Adam montaj alıntı :

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

mountİçin dosya (lar) ı açarak programın kendisi yazmaya kök dosya sisteminde bana bir mantıklı açıklama gibi geldi. Sonuçta özellikle mountyazar /etc/mtabve /etcgenellikle kök dosya sisteminin bir parçasıdır. Ancak bir kez yaptıktan sonra aynı makinede tekrar üretemedim ...

Bu sorununuzu çözebilir mi?


hayır, -nmount ile kullanmak fark etmez.
Martin Vegter

0

Sisteminizin görünürlüğü olmadan, sorunun tam olarak ne olduğunu söylemek çok zordur. Yorumlar ve önceki cevaplar iyi bir başlangıç.

Yani, prereq'in sadece montaj / okuma için açıkladığı debian wiki'ye kadar geri gideceğim dedi.

Belgelerin bağlantısı burada: https://wiki.debian.org/ReadonlyRoot

Büyük olan, sizi buradan geçireceğim:

1 - / altında okunması gereken belirli yerler vardır. Belgelere dayanarak şöyle görünür:

debian ro kökü

blok cihazlarınız muhtemelen depolama yığını yapılandırmanıza (bölümler, bölümsüz lvm vb.) bağlı olarak farklı olacaktır, ancak ana fikir, RW montaj seçeneğine sahip olmak için sonraki monte edilmiş dosya sistemine sahip olmak için bu 4 bağlama noktasına ihtiyaç duymanızdır.

2 - / etc içinde, ya da başka bir değişiklik için sembolik bir bağlantı oluşturmanız ya da başka bir değişiklik (özellikle bağlantılı makalede ayrıntılı olarak verilmiştir) uygulamanız gereken bir dizi özel dosya vardır. Bunlar, linux sunucunuzun hangi uygulamalarda çalıştığına bağlı olarak geçerli olabilir veya olmayabilir. bazı dosyalar makinenizde bulunmayabilir, ancak her şeyi dokümanlara ekledim. Unutmayın, sürecin pid'ini öldürdüyseniz, bu değişiklikleri BİLE YAPMAYINIZ. Doğrudan debian wiki'den yollar:

  • adjtime
  • init.d. / alsa-utils
  • / Etc / kurye / paylaşılan / index
  • herhangi bir bardak durumu dosyaları, classes.conf, cupsd.conf, yazıcılar.conf abonelikleri.conf
  • /etc/lvm/lvm.conf
  • mtab (-n bayrağını vererek adreslemeye çalıştığınız anlaşılıyor)
  • ağ / çalıştırma (ifup ve ifdown tarafından sıkıştırılmış olarak kullanılır. streç, ymmv için geçerli olmayabilir)
  • nologin
  • resolv.conf
  • hem passwd hem de shadow dosyaları
  • samba / dhcp.conf
  • emmek
  • udev

Yukarıdakilerin tümünü kontrol ettikten ve wiki'deki spesifikasyona uygun olduklarını onayladıktan sonra, kontrol edilecek bir sonraki şey /etc/apt/apt.conf

DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
}; 

hatanıza bağlı olarak, belgelere dayalı olarak kontrol edebileceğiniz son şey aşağıdakilerden gelir:

Msgstr "Paketlerin yükseltilmesinden sonra, mount'un dosya sistemine tekrar" / meşgul "olduğunu söylemeyi yeniden göndermeyi reddetmesi sorunuyla karşı karşıya kalabilirsiniz. Bunun nedeni, bir işlem tarafından kullanılmaya devam ettikleri silinmiş dosyalardır.Geçilen işlemlerin silinen dosyaları kullandığını bulmak için debian-goodies paketinden checkrestart (1) aracını kullanın veya aşağıdaki komutu kullanın.Genellikle bunlar yükseltilmiş kitaplıkları kullanan cinlerdir. dosyaları serbest bırakmak için onları yeniden başlatmak zorunda. "

doc'de verilen komut:

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

Tam dosya sistemi yapılandırmanızı, ayrıştırma ve depolama aygıtı yapılandırmanızı bilmeden, takip etmeniz gereken çok şey vermek zor. Ben geri gidiş ve önkoşul belgelerinde (ve yukarıda özetlenen) yeniden kontrol ile başlar.

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.