tidak dapat mengembalikan sistem file kembali menjadi hanya-baca setelah peningkatan paket

10

Pada sistem Debian saya, saya memiliki /partisi terpisah dan terpasang read-only. Hanya /home/, /var/dan /tmp/dapat ditulis. Saya juga telah membuat a Pre-Invokedan Post-Invoke apt hook, sehingga aptdapat secara otomatis mengount ulang sistem untuk menulis, ketika paket diinstal atau ditingkatkan, dan kembalikan ke read-onlysaat selesai:

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

Seluruh pengaturan ini berfungsi baik dengan satu pengecualian. Kadang-kadang selama proses instalasi / upgrade beberapa layanan perlu di-restart atau file baru dibuka selama jendela pendek ketika saya di /-mount read-write, file-file ini dibuka dengan writeizin. Setelah instalasi / peningkatan selesai, Post-Invokehook saya mengembalikan kesalahan karena tidak dapat dipasang /kembali read-only.

Apakah ada cara untuk mengatasi masalah ini? Ini sangat menjengkelkan, karena dalam situasi ini saya biasanya harus me-restart server, yang tidak praktis.

EDIT

Di bawah ini adalah log pemutakhiran paket terbaru saya, yang menghasilkan kesalahan yang dijelaskan:

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

Baris terakhir ( mount: / is busy) adalah kesalahan yang dikembalikan oleh apt, ketika mencoba untuk mengirim /kembali ke read-only.

MEMPERBARUI:

perintah yang disarankan oleh Graemetidak menampilkan file apa pun:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
Martin Vegter
sumber
Apakah Anda mencari cara untuk mencegah file tidak dibuka read-write, atau harus me-reboot server saat dapat melakukan remount ro, atau menemukan dan mengubah paket pemblokiran? Atau apakah akan diterima sebagai solusi?
Anthon
Idealnya, saya ingin mencegah file dibuka rwdi tempat pertama. Tetapi setiap solusi yang memungkinkan saya untuk melakukan remount rotanpa restart juga bagus.
Martin Vegter
Hentikan layanan yang menyinggung, remount, mulai lagi?
frostschutz
@martin apakah Anda sudah memiliki gambaran umum layanan yang menyinggung? Saya suka pengaturan yang Anda sajikan dan akan mencobanya di VM, tetapi alangkah baiknya jika Anda tidak menjalankan sesuatu yang non-default pada sistem Anda yang akan membuat eksperimen saya hanya sebagian yang relevan.
Anthon
@ Anonim Saya tidak tahu layanan mana yang menyinggung. Tetapi lihat EDIT saya di atas untuk klarifikasi. Server saya juga VM. Ini adalah instalasi minimal dengan hanya beberapa layanan yang berjalan.
Martin Vegter

Jawaban:

2

Dugaan saya adalah bahwa ini bukan hanya layanan, ini adalah fakta bahwa Anda memiliki sistem file lain, seperti / home dan / var, yang dipasang di dalam sistem file root. Selain itu, solusi terbaik yang bisa saya gali dijelaskan di sini:

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

Cari bagian yang berjudul Bagaimana cara saya menginstal / menghapus paket pada sistem file hanya baca? Singkatnya itu melibatkan remount sistem file target dan kemudian chroot ke mount baru, sebelum menggunakan manajer paket.

Saran, yang diuraikan dalam salah satu jawaban lain, membuat asumsi tentang apa yang terjadi ketika root filesystem dihitung ulang untuk pembaruan paket, sehingga solusi ini mungkin tidak benar-benar berfungsi Debian, jika Debian menunjukkan perilaku yang berbeda dari apa yang diasumsikan. Tapi hei, itu layak dicoba, saya pikir ...

Rouben Tchakhmakhtchian
sumber
1

Untuk mendekati jawaban pasti untuk ini, kita perlu melihat file mana yang menyebabkan mount: / is busykesalahan. Anda dapat melakukan ini dengan:

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

Lihat jawaban saya untuk pertanyaan OP lainnya - lsof: tampilkan file terbuka sebagai baca-tulis - untuk peringatan ini. Mungkin Anda perlu memasukkan ini ke dalam skrip terpisah dan memasukkan skrip ke dalam kait yang tepat untuk melihat sesuatu.

Kecurigaan saya adalah bahwa file-file di bawah /etctetap terbuka setelah layanan dimulai. Beberapa program / daemon memperbarui konfigurasinya secara dinamis. NetworkManagerdan cupsddua contoh. Pembaruan cupsyang menyebabkan cupsdpemindaian untuk printer baru (tidak seperti dpkgskrip konfigurasi) mungkin menjadi penyebab masalah Anda. Saya sarankan Anda memakai /etcsistem file yang dapat ditulisi, meskipun itu bukan sumber masalah Anda.

Kemungkinan lain adalah bahwa buffer filesystem masih dalam proses untuk mem-flush ke disk ketika Anda mencoba melakukan remount. Saya tidak yakin untuk apa perilaku di mountsini, apakah itu memblokir sampai IO selesai atau gagal dan melaporkan disk sebagai sibuk. Yang pertama tampaknya lebih mungkin, tetapi saya tidak melihat syncpanggilan dalam output strace(walaupun mungkin mountpanggilan sistem melakukan ini). Lagi pula, mungkin berhasil melakukan syncsebelum remount jika hal di lsofatas tidak menunjukkan apa-apa, misalnya:

DPkg::Post-Invoke { "sync; mount -o remount /"; };
Graeme
sumber
ini aneh. Anda lsofperintah tidak mencantumkan file apapun
Martin Vegter
1
Yang menarik, satu hal lagi adalah bahwa file yang dipetakan memori dapat di-copy-on-write. Saya tidak tahu bagaimana ini mempengaruhi pemasangan, ditambah saya tidak yakin lsofdan bahkan menunjukkan ini. Apakah Anda mencoba berlari lsofdengan kail Anda? Bagaimana dengan syncbarangnya?
Graeme