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-Invoke
dan Post-Invoke
apt hook
, sehingga apt
dapat secara otomatis mengount ulang sistem untuk menulis, ketika paket diinstal atau ditingkatkan, dan kembalikan ke read-only
saat 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 write
izin. Setelah instalasi / peningkatan selesai, Post-Invoke
hook 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 Graeme
tidak menampilkan file apa pun:
# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
read-write
, atau harus me-reboot server saat dapat melakukan remountro
, atau menemukan dan mengubah paket pemblokiran? Atau apakah akan diterima sebagai solusi?rw
di tempat pertama. Tetapi setiap solusi yang memungkinkan saya untuk melakukan remountro
tanpa restart juga bagus.Jawaban:
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 ...
sumber
Untuk mendekati jawaban pasti untuk ini, kita perlu melihat file mana yang menyebabkan
mount: / is busy
kesalahan. Anda dapat melakukan ini dengan: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
/etc
tetap terbuka setelah layanan dimulai. Beberapa program / daemon memperbarui konfigurasinya secara dinamis.NetworkManager
dancupsd
dua contoh. Pembaruancups
yang menyebabkancupsd
pemindaian untuk printer baru (tidak sepertidpkg
skrip konfigurasi) mungkin menjadi penyebab masalah Anda. Saya sarankan Anda memakai/etc
sistem 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
mount
sini, apakah itu memblokir sampai IO selesai atau gagal dan melaporkan disk sebagai sibuk. Yang pertama tampaknya lebih mungkin, tetapi saya tidak melihatsync
panggilan dalam outputstrace
(walaupun mungkinmount
panggilan sistem melakukan ini). Lagi pula, mungkin berhasil melakukansync
sebelum remount jika hal dilsof
atas tidak menunjukkan apa-apa, misalnya:sumber
lsof
perintah tidak mencantumkan file apapunlsof
dan bahkan menunjukkan ini. Apakah Anda mencoba berlarilsof
dengan kail Anda? Bagaimana dengansync
barangnya?