2015-05-08 13 views
7

Koduję niektóre operacje na poziomie bloku i chcę się upewnić, że nie będę bashować innych plików. Czy w systemie plików ext2/3/4 można przechowywać wiele plików w tym samym bloku? Moim pierwszym instynktem jest powiedzieć, że nie ma mowy, ale chciałem sprawdzić społeczność.Czy wiele plików może być przechowywanych w tym samym bloku?

+0

niektóre systemy plików mają możliwość dzielenia bloku na mniejsze podbloków (I specjalnie Pamiętam uczy o FFS BSD mając taką możliwość, już w podstawowych kursach OS w Uni). Jednak nie ma pojęcia o systemach plików ext *. –

+0

systemy plików ext *, używane w systemach operacyjnych * inx, alokują pełny blok (zwykle 4096 użytecznych bajtów), nawet jeśli potrzebują tylko 1 bajta nowego bloku. więc prosta odpowiedź brzmi NIE. TO ZNACZY. tylko jeden plik może być przechowywany na bloku dysku. (jednak warto przyjrzeć się archiwizacji, ponieważ oddziela ona serię programów od nagłówka, co pozwala na posiadanie więcej niż jednego programu na blok. – user3629249

Odpowiedz

6

Na to pytanie trudno odpowiedzieć. Może poprawna odpowiedź może być teoretycznie tak, ale w praktyce nie.

ext2/ext3

Mówiąc ext2 i ext3, SUPERBLOCK i iwęzłów konstrukcje zostały zaprojektowane, aby umożliwić bloki mają być podzielone. (Patrz: fs/ext2/ext2.h i fs/ext3/ext3.h)

krótki fragment fs/ext3/ext3.h podane tutaj:

struct ext3_super_block { 
/*00*/ __le32 s_inodes_count;  /* Inodes count */ 
    __le32 s_blocks_count;  /* Blocks count */ 
    __le32 s_r_blocks_count; /* Reserved blocks count */ 
    __le32 s_free_blocks_count; /* Free blocks count */ 
/*10*/ __le32 s_free_inodes_count; /* Free inodes count */ 
    __le32 s_first_data_block; /* First Data Block */ 
    __le32 s_log_block_size; /* Block size */ 
    __le32 s_log_frag_size; /* Fragment size */ 

// ... 

struct ext3_inode { 
    __le16 i_mode;  /* File mode */ 
    __le16 i_uid;  /* Low 16 bits of Owner Uid */ 

// ... 
    __le32 i_faddr; /* Fragment address */ 

Chociaż przygotowany do, przynajmniej w jądrze Linux (do wersji 3.13) fragmentacja blok nigdy nie został wdrożony, zmuszając rozmiar fragmentu być równe wielkości bloku. (Patrz fs/ext3/super.c)

if (blocksize != sbi->s_frag_size) { 
    ext3_msg(sb, KERN_ERR, 
      "error: fragsize %lu != blocksize %u (unsupported)", 
      sbi->s_frag_size, blocksize); 
    goto failed_mount; 
} 

AFAIK GNU/Hurd nie realizuje rozdrobnienia blokowy ext2/3, jak również systemów plików. Najprawdopodobniej nie będzie żadnego systemu operacyjnego, który go implementuje.

Mimo to sprawdzenie s_log_frag_size w superbloku przed rozpoczęciem operacji na poziomie bloku może nie być złym pomysłem, ponieważ będziesz po bezpiecznej stronie.

ext4

Z ext4 historia wohle staje się mniej uciążliwe, a ext4 nie zezwala na fragmentację blokowy więcej. Pole superblokowe używane do przechowywania rozmiaru fragmentu otrzymało nowe zadanie, a pole iode służące do przechowywania adresu fragmentu (o zmienionej nazwie na i_obso_faddr) zostało oznaczone jako nieaktualne w źródłach.

Powiązane problemy