15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
12.12.2023

Linux’ta Dosya Oluşturma Tarihi Nasıl Bulunur: Eksiksiz Teknik Rehber

Linux, çoğu standart kullanıcı alanı aracı aracılığıyla dosya oluşturma zamanını doğal olarak göstermez; ancak temel veriler genellikle mevcuttur — asıl zorluk, tam olarak nereye bakacağınızı ve hangi dosya sistemi ile çekirdek sürümünü çalıştırdığınızı bilmektir. Linux çekirdeği 4.11+ ile ext4, btrfs, xfs ve tmpfs dosya sistemlerinde, gerçek oluşturma zaman damgaları (crtime) inode’da saklanır ve belirli düşük seviyeli yardımcı programlar aracılığıyla alınabilir. Eski dosya sistemlerinde veya çekirdeklerde, oluşturma zamanını yaklaşık olarak belirlemek için inode meta verilerinin, sistem günlüklerinin ve dosya sistemine özgü hata ayıklayıcıların bir kombinasyonunu kullanmanız gerekir.

Bu kılavuz, teknik ön koşullar, tam komut sözdizimi, bilinen hata modları ve her yaklaşımın üretim sistemi yönetimi için ne zaman uygun olduğu dahil olmak üzere 2024’te mevcut olan tüm güvenilir yöntemleri kapsamaktadır.

Linux Dosya Oluşturma Zamanının Neden Basit Olmadığı

Linux’taki her dosya, izinler, sahiplik, boyut ve zaman damgaları gibi meta verileri depolayan bir veri yapısı olan inode tarafından tanımlanır. POSIX standardı tarihsel olarak üç zaman damgası tanımlamıştır:

  • atime — son erişim zamanı
  • mtime — son değiştirilme zamanı (içerik değişti)
  • ctime — inode değişim zamanı (meta veri veya içerik değişti)

Kritik olarak, ctime oluşturma zamanı değildir. Bu, Windows ortamlarından geçiş yapan yöneticiler arasındaki en yaygın yanılgılardan biridir. ctime, izinler değiştiğinde, sahiplik değiştiğinde veya dosya yeniden adlandırıldığında güncellenir — dosyanın ilk ne zaman oluşturulduğuyla hiçbir ilgisi yoktur.

Doğum zamanı veya crtime olarak bilinen gerçek oluşturma zamanı, ext4 inode yapısına eklenmiştir ve Linux çekirdeği 4.11’de tanıtılan statx() sistem çağrısı aracılığıyla sunulmaktadır. Ancak, pek çok dağıtım bu veriyi görünür kılmayan araçlarla geldi; bu nedenle karışıklık devam etmektedir.

Dosya Sistemi ve Çekirdek Ön Koşulları

Herhangi bir yöntemi denemeden önce ortamınızı doğrulayın:

# Check kernel version
uname -r

# Check filesystem type for a specific path
df -T /path/to/your/file

# Check filesystem mount options
findmnt -o TARGET,FSTYPE,OPTIONS /path/to/your/file
Dosya SistemiDoğum Zamanı SaklanıyorAlma YöntemiNotlar
ext4Evetstat, debugfsstat için çekirdek 4.11+ gerektirir
btrfsEvetstatTam destek, ekstra araç gerekmez
xfsEvet (çekirdek 5.10+)statEski çekirdeklerde xfs_db gerektirir
tmpfsHayırN/ABellek içi, kalıcı inode yok
ext2 / ext3HayırN/Ainode’da doğum zamanı alanı yok
NFSSunucuya bağlıstatSunucu dosya sisteminden miras alınır
FAT32 / exFATEvetstatDizin girişinde doğal olarak saklanır

Bir VPS Hosting ortamı çalıştırıyorsanız, temel dosya sistemi neredeyse her zaman ext4 veya btrfs’dir; bu da doğum zamanı verisinin mevcut olduğu anlamına gelir — yalnızca onu görünür kılmak için doğru araçlara ihtiyacınız vardır.

Yöntem 1: stat Komutunu Kullanma (Önerilen Başlangıç Noktası)

stat komutu, denenmesi gereken ilk doğru araçtır. Çekirdek 4.11+ ve destekleyen bir dosya sistemi ile modern sistemlerde, doğrudan Birth alanını gösterecektir.

stat /path/to/your/file

Modern bir ext4 sisteminde örnek çıktı:

  File: /home/deploy/app/config.yml
  Size: 4096            Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 2883591     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  deploy)   Gid: ( 1000/  deploy)
Access: 2024-03-15 09:22:14.812345678 +0000
Modify: 2024-03-10 14:05:33.123456789 +0000
Change: 2024-03-10 14:05:33.123456789 +0000
 Birth: 2024-03-08 11:47:02.987654321 +0000

Birth alanı bir zaman damgası yerine - (tire) gösteriyorsa, aşağıdakilerden biri doğrudur:

  • Dosya sistemi doğum zamanını saklamıyor (ext2/ext3)
  • Çekirdek 4.11’den eski
  • stat ikili dosyası güncel değil ve statx() çağırmıyor
  • Dosya, dosya sistemi ext3’ten ext4’e yükseltilmeden önce oluşturulmuş

Yalnızca doğum zaman damgasını programatik olarak çıkarma:

stat --format="%w" /path/to/your/file
# Returns '-' if unavailable, or ISO 8601 timestamp if available

stat --format="%W" /path/to/your/file
# Returns Unix epoch integer (0 if unavailable)

%W biçiminin 0 döndürmesi, doğum zamanının gerçekten kullanılamaz olup olmadığının güvenilir bir programatik kontrolüdür.

Yöntem 2: ext4 Dosya Sistemleri için debugfs Kullanma

debugfs, ext4 inode incelemesi için kesin düşük seviyeli araçtır. Ham inode yapısını okur ve eski bir kullanıcı alanı ikili dosyası nedeniyle stat başarısız olduğunda bile crtime‘yi gösterebilir.

Adım 1: Dosyanızın inode numarasını belirleyin

ls -i /path/to/your/file
# Output example: 2883591 /path/to/your/file

Adım 2: Dosya sistemini barındıran blok aygıtını belirleyin

df /path/to/your/file
# Output shows the device, e.g., /dev/sda1 or /dev/vda1

Adım 3: inode numarasıyla debugfs’i sorgulayın

sudo debugfs -R 'stat <2883591>' /dev/vda1

2883591‘yi gerçek inode numaranızla ve /dev/vda1‘yi gerçek aygıtınızla değiştirin. Çıktı bir crtime alanı içerecektir:

Inode: 2883591   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 3421897654    Version: 0x00000000:00000001
User:  1000   Group:  1000   Project:     0   Size: 4096
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x65ee1f4d:1d4c5800 -- Sun Mar 10 14:05:33 2024
 atime: 0x65f4a1ae:c6b5c000 -- Fri Mar 15 09:22:14 2024
 mtime: 0x65ee1f4d:1d4c5800 -- Sun Mar 10 14:05:33 2024
crtime: 0x65e4b2c6:eb851400 -- Thu Mar 08 11:47:02 2024
Size of extra inode fields: 28

Önemli operasyonel not: debugfs, -R kullanırken dosya sistemini varsayılan olarak salt okunur modda açar; ancak yine de yoğun aktif bir dosya sisteminde önce bağlantıyı kesmeden veya anlık görüntü kullanmadan çalıştırmaktan kaçınmalısınız. Üretim Dedicated Servers‘da, tutarsız inode durumunu okumaktan kaçınmak için debugfs‘yi her zaman bir dosya sistemi anlık görüntüsüne veya durdurulmuş bir birime karşı çalıştırmayı tercih edin.

Doğrudan dosya adı kullanan alternatif sözdizimi:

sudo debugfs -R "stat /path/to/your/file" /dev/vda1

Buradaki yolun sistem köküne değil, dosya sistemi köküne göre olması gerektiğini unutmayın. /dev/vda1, /‘a bağlıysa, /path/to/your/file olduğu gibi çalışır.

Yöntem 3: XFS Dosya Sistemleri için xfs_db Kullanma

XFS dosya sistemlerinde (RHEL/CentOS/Rocky Linux sistemlerinde yaygın), debugfs‘nin eşdeğeri xfs_db‘dir.

# Get inode number first
ls -i /path/to/your/file

# Unmount or use read-only mode
sudo xfs_db -r /dev/sda1 -c "inode <inode_number>" -c "print"

Çıktıda v3.crtime alanını arayın. XFS v5 (RHEL 7’den bu yana varsayılan) doğum zamanını doğal olarak saklar. XFS v4 saklamaz.

Yöntem 4: btrfs Alt Birimi ve Dosya İncelemesi Kullanma

btrfs’de, modern bir çekirdekle stat yeterli ve tamamen güvenilirdir. Ancak daha derin inceleme için:

sudo btrfs inspect-internal dump-tree /dev/sdb | grep -A 20 "inode ref"

btrfs’de pratik amaçlar için, stat çıktısındaki Birth alanı yetkilidir.

Yöntem 5: Python Aracılığıyla Doğrudan statx() Sorgulama

Kabuk araçları tutarsız sonuçlar verdiğinde, Python’dan statx() sistem çağrısını doğrudan çağırmak kesin bir yanıt sağlar:

import os
import stat

result = os.stat("/path/to/your/file")
# st_birthtime is available on systems where statx() returns it
if hasattr(result, 'st_birthtime'):
    import datetime
    birth = datetime.datetime.fromtimestamp(result.st_birthtime)
    print(f"Birth time: {birth}")
else:
    print("Birth time not available on this platform/filesystem")

Daha hassas nanosaniye çözünürlüğü için, ctypes modülünü kullanarak statx()‘yi doğrudan çağırın — bu, zaman damgası hassasiyetinin önemli olduğu adli bilişim betiklerinde kullanışlıdır.

Yöntem 6: Sistem Günlüklerini Arama

Dosya sistemi düzeyinde doğum zamanı kullanılamadığında — örneğin ext3 dosya sistemlerinde veya dosya sistemi dönüşümünden önce oluşturulan dosyalarda — sistem günlükleri yedek çözüm haline gelir.

systemd günlüğünü arayın:

journalctl --since="2024-01-01" | grep "your_filename"

Geleneksel syslog’u arayın:

grep "your_filename" /var/log/syslog
grep "your_filename" /var/log/messages

Denetim günlüğünü arayın (auditd yapılandırılmışsa):

sudo ausearch -f /path/to/your/file

Denetim alt sistemi, openat(), creat() ve rename() sistem çağrılarını hassas zaman damgalarıyla kaydettiğinden en güvenilir günlük tabanlı yöntemdir. Ancak önceden yapılandırılmış olması gerekir — auditd etkinleştirilmeden önce gerçekleşen dosya oluşturma olaylarını geriye dönük olarak denetleyemezsiniz.

Bir dizin için dosya oluşturma denetimini etkinleştirin:

sudo auditctl -w /var/www/html -p w -k web_file_creation

Bu, /var/www/html‘yi yazma olayları için izler ve kolay erişim için web_file_creation anahtarıyla etiketler.

Yöntem 7: ls Kullanma — Sınırlamalarını Anlama

ls komutu, oluşturma zamanını kontrol etmenin bir yolu olarak kılavuzlarda sıkça belirtilir; ancak bu önemli bir nitelendirme gerektirir.

ls -l --time=birth /path/to/your/file
ls -l --time=creation /path/to/your/file  # synonym on some systems

Kritik uyarı: ls --time=birth yalnızca GNU coreutils 8.25+ sürümünde ve yalnızca temel dosya sistemi ile çekirdek doğum zamanını desteklediğinde çalışır. Doğum zamanı kullanılamıyorsa, ls herhangi bir uyarı vermeden sessizce mtime‘ye geri döner. Bu sessiz geri dönüş önemli bir operasyonel tehlikedir — değiştirilme zamanını okurken oluşturma zamanını okuduğunuza inanıyor olabilirsiniz.

Her zaman önce stat ile doğrulayın. ls‘yi yalnızca görüntüleme amaçlı kullanın, betiklenmiş mantık için değil.

# Safer: check stat output explicitly before relying on ls
BIRTH=$(stat --format="%W" /path/to/your/file)
if [ "$BIRTH" -eq 0 ]; then
    echo "Birth time unavailable, falling back to mtime"
    stat --format="%y" /path/to/your/file
else
    echo "Birth time: $(date -d @$BIRTH)"
fi

Yöntem Karşılaştırması ve Karar Matrisi

YöntemDoğrulukDosya Sistemi GereksinimiRoot GerekliÖnceden Kurulum Olmadan Çalışır
stat (Birth alanı)Tamext4, btrfs, xfs v5HayırEvet
debugfsTamYalnızca ext4EvetEvet
xfs_dbTamYalnızca XFS v5EvetEvet
Python aracılığıyla statx()Tamstat ile aynıHayırEvet
journalctl / syslogYaklaşıkHerhangi biriHayırGünlük saklama süresine bağlı
auditdTamHerhangi biriEvet (kurulum)Hayır (önceden yapılandırma gerektirir)
ls --time=birthTam veya sessiz geri dönüşext4, btrfs, xfs v5HayırEvet (güvenilmez geri dönüş)

Gerçek Dünya Uç Durumları ve Tuzaklar

Kopyalanan ve taşınan dosya: Bir dosya kopyalandığında (cp), hedef yeni bir doğum zamanıyla yeni bir inode alır. Bir dosya aynı dosya sistemi içinde taşındığında (mv), inode korunur ve doğum zamanı değişmez. Dosya sistemi çapraz mv, cp + rm gibi davranır ve yeni bir inode oluşturur.

ext3’ten ext4’e dosya sistemi dönüşümü: Dönüşümden önce var olan dosyalar, ext3 bu alanı hiçbir zaman doldurmadığından inode’larında sıfır crtime‘ya sahip olacaktır. debugfs, crtime: 0x00000000:00000000 gösterecektir. Bu durumda, dönüşüm sırasındaki mtime en iyi yaklaşımdır.

Docker ve konteyner ortamları: Konteyner dosya sistemleri (overlay2, aufs) doğum zamanını doğru şekilde iletmeyebilir. Konteynerler içindeki dosyalar, gerçek dosya oluşturma zamanı yerine konteyner başlangıç zamanını doğum zamanı olarak gösterebilir.

NFS bağlantıları: Doğum zamanı kullanılabilirliği tamamen NFS sunucusunun dosya sistemine bağlıdır. İstemcinin bağımsız doğum zamanı verisi yoktur.

Yedekten geri yükleme: tar arşivlerinden geri yüklenen dosyalar genellikle yeni bir inode alır ve dolayısıyla özgün oluşturma tarihini değil, geri yükleme tarihini yansıtan yeni bir doğum zamanı alır. tar --preserve-permissions kullanın ve özgün oluşturma zamanına en yakın yaklaşım için mtime‘yi kontrol edin.

VPS with cPanel üzerinde web uygulamaları yöneten yöneticiler için, dosya zaman damgası bütünlüğü geçişler sırasında özellikle önemlidir — yedekten geri yükledikten sonra her zaman inode meta verilerini doğrulayın.

Doğum Zamanı Desteğini Etkinleştirme: Dosya Sistemi Ayarı

Yeni bir sunucu kuruyorsanız ve garantili doğum zamanı desteği istiyorsanız, aşağıdakileri sağlayın:

ext4 için — inode boyutunun 256 bayt olduğunu doğrulayın (crtime alanı için gerekli):

sudo tune2fs -l /dev/vda1 | grep "Inode size"
# Should return: Inode size: 256

inode boyutu 128 ise, doğum zamanı saklanamaz. Bu, yeniden biçimlendirme gerektirir — mevcut bir dosya sisteminde değiştirilemez.

256 baytlık inode’larla yeni ext4 dosya sistemi oluşturun (e2fsprogs 1.41’den bu yana varsayılan):

sudo mkfs.ext4 -I 256 /dev/vdb1

Çekirdeğin statx()’i desteklediğini doğrulayın:

uname -r  # Must be >= 4.11

Yeni altyapı sağlarken — ister Shared Web Hosting ister çıplak metal Dedicated Servers — doğum zamanı meta verilerine bağımlı uygulamaları dağıtmadan önce dosya sistemi inode boyutunu onaylayın.

Dosya Oluşturma Zamanını Belirleme için Pratik Kontrol Listesi

Bir dosyanın oluşturma tarihini bulmanız gerektiğinde bu karar ağacını kullanın:

  • Önce çekirdek sürümünü kontrol edin: uname -rstat‘nin Birth’i göstermesi için 4.11+ olmalıdır
  • Dosya sistemi türünü kontrol edin: df -T /path/to/file — ext4, btrfs veya xfs v5 gereklidir
  • Dosyada stat çalıştırın: Birth alanı bir zaman damgası gösteriyorsa, cevabınız hazır
  • Birth - gösteriyorsa: inode numarasıyla debugfs (ext4) veya xfs_db (xfs) çalıştırın
  • Dosya sistemi ext3 veya ext2 ise: En iyi yaklaşım olarak mtime‘ye geri dönün
  • İleriye dönük denetim düzeyinde doğruluk gerekiyorsa: auditd‘yi şimdi yapılandırın
  • Dosya yakın zamanda oluşturulduysa: Destekleyici günlük girişleri için journalctl‘yi kontrol edin
  • Betiklerde: Değere güvenmeden önce her zaman stat --format="%W" için 0‘yi kontrol edin
  • Geçişler veya geri yüklemeler sonrasında: Doğum zamanını şüpheli olarak değerlendirin; mtime ve yedek manifestolarıyla çapraz referans yapın

Dosya bütünlüğü ve zaman damgası doğruluğunun güvenlik gereksinimleri olduğu ortamlarda — SSL Certificates ve kriptografik anahtar dosyalarını işleyen uygulamalar gibi — auditd‘yi dosya sistemi düzeyinde doğum zamanıyla birleştirmek, güvenlik denetimlerinde savunulabilir iki katmanlı bir doğrulama yaklaşımı sunar.

SSS

Linux her zaman dosya oluşturma zamanını saklar mı?

Hayır. Yalnızca 256 baytlık inode’lara sahip dosya sistemleri (ext4, btrfs, xfs v5) doğum zamanını saklar. ext2 ve ext3’ün inode yapısında doğum zamanı alanı yoktur. Destekleyen dosya sistemlerinde bile, ext3’ten ext4’e dosya sistemi yükseltmesinden önce oluşturulan dosyalar sıfır doğum zamanına sahip olacaktır.

Linux’ta ctime ile doğum zamanı arasındaki fark nedir?

ctime, inode değişim zamanıdır — dosya meta verisi (izinler, sahiplik, bağlantı sayısı) veya içerik değiştiğinde güncellenir. Oluşturma zamanı değildir. Doğum zamanı (crtime), dosya ilk oluşturulduğunda bir kez ayarlanır ve hiçbir zaman değişmez. Pek çok yönetici bu ikisini karıştırır; bu da yanlış denetim sonuçlarına yol açar.

Kaybolmuş dosya oluşturma zamanını kurtarabilir miyim?

inode’un crtime alanı sıfırsa veya dosya sistemi bunu desteklemiyorsa, özgün oluşturma zamanı yalnızca dosya sisteminden kurtarılamaz. En iyi seçenekleriniz şunlardır: yapılandırılmışlarsa auditd günlüklerini kontrol edin, uygulama günlüklerini arayın veya yedekleme zamanında dosya meta verilerini kaydeden yedek manifestolarına başvurun.

ls --time=creation neden yanlış zamanı gösteriyor?

ls, doğum zamanı kullanılamadığında herhangi bir uyarı göstermeden sessizce mtime‘ye geri döner. Bu, GNU coreutils’te bilinen bir davranış sorunudur. ls çıktısına güvenmeden önce doğum zamanının gerçekten kullanılabilir olup olmadığını programatik olarak doğrulamak için her zaman stat --format="%W" kullanın.

ext4’te en güvenilir dosya oluşturma zamanını hangi komut verir?

debugfs -R 'stat <inode_number>' /dev/device, ham inode yapısını doğrudan okuyarak herhangi bir kullanıcı alanı aracı sınırlamalarını atladığından ext4’te en güvenilir yöntemdir. Çekirdek 4.11+ üzerinde günlük kullanım için, Birth alanıyla stat filename eşdeğerdir ve çok daha kullanışlıdır.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın