2012-03-05 24 views
5

Merhaba Çekirdek programlamaya yeni başlayan biriyim. Yedekleme mekanizması uygulamak için wrapfs şablonuna dayanan küçük bir çekirdek modülü yazıyorum. Bu, yalnızca öğrenim temeli için .struct inode içindeki bazı verileri depolayın

Bir yazım çağrısı yapıldığında wrapfs saydam bir şekilde bu dosyanın bir kopyasını ayrı bir dizinde yapar ve daha sonra dosyaya gerçekleştirilir. Ama ben her yazma çağrısı için bir kopya oluşturmasını istemiyorum.

Saf bir yaklaşım O dizinde dosyanın varlığını kontrol olabilir. Ama Her arama için bunun ciddi bir ceza olduğunu düşünüyorum.

Ben de ilk yazma çağrısı için kontrol edin ve ardından private_data özniteliğini kullanarak o belirli bir dosya için bir değer depolayabilir. Ancak bu, disketinde saklanmazdı. Bu yüzden tekrar kontrol etmem gerek.

Ben de değişiklik zamanı yararlanarak düşünüyordum. değişiklik zamanını kaydedebilirim. Eğer eski modifikasyon zamanı o zamandan önce ise o zaman sadece bir kopyasını yaratırsam, hiçbir şey yapmayacağım. Bunun için inode.i_mtime kullanmaya çalıştı ama yazma da uygulamaları o zaman değiştirebilir, denirdi bile önce modifiye zaman oldu.

yüzden onun yedek oluşturulan veya yok edilmiş gösterir diskte inode'daki bazı değerler tutan düşünüyordum. Mümkün mü? Diğer öneriler veya yaklaşımlar kabul edilir.

+2

Blobunuzu biçimlendirmek, sorunuzu daha da almanıza yardımcı olur _read_. – sehe

cevap

0

Sen aslında bir Kopya-On-yaz sanal dosya sistemi katmanı yapmak istiyorum diyorsun.

IMO bunlardan bazıları yapılmış ve kullanıcı adasında (libfuse ve sigorta modülü, örneğin, kullanılarak) bu uygulamaya daha kolay olacaktır. Her

  • kullanım POSIX niteliklerini genişletilmiş dizine (setfattr ve arkadaşlarına

    • sadece eklemek (gizli) meta dosyaları: Bu şekilde, sizin kale kral olmak ve hissettiğini herhangi hangi bir şekilde meta ekleyebilir appriate olduğunu Eğer gerçekten çekirdekteki bunları yapmakta ısrar ederse)
    • halt, hatta almaya goind olan çekirdek modundan meta erişen beri çok daha fazla çalışması gerekecek sqlite veritabanı

    kullanabilirsiniz çok daha fazla çaba (büyük olasılıkla kendi veritabanınızı kullanarak taklit etmek istersiniz) Gerekli 'userland (tarzı)' iş miktarını en aza indirmek için venispeten kolay sağ atomicity ve güvenilirlik elde etmek kılacak şekilde bellek dosyalarını eşlenen. How Everybody Gets File IO Wrong: see also here

  • +0

    Cevabınız için teşekkür ederiz. Sigorta kullanmayla ilgilenirim. Ama aslında wrapfs kullanarak başladım. Bağlantım yerine yeniden adlandırmayı çağırmak için bağlantı kodunu değiştirdim, bu yüzden gereksinimlerime uygun herhangi bir yapı inode özniteliğini manipüle etmek gibi yapabileceğim bir şey varsa – gaurav

    0

    günü


    yerine mtime ait atime kullanabilirsiniz. Bu durumda, inode'da S_NOATIME bayrağının ayarlanması güncellenmesini engeller ('daki touch_atime() işlevine bakın). İhtiyacınız olan tek şey dosya sisteminizi noatime seçeneği ile monte etmektir.

    +0

    @liya: Neden mtime kullanamadık? Ama atime kullanmayla ilgili problem, eğer dosya okunduğunda, bu yaklaşımla ilgili bir sorun olacak şekilde değiştirilecek olmasıdır. – gaurav

    +0

    @gaurav: 'noatime' seçeneği ile erişimde 'atime' güncellemesi yok. –

    +0

    Ohh Görüyorum ki iyi bir seçenek görüyorum, ama neden çalışmadığını ve mamanın yapmadığını anlamıyorum. Ayrıca, daha düşük bir FS atımı da değişmeyecek mi? – gaurav