Neden kötü bir `rm`dan sonra makinemi kapattım, dosyalarımı sakladı?


31

Klasik durum: Kötü bir koştum rmve hemen sonra yanlış dosyaları kaldırdığımı farkettim. (Kritik bir şey yok ve son derece tolere edilebilir yedeklemelerim vardı ama yine de sinir bozucuyum.)

Daha fazla disk etkinliğinin düşmanı olduğumu bilerek dosyaları extundeleteya da böyle araçları kullanarak kurtarmak istediğimde , makineyi derhal fiziksel olarak kapattım (örneğin, güç düğmesiyle değil, haltböyle bir komutla). Bu, çalışan ya da açık olan önemli bir işi olmayan bir dizüstü bilgisayardı, bu yüzden kabul edilebilir bir işlemdi. (Bu arada, kayıp dosyaları hala bir işlemle açılabilir eğer böyle bir durumda yapılması gereken ilk şey, ilk tahmin etmek olacağını o zamandan beri öğrenilen https://unix.stackexchange.com/a/101247 - eğer öyleyse, makineyi kapatmak yerine onları bu şekilde kurtarmalısınız.)

Yine de, makine kapatıldıktan sonra bir süre düşündüm ve dosyaların doğru adli tıp için canlı bir sistemi önyüklemeye zaman ayırmaya değmediğine karar verdim. Bu yüzden makineyi tekrar çalıştırdım. Sonra dosyalarımın hala diskte oturduğunu keşfettim: rmkapatılmadan önce diske aktarılmadı. Biraz dans ettim ve beklenmedik affetmesi için sysadmins tanrısına teşekkür ettim.

Benim sorum şu, bunun nasıl mümkün olduğunu ve rmaslında bir diske yayılmadan önceki tipik gecikmenin ne olduğunu anlamak . Diskin IO'nun hemen boşaltılmadığını ama bir süre bellekte oturduğunu biliyorum, ancak disk günlüğünün beklemedeki işlemlerin tamamen kaybolmadığından hemen emin olacağını düşündüm. https://unix.stackexchange.com/a/78766 , kirli sayfaları temizlemek ve günlük işlemlerini temizlemek için ayrı bir mekanizmaya işaret ediyor gibi gözüküyor, ancak derginin a'ya nasıl dahil olacağı rmve daha önce beklenen gecikme hakkında yeterli ayrıntı vermiyor işlemler kızardı.

Bazı detaylar: veriler LUKS biriminin içindeki ext4 bölümündeydi ve makineyi yeniden başlatırken aşağıdakileri gördüm syslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

ama bununla ilgili olduğundan emin değilim rm.

Başka bir soru, çekirdeği, makineyi kapatmak yerine, beklemedeki disk işlemlerinin hiçbirini gerçekleştirmemesini (ancak bir yere dökmelerini) söylemenin bir yolu olup olmadığıdır. (Tabii ki, beklemedeki işlemleri gerçekleştirmemek tehlikeli gibi görünüyor, ancak makineyi kapattığınızda ne olacağı ve bu bazı durumlarda sizi kurtarabilir.) Bu elbette "temizleyici" ve ilginç olurdu örneğin, fiziksel güç kaynağının kolay bir seçenek olmadığı uzak sunucular için.

Yanıtlar:


22

Olanları iyi kavramış gibisin.

Evet, değişiklikleriniz diske yüklenmeden önce sistemi kapattığınız için, yeniden başlattığınızda oradalardı.

Sistem diski temizlemeden önce tüm yazıları önbelleğe alır. Bu davranışı kontrol eden, hepsi /proc/sys/vm/dirty_* [ çekirdek doc ] 'da bulunan birkaç seçenek vardır . Bir yıkama işlemi bir uygulama tarafından açıkça yapılmazsafsync() [ man 2 fsync ] , veriler yeterince eski olduğunda veya yazma önbelleği doldurulduğunda işlenir.
Yukarıda kullanıldığı şekliyle "data" tanımı, dosyayı silmek için dizin girişinde değişiklik yapılmasını içerir.

Şimdi, dergi gelince, bu derginin ne için olduğuna dair yaygın yanılgılardan biri. Derginin amacı değişikliklerin tekrarlanmasını sağlamak veya verilerin kaybolmamasını sağlamaktır. Bir derginin amacı, içindeki dosyaların değil, dosya sisteminin bozulmasını önlemektir. Dergi, sadece yapılan değişikliklerle ilgili bilgileri içerir ve değişimin kendisinin verilerini (genellikle) içermez. Kesin detaylar dosya sistemine ve günlük moduna bağlıdır. Ext3 / 4 için, datamount seçeneğine bakın man 8 mount.


Bekleyen yazmaları yeniden başlatmadan engellemenin bir yolu olup olmadığına ilişkin ek sorunuza cevap vermek için:

Çekirdek kaynak kodu ile hızlı bir okuma yapmaktan sonra, acil bir remount-salt okunur işlem yapmak için magic sysrq ukomutunu ([ wikipedia ], [ kernel doc ]) kullanabiliyorsunuz gibi görünüyor . Görünüşe göre bu hemen tüm hacimleri salt okunur olarak yeniden birleştirecek bir senkronizasyon işlemi olmadan .

Bunu kullanmak için sadece Alt+ SysRq+ tuşlarına basın u.


1
Bu cevap için teşekkürler! Hala dergi hakkında biraz kafam karıştı: Ben sadece değişiklikler diske atıldığında karışacak bir şey olarak mı düşünmeliyim ki, yazma önbelleği, rmyazılmadan önce ödemesiz zamanı tahmin edebilecek tek ilgili mekanizma mı? Başka bir deyişle, işler yalnızca bir yazı hemen hemen yapılmak üzereyken dergiye yapılır mı? Yoksa resim bundan daha mı karmaşık? Alt-sysrq-u gelince, bu oldukça zarif bir fikir. "Görünüyor" iddiası için vermeniz gereken bir referans var mı? (Verdiğiniz linklerden takip ediyor gibi görünmüyor.) Teşekkürler! :)
a3nm

Ayrıca, sihirli sysrq, uzaktaki bir makinede hala yapamayacağınız bir sınırlamaya sahiptir.
a3nm

3
@A3NM Uzak bir makinede sysrq kullanabilirsiniz. echo u > /proc/sysrq-trigger(önce etkinleştirmeniz gerekebilir).
Paulo Almeida

Dergi, yalnızca dosya sistemi meta verileriyle (varsayılan olarak tam olarak değiştirilebilir) dosya içeriğiyle ilgilenmez, ancak bu durumda , dizin girişini kaldırmakla ilgilendiğimiz için dosyayı silebilirdi . Bu nedenle, dergi ya dosyanın var olduğunu (önceki içerikleriyle birlikte, başka bir değişikliği olmadığını varsayarsak) ya da olmadığını temin etmelidir.
Ángel

@ a3nm Dergi yorumunuzla ilgili olarak. Yazma önbelleği, günlük ve disk arasında oturur. Dosya sistemine yazdığınızda, dergi güncellenir, daha sonra dosya sistemi, ancak ikisi de henüz diske yüklenmez.
Patrick

2

Gönderen: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit = nrsec (*) Ext4'e her 'nrsec' saniyesinde tüm verilerini ve meta verilerini senkronize etmesi söylenebilir. Varsayılan değer 5 saniyedir. Bu, gücünüzü kaybederseniz, çalışmanın son 5 saniyesini kadar kaybedeceğiniz anlamına gelir (günlük tutma sayesinde dosya sisteminiz zarar görmeyecektir). Bu varsayılan değer (veya herhangi bir düşük değer) performansa zarar verir, ancak veri güvenliği için iyidir. 0'a ayarlanması varsayılan ayarda (5 saniye) bırakmakla aynı etkiye sahip olacaktır. Çok büyük değerlere ayarlamak performansı artıracaktır.

Ayrıca onları yıkamak için nasıl burada bakınız: Bir Linux sistemindeki tamponları ve önbelleği nasıl boşaltırsınız?

Yukarıdaki linkten alıntı:

NOT: gereksiz şeylerin hafızasını temizleyin (Kernerl 2.6.16 veya daha yenisi). Her zaman yararlı şeyleri diske atmak için ilk önce senkronizasyonu çalıştırdığınızdan emin olun !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

Bu cevap için teşekkürler! Bununla birlikte, bunu anlamıyorum: içinde belirtilen bu "senkronizasyon" için, çekirdeğin bellekten diske geçişi yapmaya karar vermesinden sonracommit=nrsec gerçekleşecek bir şey mi? Veya ayar, ayarlardan bağımsız olarak ve ayarlardan bağımsız olarak 1 saniye sonra tüm değişikliklerin silineceğini garanti ediyor mu? commit=1dirty_expire_centisecsdirty_writeback_centisecs
a3nm

Çekirdek, her 1 saniyede bir önbellek / arabellekleri diske temizler (eşitler) commit=1. Anladığım kadarıyla sync, Sanal Bellek Ayarları ne olursa olsun gerçekleşmesi için her şeyi zorlar.
David,

Ayrıca performans nedenleriyle (ve depolama ömrü) varsayılandan daha düşük bir değere ayar yapılması önerilmez.
David
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.