paket yükseltmesinden sonra dosya sistemini salt okunur olarak yeniden bağlayamıyor


10

Debian sistemimde, /ayrı bir bölümüm var ve monte ettim read-only. Sadece /home/, /var/ve /tmp/yazılabilir bulunmaktadır. Ben de bir oluşturduk Pre-Invokeve Post-Invoke apt hookböylece aptpaketlerinin yüklendiğini veya yükseltilmiş ve geri yeniden bağlayın olan yazma için yeniden bağlama sistemi otomatik can read-onlyzaman bitmiş:

DPkg::Pre-Invoke  {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount    / ;};

Tüm kurulum tek bir istisna dışında iyi çalışır. Bazen yükleme / yükseltme işlemi sırasında bazı servisler yeniden başlatılmalı veya kısa pencerede takıldığımda yeni dosyalar /açılmalıdır read-write, bu dosyalar writeizinlerle açılır . Yükleme / Yükseltme tamamlandıktan sonra, benim Post-Invokekanca döner hata değil remount can çünkü /geri read-only.

Bu sorunu çözmenin bir yolu var mı? Bu çok sinir bozucu, çünkü bu durumda genellikle sunucuyu yeniden başlatmam gerekir, ki bu pratik değildir.

DÜZENLE

Aşağıda, açıklanan hatayla sonuçlanan en son paket güncellememin bir günlüğü yer almaktadır:

root@alpha# apt-get upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  base-files curl libc-bin libc6 libcurl3 libcurl3-gnutls libmysqlclient18 libssl1.0.0 locales multiarch-support mysql-client mysql-client-5.5 mysql-common
  nscd openssl tzdata wget whois
18 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 264 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Fetched 18.7 MB in 0s (33.2 MB/s) 
Preconfiguring packages ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace base-files 7.1wheezy3 (using .../base-files_7.1wheezy4_amd64.deb) ...
Unpacking replacement base-files ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up base-files (7.1wheezy4) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38 (using .../libc-bin_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc6:amd64 2.13-38 (using .../libc6_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc6:amd64 ...
Setting up libc6:amd64 (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libssl1.0.0:amd64 1.0.1e-2+deb7u1 (using .../libssl1.0.0_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement libssl1.0.0:amd64 ...
Preparing to replace curl 7.26.0-1+wheezy7 (using .../curl_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement curl ...
Preparing to replace libcurl3:amd64 7.26.0-1+wheezy7 (using .../libcurl3_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3:amd64 ...
Preparing to replace libcurl3-gnutls:amd64 7.26.0-1+wheezy7 (using .../libcurl3-gnutls_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3-gnutls:amd64 ...
Preparing to replace mysql-common 5.5.33+dfsg-0+wheezy1 (using .../mysql-common_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient18:amd64 5.5.33+dfsg-0+wheezy1 (using .../libmysqlclient18_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement libmysqlclient18:amd64 ...
Preparing to replace multiarch-support 2.13-38 (using .../multiarch-support_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement multiarch-support ...
Processing triggers for man-db ...
Setting up multiarch-support (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace tzdata 2013h-0wheezy1 (using .../tzdata_2013i-0wheezy1_all.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2013i-0wheezy1) ...

Current default time zone: 'Europe/London'
Local time is now:      Sat Feb 15 11:35:41 CET 2014.
Universal Time is now:  Sat Feb 15 11:35:41 UTC 2014.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

(Reading database ... 20511 files and directories currently installed.)
Preparing to replace wget 1.13.4-3 (using .../wget_1.13.4-3+deb7u1_amd64.deb) ...
Unpacking replacement wget ...
Preparing to replace locales 2.13-38 (using .../locales_2.13-38+deb7u1_all.deb) ...
Unpacking replacement locales ...
Preparing to replace whois 5.0.23 (using .../whois_5.1.1~deb7u1_amd64.deb) ...
Unpacking replacement whois ...
Preparing to replace mysql-client 5.5.33+dfsg-0+wheezy1 (using .../mysql-client_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-client ...
Preparing to replace mysql-client-5.5 5.5.33+dfsg-0+wheezy1 (using .../mysql-client-5.5_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement mysql-client-5.5 ...
Preparing to replace nscd 2.13-38 (using .../nscd_2.13-38+deb7u1_amd64.deb) ...
[ ok ] Stopping Name Service Cache Daemon: nscd.
Unpacking replacement nscd ...
Preparing to replace openssl 1.0.1e-2+deb7u1 (using .../openssl_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement openssl ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up libssl1.0.0:amd64 (1.0.1e-2+deb7u4) ...
Setting up libcurl3:amd64 (7.26.0-1+wheezy8) ...
Setting up curl (7.26.0-1+wheezy8) ...
Setting up libcurl3-gnutls:amd64 (7.26.0-1+wheezy8) ...
Setting up mysql-common (5.5.35+dfsg-0+wheezy1) ...
Setting up libmysqlclient18:amd64 (5.5.35+dfsg-0+wheezy1) ...
Setting up wget (1.13.4-3+deb7u1) ...
Setting up locales (2.13-38+deb7u1) ...
Generating locales (this might take a while)...
  en_DK.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Setting up whois (5.1.1~deb7u1) ...
Setting up mysql-client-5.5 (5.5.35+dfsg-0+wheezy1) ...
Setting up mysql-client (5.5.35+dfsg-0+wheezy1) ...
Setting up nscd (2.13-38+deb7u1) ...
[ ok ] Starting Name Service Cache Daemon: nscd.
Setting up openssl (1.0.1e-2+deb7u4) ...
mount: / is busy

Son satır ( mount: / is busy) yeniden bağlayın çalışırken, apt tarafından döndürülen hatadır /geri read-only.

GÜNCELLEME:

tarafından önerilen komut Graemehiçbir dosya göstermiyor:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

Dosyaların açılmasını önlemek read-writeveya yeniden yüklerken roveya engelleme paketlerini bulmak ve değiştirmek için sunucuyu yeniden başlatmak zorunda kalmanın bir yolunu mu arıyorsunuz? Ya da bir çözüm olarak kabul edilebilir mi?
Anthon

İdeal olarak, dosyaların rwilk etapta açılmasını önlemek istiyorum . Ancak yeniden robaşlatmadan yeniden bağlanmamı sağlayacak herhangi bir çözüm de iyidir.
Martin Vegter

Rahatsız edici hizmetleri durdurun, yeniden takın, yeniden başlatın?
frostschutz

@martin rahatsız edici hizmetlere zaten bir genel bakışın var mı? Sunulan kurulumu beğendim ve bunu bir sanal makinede deneyeceğim, ancak sistemimde denemelerimi sadece kısmen alakalı hale getirecek varsayılan olmayan bir şey çalıştırmadığınızı bilmek güzel olurdu.
Anthon

@Anthon Sorunlu servislerin hangileri olduğunu bilmiyorum. Ancak açıklama için yukarıdaki EDIT'ime bakın. Sunucum da bir sanal makine. Yalnızca birkaç hizmetin çalıştığı asgari bir kurulumdur.
Martin Vegter

Yanıtlar:


2

Benim tahminim sadece hizmetler değil, kök dosya sisteminin içine / home ve / var gibi başka dosya sistemlerine sahip olmanızdır. Bu bir yana, kazabileceğim en iyi çözüm burada özetlenmiştir:

https://sites.google.com/site/linuxpendrive/rorootfs

Salt okunur bir dosya sistemine paketleri nasıl kurabilirim / kaldırabilirim? Özetle, paket yöneticisini kullanmadan önce hedef dosya sistemini yeniden monte etmeyi ve ardından yeni bağlantının içine almayı içerir.

Diğer yanıtlardan birinde ana hatlarıyla verilen öneri, paket dosya güncellemeleri için kök dosya sistemi rw olarak yeniden takıldığında ne olacağına dair varsayımlar yapar, bu nedenle Debian varsayılandan farklı bir davranış sergiliyorsa bu çözüm Debian'ı çalışmayabilir. Ama hey, denemeye değer, sanırım ...


1

Bunun kesin bir cevabına yaklaşmak için, hangi dosyaların mount: / is busyhataya neden olduğunu görmemiz gerekir . Bunu aşağıdakilerle yapabilirsiniz:

lsof / | awk 'NR==1 || $4~/[0-9][uw]/'

OP'nin diğer sorusuna - lsof: dosyaları okuma-yazma olarak aç - göster. Bir şey görmek için bunu ayrı bir komut dosyasına ve komut dosyasını apt çengeline koymanız gerekebilir.

Şüphem, /etchizmetler başlatıldığında altındaki dosyaların açık kalmasıdır. Bazı programlar / artalanlar yapılandırmalarını dinamik olarak günceller. NetworkManagerve cupsdiki örnektir. Yeni yazıcıların taranmasına cupsneden olan güncellemeler cupsd(bir dpkgyapılandırma komut dosyasının aksine ), soruna neden olan şey olabilir. /etcSorununuzun kaynağı olmasa bile yazılabilir bir dosya sistemi kullanmanızı öneririm .

Başka bir olasılık ise, yeniden başlatmayı denediğinizde dosya sistemi arabelleğinin hala diske aktarılma sürecinde olmasıdır. mountIO tamamlanıncaya kadar engellemek veya başarısız ve diski meşgul olarak bildirmek için davranış ne burada olduğundan emin değilim . İlk daha muhtemel görünüyor, ancak syncçıkışında hiçbir çağrı görmüyorum strace(muhtemelen mountsistem çağrısı bunu yapıyor olsa da ). Her neyse, yukarıdakilerin hiçbir şey göstermemesi syncdurumunda, yeniden montajdan önce bir işlem yapmak işe yarayabilir lsof, örneğin:

DPkg::Post-Invoke { "sync; mount -o remount /"; };

bu tuhaf. Sizin lsofkomut dosyaları listelemiyor
Martin Vegter

1
İlginç bir şey de, bellek eşlemeli dosyaların yazma üzerine kopyalanabilmesidir. Bunun montajı nasıl etkilediğini bilmiyorum, ayrıca emin değilim lsofve bunu bile gösterdim. Kancanla koşmayı denedin lsofmi? Ne dersin sync?
Graeme
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.