Podporu Velkých Souborů v Linux

Source page: http://users.suse.com/~aj/linux_lfs.html

LFS in Linux

Pro podporu soubory větší než 2 GiB na 32-bitové systémy, např x86, PowerPC a MIPS, řada změn jádra a knihovna C se muselo udělat. Tento jev se nazývá Podporu velkých souborů (Large File Support – LFS). Podpora pro LFS by měla být dokončena už v Linuxu a tento článek by měl poskytnout stručný přehled o aktuálním stavu.

64 bitové systémy, jako je Alpha, IA64 a x86-64 nemají problémy s velkými soubory, ale nepodporují nové rozhraní také. V tomto případě je nové rozhraní je především alias k běžnému rozhraní.

Podpora LFS se provádí pomocí linuxového jádra a knihovny GNU C (glibc).

Limity

LFS zvyšuje limit maximální velikosti souboru. Pro 32-bitové systémy je limit 231 (2 GiB), ale za použití rozhraní LFS na souborové systémy, které podporují LFS aplikace mohou pracovat se soubory stejně velké jako 263 bajtů.

Pro 64-bitové systémy limit velikosti souboru je 263 bajtů, pokud souborový systém (jako NFSv2) podporuje pouze menší.

LFS v Glibc 2.1.3 a Glibc 2.2

Rozhraní LFS v glibc 2.1.3 je kompletní – ale realizace není. Implementace v 2.1.3 také obsahuje některé chyby, například ftello64 je přerušeno. Chcete-li použít rozhraní LFS, budete muset použít glibc, který byl sestaven proti hlaviček z jádra s podporou LFS v něm.

Vzhledem k tomu, glibc 2.1.3 byla vydána před podporou LFS šel do Linux 2.3.x/2.4.0-testX, některé opravy musely být provedeny glibc k podpoře jádra rutiny. Aktuální stabilní verze glibc je glibc 2.2.3 (2,2 byla vydána v listopadu 2000) a nepodporuje všechny funkce z Linux 2.4.0. Glibc 2.2.x je nyní používán většinou z hlavních rozdělení ve svém posledním vydání (např. SuSE 7.2, Red Hat 7.1). glibc 2.2 podporuje následující vlastnosti, které glibc 2.1.3 nepodporuje:

• getdents64 systémové volání
• 64 bit zamykání souborů rozhraní (podrobnosti viz níže)

Programy sestavené proti glibc 2.1.3 bude pracovat na LFS systému, není třeba překompilovat programy (s výjimkou bitu fcntl uzamčení 64.). Potřebuje pouze glibc být aktualizována pro podporu LFS.

Všimněte si, že glibc 2.0 a libc5 nepodporují LFS vůbec.

Zamykání na velkých souborů není podporován withfcntl/lockfin glibc 2.1.x

Uzamykání pomocí fcntl/lockf nepracuje s velkými soubory v glibc 2.1.3. Podpora byla v Linux 2.4.0-test7 přidán do jádra a potřebné neslučitelné změny glibc, pouze glibc 2.2 se je řešit. To znamená:

• Nelze použít vlajky F_GETLK64, F_SETLK64 a F_SETLKW64 s fcntl při použití glibc 2.1.x. Pokud programy používat je teď, selžou. Také se musí překompilovat s glibc 2.2, která bude podporovat tyto fcntl vlajky.
lockf64 pracuje pouze se soubory <2 GiB s glibc 2.1.x, to funguje s glibc 2.2 a není nutná žádná rekompilace.

LFS v Linux jádře

Vzhledem k tomu, Linux 2.4.0-test7 většinu rozhraní jádra je zahrnuta do jádra. Otevřené problémy a omezení jsou popsány níže.

Souborové systémy

Můžeme oddělit dvě úrovně LFS shody v souborových systémů:

1. Plná podpora pro soubory > 2 GiB a O_LARGEFILE
2. Omezená podpora LFS: dává správné EINVAL chybových hlášení/EFBIG/EOVERFLOW při pokusu použít O_LARGEFILE nebo pozice > 2 gib.

Přinejmenším by měly být obecně dosažitelné druhý stupeň, ale je nějaká práce provést audit všech podivné souborové systémy.

Některé chyby v NFSv2 týkající se (2) byly stanoveny již, ale některé z nich chybí (stejně jako kontroly O_LARGEFILE). Jiné souborové systémy pravděpodobně chybět taky. Je zapotřebí kompletní audit všech souborových systémů (viz též TODO stránka 2,4 jádra na http://linux24.sourceforge.net/).

Situace o různých souborových systémech používaných v Linux 2.4.0 a novější lze shrnout takto:

ext2/ext3
Plná podpora pro LFS
NFSv2
Nemůže zvládnout LFS z důvodu omezení protokolu (s omezením na 2 GiB – 1); omezené LFS podporují, ale očekávat, že některé chyby
NFSv3
Protokol je v pořádku, ale nejsem si jistý, o stavu implementace Linux
ReiserFS 3.5.x (není součástí jádra, samostatný náplast)
Nepodporuje LFS
ReiserFS 3.6.x (součást jádra 2.4.1 a novější)
Plná podpora pro LFS, pokud je použita nová na formátu disku. Tento formát je nekompatibilní s formátem používaného 3.5.x (viz níže na některé další podrobnosti).
coda
Nepracuje s LFS (místní problematiky mezipaměti, protokol je v pořádku)
UFS
Plná podpora pro LFS (i když ne úplná vs. užívání vlajky O_LARGEFILE)
minix
omezena na 2 GiB – 1 (velikost souboru je omezena na 65804 MiB, ale na vědomí, že velikost souborového systému je omezen na 64 MiB – ale díry jsou povoleny)
SysV (SCO)
omezena na 2 GiB -1
msdos
omezen na 2 GiB – 1
umsdos
na bázi MS-DOS, omezena na 2 GiB – 1
smbfs
Starší protokoly jsou omezeny na 4 GiB – 1. rozšíření SMB umožňuje 64bitové systémy souborů. Linux smbfs realizace je v současné době omezena na 2 GiB – 1.
ncpfs
Protokol je omezena na 4 GiB – 1, provádění Linux až 2 GiB – 1
JFS
By měly spolupracovat s LFS (podrobnosti o JFS viz http://oss.software.ibm.com/developer/opensource/jfs)
XFS
By měly spolupracovat s LFS (podrobnosti o XFS viz http://http://linux-xfs.sgi.com/projects/xfs/)
Jiné souborové systémy
Nemám žádné informace, přesto, neváhejte a pošlete mi aktualizace.

Poznámka pro ext2

Jsou-li soubory > 2 GiB vytvořen ext2 starších jádrech připojí souborový systém pouze pro čtení (to nastaví příznak kompatibility jen pro čtení).

Poznámka pro ReiserFS

Chris Mason napsal:

Disky formátované s aktuálním 2.2 kódu se nazývají naši formátu 3.5 disku. Budou nepodporuje velké soubory v jakémkoliv jádře (i 2.4 kód).

Ale můžete připojit formátu 3.5 disku pod kódem 2.4 jádra a -o konv. To bude zase o podpoře velkých souborů pro staré disky, ale pouze nové soubory budou ponechány růst za poslední 2 GiB.

Poté, co se -o conv hoře, nelze namontovat v bodě 2.2 nic víc. Testujeme zadní port formátu LFS disku až 2.2, měl by být brzy připraven. Má možnost, že náš 2.4 kód má stejný -o conv hoře, tak budou platit všechny stejná pravidla.

rlimit64 není podporována

Linux jádro nepodporuje 64bit rlimit systémové volání přesto, glibc podporuje getrlimit64 a setrlimit64 ale zabalí příliš velké hodnoty, aby RLIMIT_INFINITY.

Používání LFS

Pro použití LFS v uživatelských programů, programy muset použít LFS API. To zahrnuje recompilation a změny programů. API je popsána v glibc příručce (libc info stránky), které mohou být čteny s např. “info libc“.

V kostce pro používání LFS můžete si vybrat některou z následujících možností:

• Zkompiluje Vaše programy s “gcc -D_FILE_OFFSET_BITS = 64“. To přinutí všechny přístupové soubor volání používat bitové varianty 64. Několik typů měnit také, např. off_t stává off64_t. Je proto důležité, aby se vždy použít správné typy a nepoužívat např. int namísto off_t. Pro přenositelnost s jinými platformami byste měli používat getconf LFS_CFLAGS která vrací -D_FILE_OFFSET_BITS = 64 na platformách Linux, ale může vrátit něco jiného na např. Solaris. Pro propojení, měli byste použít na odkaz příznaky, které jsou hlášeny prostřednictvím getconf LFS_LDFLAGS. V systémech Linux, nepotřebujete speciální odkaz vlajky.
• Definovat _LARGEFILE_SOURCE a _LARGEFILE64_SOURCE. S těmito definuje můžete použít funkce LFS jako open64 přímo.
• Použijte příznak O_LARGEFILE otevřený pro provoz na velké soubory.

Kompletní dokumentace zahrnuje: testovací maker jako _FILE_OFFSET_BITS a _LARGEFILE_SOURCE je v glibc příručce (běh například „info libc ‘Feature Test Macros’“).

LFS API je také popsána v normě LFS, který je k dispozici na adrese http://ftp.sas.com/standards/large.file/x_open.20Mar96.html.

LFS a Knihovny jiné než Glibc

Buďte opatrní při používání _FILE_OFFSET_BITS = 64 sestavit program, který volá knihovnu nebo knihovnu, pokud některý z rozhraní používá off_t. S _FILE_OFFSET_BITS = 64 glibc změní typ off_t na off64_t. Můžete buď změnit rozhraní, aby vždy používal off64_t, použijte jinou funkci, pokud je použit _FILE_OFFSET_BITS = 64 (jako glibc dělá). V opačném případě dbát na to, jak knihovna a programu mají stejné nastavení _FILE_OFFSET_BITS. Všimněte si, že glibc je vědoma nastavení _FILE_OFFSET_BITS, není žádný problém s tím ale, že by mohlo dojít k problémům s ostatními knihovnami.

Distribuce s podporou LFS

SuSE 7.0

Uvolní 7,0 SuSE Linux podporuje LFS na všech podporovaných platformách. Jádro SuSE 7.0 je založen na Linuxu 2.2.16.

Podpora LFS v jádře SuSE Linux je stejná jako ve vývoji jádra 2.4.0-test1 pro souborové systémy, které jsou v obou jádrech, glibc podporuje všechny funkce jádra. Jednotlivé souborové systémy ReiserFS (zatím jen v SuSE port 2.2 nepodporuje LFS) a NFSv3 (není k dispozici v SuSE 7.0). To znamená, že budete muset použít ext2 jako souborový systém LFS.

Oba Linux 2.4.0-test1 a SuSE 7.0 nepodporují volání getdents64 systému a 64 bit uzamčení rozhraní. Ty jsou realizovány pouze v systému Linux 2.4.0-test8 a novější.

SuSE 7.1

Uvolní 7,1 SuSE Linux podporuje LFS na všech podporovaných platformách. SuSE 7.1 přichází s jádry na bázi 2.4.0 a 2.2.18.

Podpora LFS 2.2.18 kernel s ext2 souborový systém. 2.4.0 kernel podporuje LFS s ext2 a NFSv3 souborové systémy a navíc s ReiserFS souborový systém v případě, že nový formát ReiserFS (nekompatibilní s formátem 2.2) se používá místo formátu výchozí 2.2.

SuSE 7.1 přichází s glibc 2.2, který podporuje plné rozhraní LFS. Ale 2.2.18 jádro pouze nepodporuje 64bitové filelocking a getdents64 hovory.

SuSE 7.2 a novější

Podpora kernel pro LFS je jako ten v 7.1.

Jiných distribucích

Vzhledem k tomu nemohu ověřit každou jednotlivou distribuci, musím věřit jiné pro následující informace.

Debian

Aktuální stabilní verze (Debian 3.0, kódové označení “woody”) má podporu LFS.

Red Hat

Beta s názvem Fisher byl první mít podporu LFS (díky Russ Marshall). Současné Red Hat uvolní jako Red Hat 8 mají podporu LFS.

Tim Small <tim@digitalbrain.com> odeslat následující speciální combo-Gotcha pro Red Hat 6.2 (a pravděpodobně i dalších starších distribucích i):

Dále jen ‚ulimit‘ příkaz, který je zabudován do bash 1.x (výchozí pro Red Hat 6.2) používá 32bitové verze systémových volání. Způsob, jakým glibc v současné době chová prostředky, které požaduje pro 32bit setrlimit nebo getrlimit bude překládat ‚neomezený‘ pro ‚231 – 1‘ v obou směrech (Řekl bych, že stanovení limitu pro RLIM_INFINITY pomocí 32bit rozhraní by měly skončit v průběhu hovoru do 64-bitového setrlimit variantě s 64 bitovou RLIM_INFITIY).

Výchozí konfigurace PAM pro sshd (/etc/pam.d/sshd), zahrnuje linku:

session required /lib/security/pam_limits.so

Který pohrává asi s různými limity (dle verze 32bitové z hovorů).

Pokud se přihlásíte-in pomocí ssh a používat bash 1.x zobrazit limity, budete řečeno, že velikost souboru je neomezená, pokud je to ve skutečnosti nastavena na 2097151 (1024 bajtů) bloky!

Řešení:

• Buď:

· Komentář mimo řádek v /etc/pam.d/sshd (všimněte si, že limity stanovené v /etc/security/limits.conf již nebude efektivní pro ssh přihlášení)
· Nebo: Znovu balíček pam s 64 bitovou podporou

• Instalace bash2 RPM
• Buď:

· přejmenování starou bash a symlink /bin/bash2 do /bin/bash (možná budete chtít, aby se /bin/sh, ukazuje na starou bash, pokud máte obavy o kompatibilitě)
· Nebo: použití vipw změnit uživatelům se k /bin/bash2

Jiný…

Nemám zatím žádné další informace. Neváhejte a pošlete mi detailní informace o distribucích v případě, že podporuje LFS.

Některé další často požadované údaje o souborových systémech

Prosím, pošlete mi informace k vyplnění chybějících kousků.

Maximum na disku Velikosti souborových systémů
Souborový systém Velikost souboru
omezit
Velikost souborový systém omezit
ext2/ext3 s 1 KiB velikost bloku 16448 MiB (~ 16 GiB) 2048 GiB (= 2 TiB)
ext2/3 s 2 KiB velikost bloku 256 GiB 8192 GiB (= 8 TiB)
ext2/3 s 4 KiB velikost bloku 2048 GiB (= 2 TiB) 8192 GiB (= 8 TiB)
ext2/3 s 8 KiB velikost bloku (systémy s 8 KiB stránky jako je Alpha jen) 65568 GiB (~ 64 TiB) 32768 GiB (= 32 TiB)
ReiserFS 3.5 2 GiB 16384 GiB (= 16 TiB)
ReiserFS 3.6 (as v Linux 2.4) 1 EiB 16384 GiB (= 16 TiB)
XFS 8 EiB 8 EiB
JFS s 512 bajtů velikost bloku 8 EiB 512 TiB
JFS s 4KiB velikost bloku 8 EiB 4 PiB
NFSv2 (na straně klienta) 2 GiB 8 EiB
NFSv3 (na straně klienta) 8 EiB 8 EiB

Poznámka omezení jádra: Výše uvedená tabulka popisuje omezení formátu na disku. Tyto limity jádra existují:

• Na 32-bitových systémech s jádrem 2.4.x: Velikost souboru a blokové zařízení je omezena na 2 tib. Pomocí LVM několika bloková zařízení lze kombinovat umožňuje manipulaci s většími souborových systémů.
• 64-bitové systémy: Velikosti a filesytem a ze souboru jsou omezeny 263 (8 EIB). Ale tam by mohlo být hardwarové meze ovladače, které neumožňují přístup k tak velké zařízení.
• Jádro 2.6: Pro 32bitové systémy s možností CONFIG_LBD sadě a pro 64bitové systémy: Velikost souborového systému je omezen na 273 (příliš mnoho na dnešek). Na 32-bitových systémech (bez CONFIG_LBD sadě) je velikost souboru je omezena na 2 tib. Všimněte si, že ne všechny souborové systémy a ovladače hardwaru by mohly zvládnout tak velké souborové systémy.

Poznámka: ve výše uvedených: 1024 b = 1 KiB; 1024 KB = 1 MiB; 1024 MiB = 1 GiB; 1024 GiB = 1 TiB; 1024 TiB = 1 PIB; 1024 PIB = 1EiB (kontrola http://physics.nist.gov/cuu/Units/binary.html)

Maximální počet oddílů

IDE disk má 64 nezletilých osob, jeden se používá pro celý disk, a proto 63 příčky jsou možné. Disk SCSI má 16 dětí a mladistvých a tudíž pouhých 15 oddílů maximální.

Odkazy

Dík

Díky Andi Kleen, Matti Aarnio, Rogier Wolff, Chris Mason, Andreas Schwab, Lenz Grimmer, Andries Brouwer, Urban Widmark, Bruce Allen a Jana Jaeger na doplnění a připomínky k obsahu této stránky.

Andreas Jaeger

LFS in Linux