2015-05-08 15 views
7

Sto codificando alcune operazioni a livello di blocco e voglio assicurarmi di non bash su altri file. Su un file system ext2/3/4, è possibile memorizzare più file nello stesso blocco? Il mio primo istinto è di dire in alcun modo, ma volevo controllare con la comunità.È possibile memorizzare più file nello stesso blocco?

+0

alcuni filesystem hanno la capacità di dividere un blocco fino in sotto-blocchi più piccoli (io in particolare ricordo di essere insegnato FFS di BSD avere questa capacità, di nuovo in corsi di base del sistema operativo in Uni). Comunque, non ho idea dei filesystem ext *. –

+0

i file system ext *, utilizzati su * inx OS, allocano un blocco completo (in genere 4096 byte utilizzabili) anche se hanno solo bisogno di 1 byte del nuovo blocco. quindi, la risposta semplice è NO. OSSIA solo un file può essere tenuto su un blocco del disco. (tuttavia, potresti voler esaminare l'archiviazione, in quanto separa semplicemente una serie di programmi tramite un'intestazione, consentendo quindi la possibilità di avere più di un programma per blocco. – user3629249

risposta

6

La domanda è difficile da rispondere. Forse la risposta corretta potrebbe essere in teoria sì, ma nella pratica no.

ext2/ext3

Parlando ext2 ed ext3, strutture superblocco e inode sono stati progettati per consentire i blocchi a essere frammentati. (Vedi: fs/ext2/ext2.h e fs/ext3/ext3.h)

breve frammento di fs/ext3/ext3.h qui proposta:

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 */ 

Sebbene preparati per, almeno nel kernel Linux (fino alla versione 3.13) blocco frammentazione è mai stato attuato, costringendo dimensione del frammento essere uguale alla dimensione del blocco. (Vedi: 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 non implementa blocco frammentazione ext2/3 file system pure. Molto probabilmente non ci sarà nessun SO in giro, che lo implementa.

Tuttavia, controllare il s_log_frag_size nel superblocco prima di iniziare le operazioni a livello di blocco potrebbe non essere una cattiva idea, dato che sarete dalla parte della sicurezza.

ext4

Con ext4 la storia Wohle diventa meno fastidioso, come ext4 non consente blocco frammentazione più. Il campo superblocco utilizzato per memorizzare le dimensioni dei frammenti ha ricevuto un nuovo lavoro e il campo iodo utilizzato per memorizzare l'indirizzo del frammento (rinominato in i_obso_faddr) è stato contrassegnato come obsoleto nelle origini.

Problemi correlati