翻蚳ãã³ã¡ã³ãããŸãã ïŒ NextCloudPlusãããžã§ã¯ãïŒæ§ç§°NextCloudPiïŒãéçºããŠããå
ã®èšäºãã¹ãã€ã³èªã®ãªãŒãã³ãœãŒã¹æå¥œå®¶nachoparkerã®èè
ã¯ãLinuxã®ãã£ã¹ã¯ãµãã·ã¹ãã ã®èšèšã«é¢ããç¥èãå
±æããäžèŠåçŽãªè³ªåãžã®åçã§éèŠãªæç¢ºåãè¡ã£ãŠããŸã...ãã®ãã¡ã€ã«ã¯ããŒããã©ã€ãäžã§ã©ã®ãããã®ã¹ããŒã¹ãå æããŸããïŒ ã©ããããã®ç©ºã容éããããŸããïŒ æ®ãã®ã¹ããŒã¹ã«ããã«ããã€ã®ãã¡ã€ã«ãåããããšãã§ããŸããïŒ

ãããã®è³ªåã«å¯Ÿããçãã¯æããã§ãã ç§ãã¡ã¯çããã¡ã€ã«ã·ã¹ãã ã®ä»çµã¿ãçŽæçã«çè§£ããŠãããå€ãã®å Žåããã¹ã±ããã«ãªã³ãŽãå
¥ããã®ãšåãæ¹æ³ã§ãã¡ã€ã«ããã£ã¹ã¯ã«ä¿åããããšãæ³åããŠããŸãã
ãã ããææ°ã®Linuxã·ã¹ãã ã§ã¯ããã®ãããªçŽæã¯èª€è§£ãæãå¯èœæ§ããããŸãã çç±ãèŠãŠã¿ãŸãããã
ãã¡ã€ã«ãµã€ãº
ãã¡ã€ã«ãµã€ãºã¯ïŒ çãã¯ç°¡åãªããã§ãïŒãã¡ã€ã«ã®æåããæåŸãŸã§ããã®å
容ã®ãã¹ãŠã®ãã€ãã®ã³ã¬ã¯ã·ã§ã³ã
å€ãã®å Žåããã¡ã€ã«ã®å
容å
šäœããã€ãããšã«è¡šç€ºãããŸãã

ãŸãã
ãã¡ã€ã«ãµã€ãºã®æŠå¿µãèªèããŠã
ãŸã ã 調ã¹ãã«ã¯ã
ls -l file.c
ãŸãã¯
stat
ã³ãã³ãïŒã€ãŸã
stat file.c
ïŒãå®è¡ãã
stat()
ã·ã¹ãã ã³ãŒã«ãè¡ããŸãã
Linuxã«ãŒãã«ã§ã¯ããã¡ã€ã«ã衚ãã¡ã¢ãªæ§é ã¯
inodeã§ãã ãããŠã
stat
ã³ãã³ãã§ã¢ã¯ã»ã¹ããã¡ã¿ããŒã¿ã¯iããŒãã«ãããŸãã
ã¹ãããã
include/linux/fs.h
ïŒ
struct inode { loff_t i_size; struct timespec i_atime; struct timespec i_mtime; struct timespec i_ctime; unsigned short i_bytes; unsigned int i_blkbits; blkcnt_t i_blocks; }
ããã§ã¯ãã¢ã¯ã»ã¹æéã倿޿éãªã©ã®äœ¿ãæ
£ãã屿§ãš
i_size
ã§ããŸããããã¯
ãäžèšã§å®çŸ©ã
ããã¡ã€ã«ãµã€ãºã§ãã
ãã¡ã€ã«ãµã€ãºã®èгç¹
ããèããããš
ã¯çŽæçã§ããã
å®éã«ã¹ããŒã¹ãã©ã®ãã
ã«äœ¿çšããããã«é¢å¿ããããŸãã
ãããã¯ãšãããã¯ãµã€ãº
å
éšãã¡ã€ã«ã¹ãã¬ãŒãžã®å Žåããã¡ã€ã«ã·ã¹ãã ã¯ã¹ãã¬ãŒãžã
ãããã¯ã«åå²ã
ãŸã ã åŸæ¥ã®ãããã¯ãµã€ãºã¯512ãã€ãã§ããããããé©åãªå€ã¯4ãããã€ãã§ãã äžè¬ã«ããã®å€ãéžæããå Žåãæšæºã®MMUæ©åš
ïŒã¡ã¢ãªç®¡çãŠãããããã¡ã¢ãªç®¡çããã€ã¹ ã- çŽTranslã ïŒã§ãµããŒããããŠããããŒãžãµã€ãºã«ãã£ãŠã¬ã€ããããŸãã
ãã¡ã€ã«ã·ã¹ãã ã¯ããããã®ãããã¯ã«
ãã£ã³ã¯ãã¡ã€ã«ãæ¿å
¥ããã¡ã¿ããŒã¿ã§ç£èŠããŸãã çæ³çã«ã¯ã次ã®ããã«ãªããŸãã

...ããããå®éã«ã¯ãã¡ã€ã«ã¯åžžã«äœæããµã€ãºå€æŽãåé€ãããŠãããããå®éã®ç¶æ³ã¯æ¬¡ã®ãšããã§ãã

ããã¯
å€éšãã©ã°ã¡ã³ããŒã·ã§ã³ãšåŒã°ããéåžžã¯ããã©ãŒãã³ã¹ãäœäžããŸãã ãã®çç±ã¯ãããŒããã£ã¹ã¯ã®å転ãããããã¹ãŠã®æçãåéããããã«å Žæããå Žæãžç§»åããªããã°ãªããããããé
ãæäœã ããã§ãã åŸæ¥ã®ããã©ã°ããŒã«ã¯ãã®åé¡ã«å¯ŸåŠããŸãã
4 KBããå°ãããã¡ã€ã«ã¯ã©ããªããŸããïŒ ãã¡ã€ã«ãæçã«åå²ãããåŸãæåŸã®ãããã¯ã®å
容ã¯ã©ããªããŸããïŒ æªäœ¿çšã®ã¹ããŒã¹ã¯èªç¶ã«çºçããŸããããã¯
å
éšãã©ã°ã¡ã³ããŒã·ã§ã³ãšåŒã°
ããŸãã æããã«ããã®å¯äœçšã¯æãŸãããªããç¹ã«éåžžã«å°ããªãã¡ã€ã«ã倿°ããå Žåã¯ãå€ãã®ç©ºãé åã䜿çšãããªããšããäºå®ã«ã€ãªããå¯èœæ§ããããŸãã
ãã®
ããããã¡ã€ã«
ã«ãããã£ã¹ã¯ã®å®éã®äœ¿çšã¯ã stat
ã
ls -ls file.c
du file.c
ãŸãã¯
du file.c
ã䜿çšããŠç¢ºèªã§ããŸãã ããšãã°ã1ãã€ãã®ãã¡ã€ã«ã®å
容ã¯äŸç¶ãšããŠ4 KBã®ãã£ã¹ã¯å®¹éãå æããŸãã
$ echo "" > file.c $ ls -l file.c -rw-r--r-- 1 nacho nacho 1 Apr 30 20:42 file.c $ ls -ls file.c 4 -rw-r--r-- 1 nacho nacho 1 Apr 30 20:42 file.c $ du file.c 4 file.c $ dutree file.c [ file.c 1 B ] $ dutree -u file.c [ file.c 4.00 KiB ] $ stat file.c File: file.c Size: 1 Blocks: 8 IO Block: 4096 regular file Device: 2fh/47d Inode: 2185244 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ nacho) Gid: ( 1000/ nacho) Access: 2018-04-30 20:41:58.002124411 +0200 Modify: 2018-04-30 20:42:24.835458383 +0200 Change: 2018-04-30 20:42:24.835458383 +0200 Birth: -
ãããã£ãŠããã¡ã€ã«ãµã€ãºãšäœ¿çšæžã¿ãããã¯ã®2ã€ã®å€ã確èªããŸãã ç§ãã¡ã¯åè
ã®èгç¹ããèããããšã«æ
£ããŠããŸãããåŸè
ã®èгç¹ããèããªããã°ãªããŸããã
ãã¡ã€ã«ã·ã¹ãã åºæã®æ©èœ
ãã¡ã€ã«ã®å®éã®å
容ã«å ããŠãã«ãŒãã«ã¯ããããçš®é¡ã®ã¡ã¿ããŒã¿ãä¿åããå¿
èŠããããŸãã ãã§ã«iããŒãã¡ã¿ããŒã¿ãèŠãŸãããããã¹ãŠã®UNIXãŠãŒã¶ãŒã䜿ãæ
£ããŠããä»ã®ããŒã¿ããã
ãŸã ïŒ
ã¢ã¯ã»ã¹æš© ã
ææè
ã
uid ã
gid ããã©ã°ã
ACL ã
struct inode { struct fown_struct f_owner; umode_t i_mode; unsigned short i_opflags; kuid_t i_uid; kgid_t i_gid; unsigned int i_flags; }
æåŸã«ãä»ã®æ§é ããããŸã-ãã¡ã€ã«ã·ã¹ãã èªäœã®è¡šçŸãæã€
ã¹ãŒããŒããã㯠ãããŠã³ããã€ã³ãã®è¡šçŸãæã€
vfsmount ã
ããã³åé·æ§ãåå空éãªã©ã«é¢ããæ
å ±ããããŸãã åŸã§èŠãããã«ããã®ã¡ã¿ããŒã¿ã®äžéšã¯éèŠãªå Žæãå ããããšããããŸãã
ãããã¯é
眮ã¡ã¿ããŒã¿
ãã®ããŒã¿ã¯ã䜿çšãããã¡ã€ã«ã·ã¹ãã ã«å€§ããäŸåããŸããåããŒã¿ã·ã¹ãã ã«ã¯ããããã¯ããã¡ã€ã«ã«ãããããç¬èªã®æ¹æ³ããããŸãã ext2ã®åŸæ¥ã®ã¢ãããŒãã¯ãçŽæ¥ããã³éæ¥ãããã¯ãæã€
i_block
ããŒãã«ã§ãã

åãããŒãã«ãã¡ã¢ãªæ§é ã«èŠãããŸãïŒ
fs/ext2/ext2.h
ïŒïŒ
struct ext2_inode { __le16 i_mode; __le16 i_uid; __le32 i_size; __le32 i_atime; __le32 i_ctime; __le32 i_mtime; __le32 i_dtime; __le16 i_gid; __le16 i_links_count; __le32 i_blocks; __le32 i_flags; __le32 i_block[EXT2_N_BLOCKS]; }
倧ããªãã¡ã€ã«ã®å Žåãåäžã®ïŒå€§ããªïŒãã¡ã€ã«ã«ã¯æ°åã®ãããã¯ãäžèŽãããå¿
èŠãããããããã®ãããªã¹ããŒã ã¯å€§ããªãªãŒããŒãããã«ã€ãªãããŸãã ããã«ããã¡ã€ã«ãµã€ãºã«ãå¶éããããŸãããã®æ¹æ³ã䜿çšãããšãext3 32ããããã¡ã€ã«ã·ã¹ãã ã¯8 TB以äžã®ãã¡ã€ã«ããµããŒãããŸãã Ext3éçºè
㯠48ãããããµããŒããã
ãšã¯ã¹ãã³ãã远å ããããšã§
ç¶æ³ãä¿åããŸãã ïŒ
struct ext3_extent { __le32 ee_block; __le16 ee_len; __le16 ee_start_hi; __le32 ee_start; };
ã¢ã€ãã¢ã¯æ¬åœã«ã·ã³ãã«ã§ãããã£ã¹ã¯äžã®é£æ¥ãããããã¯ãå æãããšã¯ã¹ãã³ãã®éå§äœçœ®ãšãµã€ãºã宣èšããã ãã§ãã ãããã£ãŠããããã¯ã®å€§ããªã°ã«ãŒãããã¡ã€ã«ã«å²ãåœãŠãŠãã¡ã¿ããŒã¿ã®éãæå°éã«æããªãããããé«éãªé 次ã¢ã¯ã»ã¹ã䜿çšã§ããŸãã
å¥åŠãªããšã«æ³šæããŠãã ããïŒext4ã«ã¯åŸæ¹äºææ§ããã
ãŸã ãã€ãŸãã
鿥ããã³
ãšã¯ã¹ãã³ãã®äž¡æ¹ã®ã¡ãœããããµããŒãã
ãŸã ã æžãèŸŒã¿æäœã®äŸã«ãããã¹ããŒã¹ãã©ã®ããã«åæ£ãããŠãããã確èªã§ããŸãã èšé²ã¯ã¹ãã¬ãŒãžã«çŽæ¥éãããŸãã-ããã©ãŒãã³ã¹äžã®çç±ãããããŒã¿ã¯æåã«ãã¡ã€ã«ãã£ãã·ã¥ã«éãããŸãã ãã®åŸãããæç¹ã§ããã£ãã·ã¥ã¯æ°žç¶ã¹ãã¬ãŒãžã«æ
å ±ãæžã蟌ã¿ãŸãã
ãã¡ã€ã«ã·ã¹ãã ãã£ãã·ã¥ã¯ã
writepagesæäœã
åŒã³åºããã address_space
æ§é äœã§è¡šãã
address_space
ã ã·ãŒã±ã³ã¹å
šäœã¯æ¬¡ã®ããã«ãªããŸãã
(cache writeback) ext4_aops-> ext4_writepages() -> ... -> ext4_map_blocks()
...
ext4_map_blocks()
ã¯ããšã¯ã¹ãã³ãã䜿çšãããŠãããã©ããã«å¿ããŠ
ext4_ext_map_blocks()
ãŸãã¯
ext4_ind_map_blocks()
颿°ãåŒã³åºããŸãã
extents.c
ã®æåã®éšåãèŠããšãåŸè¿°ã®
穎ãžã®åç
§ã確èªã§ããŸãã
ãã§ãã¯ãµã
ææ°äžä»£ã®ãã¡ã€ã«ã·ã¹ãã ã¯ãããŒã¿ãããã¯ã®
ãã§ãã¯ãµã ãä¿åããŠã
æ
éãªããŒã¿ç Žæãé²ã
ãŸã ã ãã®æ©èœã䜿çšãããšãã©ã³ãã ãšã©ãŒã
æ€åºããŠä¿®æ£ã§ããŸãããã¡ããããã¡ã€ã«ã®ãµã€ãºã«æ¯äŸããŠããã£ã¹ã¯ã®äœ¿çšæã«è¿œå ã®ãªãŒããŒããããçºçããŸãã
BTRFSãZFSã®ãããªææ°ã®ã·ã¹ãã ã¯ããŒã¿ã®ãã§ãã¯ãµã ããµããŒãããŠããŸãããext4ã®ãããªå€ãã·ã¹ãã ã¯ã¡ã¿ããŒã¿ã®ãã§ãã¯ãµã ãæã£ãŠããŸãã
ãã®ã³ã°
ext2ã®
ãã®ã³ã°æ©èœã¯ext3ã§ç»å ŽããŸããã ãã°-åé»ã«å¯Ÿããèæ§ãåäžãããããã«ãåŠçããããã©ã³ã¶ã¯ã·ã§ã³ãèšé²ãã埪ç°ãã°ã ããã©ã«ãã§ã¯ã
ã¡ã¿ããŒã¿ã«
ã®ã¿é©çšã
ããŸãããããã©ãŒãã³ã¹ã«åœ±é¿ãã
data=journal
ãªãã·ã§ã³ã䜿çšããŠã
data=journal
ã«å¯ŸããŠã¢ã¯ãã£ãåã§ããŸãã
ããã¯éåžž8ã®iããŒãçªå·ãš128 MBã®ãµã€ãºãæã€ç¹å¥ãªé ããã¡ã€ã«ã§ããã®èª¬æã¯å
¬åŒããã¥ã¡ã³ãã«ãããŸãïŒ
ext3ãã¡ã€ã«ã·ã¹ãã ã«è¡šç€ºããããã°ã¯ãã·ã¹ãã é害ãçºçããå Žåã®æå·ããFSãä¿è·ããããã«ext4ã§äœ¿çšãããŸãã å°ããªã·ãŒã±ã³ã·ã£ã«ãã£ã¹ã¯ãã©ã°ã¡ã³ãïŒããã©ã«ãã§ã¯128 MBïŒã¯ããéèŠãªããã£ã¹ã¯æžã蟌ã¿ãå¯èœãªéãè¿
éã«ããããããå ŽæãšããŠFSå
ã«äºçŽãããŠããŸãã éèŠãªããŒã¿ãæã€ãã©ã³ã¶ã¯ã·ã§ã³ããã£ã¹ã¯ã«å®å
šã«æžã蟌ãŸãããã£ãã·ã¥ïŒãã£ã¹ã¯æžã蟌ã¿ãã£ãã·ã¥ïŒãããã©ãã·ã¥ããããšãããŒã¿ã¬ã³ãŒãããã°ã«æžã蟌ãŸããŸãã åŸã§ããã°ã³ãŒãã¯ããã®ããŒã¿ã«é¢ããæžã蟌ã¿ãæ¶å»ãããåã«ããã£ã¹ã¯äžã®æçµäœçœ®ã«ãã©ã³ã¶ã¯ã·ã§ã³ãæžã蟌ã¿ãŸãïŒæäœã«ãããé·æéã®æ€çŽ¢ãŸãã¯å€æ°ã®èªã¿åã-åé€-å逿äœãçºçããå¯èœæ§ããããŸãïŒã 2åç®ã®äœéæžãèŸŒã¿æäœäžã«ã·ã¹ãã é害ãçºçããå Žåããžã£ãŒãã«ã䜿çšãããšãæåŸã®èšé²ãŸã§ã®ãã¹ãŠã®æäœãåçã§ãããžã£ãŒãã«ãä»ããŠãã£ã¹ã¯ã«æžã蟌ãŸãããã¹ãŠã®ååæ§ãä¿èšŒããŸãã ãã®çµæãã¡ã¿ããŒã¿ã®æŽæ°ã®éäžã§ãã¡ã€ã«ã·ã¹ãã ã忢ããªãããšãä¿èšŒãããŸãã
ããŒã«å
è£
ãããã¯ã®ãµãå²ãåœãŠãšãåŒã°ããããŒã«ãããã³ã°æ©èœã«ããããã¡ã€ã«ã·ã¹ãã ã¯æåŸã®ãããã¯ã®æ«å°Ÿã®ç©ºãã¹ããŒã¹ïŒãããŒã«ãïŒã䜿çšãããããç°ãªããã¡ã€ã«ã«åæ£ããŠããããŒã«ããåäžã®ãããã¯ã«å¹æçã«ããã¯ã§ããŸãã

å€ãã®å°ããªãã¡ã€ã«ãããå Žåã¯ç¹ã«ãå€ãã®ã¹ããŒã¹ãç¯çŽã§ããããšã¯çŽ æŽãããããšã§ãã...ããããæ¢åã®ããŒã«ã䜿çšãããã¹ããŒã¹ãæ£ç¢ºã«å ±åããªããšããäºå®ã«ã€ãªãããŸãã ãã®ããããã¹ãŠã®ãã¡ã€ã«ã®å æãããã¯ããã¹ãŠè¿œå ããŠããã£ã¹ã¯äœ¿çšéã«é¢ããå®éã®ããŒã¿ãååŸããããšã¯ã§ããŸããã ãã®æ©èœã¯ãBTRFSããã³ReiserFSãã¡ã€ã«ã·ã¹ãã ã§ãµããŒããããŠããŸãã
ã¹ããŒã¹ãã¡ã€ã«
ææ°ã®ãã¡ã€ã«ã·ã¹ãã ã®ã»ãšãã©ã¯ã
ã¹ããŒã¹ãã¡ã€ã«ããµããŒãããŠã
ãŸã ã ãã®ãããªãã¡ã€ã«ã«ã¯ãå®éã«ãã£ã¹ã¯ã«æžã蟌ãŸããªã
ããŒã«ãå«ãŸããå ŽåããããŸãïŒãã£ã¹ã¯å®¹éãå æããªãã§ãã ããïŒã ä»åã¯ãå®éã®
ãã¡ã€ã«ãµã€ãºã¯äœ¿çšããããããã¯ããã倧ãããªããŸãã

ãã®ãããªæ©èœã¯ãããšãã°ã倧ããªãã¡ã€ã«ããã°ããçæããããèŠæ±ã«å¿ããŠä»®æ³ãã·ã³ã®ä»®æ³ããŒããã£ã¹ã¯ã«ç©ºãé åãæäŸãããããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã
çŽ10 GBã®ãã£ã¹ã¯å®¹éãå æãã10ã®ã¬ãã€ãã®ãã¡ã€ã«ããã£ããäœæããã«ã¯ã次ãå®è¡ã§ããŸãã
$ dd if=/dev/zero of=file bs=2M count=5120
åã倧ããªãã¡ã€ã«ãããã«äœæããã«ã¯ãæåŸã®ãã€ããæžã蟌ããããŸãã¯æ¬¡ã®ããã«ããŸãã
$ dd of=file-sparse bs=2M seek=5120 count=0
ãŸãã¯ã
truncate
ã³ãã³ãã䜿çšããŸãã
$ truncate -s 10G
ãã¡ã€ã«ã«å²ãåœãŠããããã£ã¹ã¯å®¹éã¯ã
fallocate()
ã·ã¹ãã ã³ãŒã«ãè¡ã
fallocate
ã³ãã³ãã§å€æŽã§ããŸãã ãã®åŒã³åºãã§ã¯ãããã«é«åºŠãªæäœã䜿çšã§ããŸããäŸïŒ
- ãŒããæ¿å
¥ããŠããã¡ã€ã«ã®ã¹ããŒã¹ãäºåã«å²ãåœãŠãŸãã ãã®æäœã«ããããã£ã¹ã¯é åã®äœ¿çšéãšãã¡ã€ã«ãµã€ãºã®äž¡æ¹ãå¢å ããŸãã
- ã¹ããŒã¹ãè§£æŸããŸãã ãã®æäœã«ããããã¡ã€ã«ã«ç©Žãäœæããããã¡ã€ã«ããŸã°ãã«ãªãããã¡ã€ã«ãµã€ãºã«åœ±é¿ãäžããããšãªãã¹ããŒã¹ã®äœ¿çšãåæžãããŸãã
- ãã¡ã€ã«ãµã€ãºãšãã£ã¹ã¯äœ¿çšéãåæžããŠãã¹ããŒã¹ãæé©åããŸãã
- æ«å°Ÿã«ç©Žãæ¿å
¥ããŠããã¡ã€ã«ã¹ããŒã¹ãå¢ãããŸãã ãã¡ã€ã«ãµã€ãºã¯å¢å ããŠããããã£ã¹ã¯äœ¿çšéã¯å€åããŠããŸããã
- 穎ããªã»ããããŸãã 穎ã¯ããã£ã¹ã¯ã«æžã蟌ãŸãããšã¯ã¹ãã³ãã§ã¯ãªãããã£ã¹ã¯ã¹ããŒã¹ãšãã®äœ¿çšã«åœ±é¿ãäžããã«ãŒããšããŠèªã¿åãããŸãã
ããšãã°ã次ã®ããã«ããã¡ã€ã«ãã¹ããŒã¹ã«å€ããããšã§ãã¡ã€ã«ã«ç©Žãäœæã§ããŸãã
$ fallocate -d file
cp
ã³ãã³ãã¯ãã¹ããŒã¹ãã¡ã€ã«ã®æäœããµããŒãããŠããŸãã åçŽãªãã¥ãŒãªã¹ãã£ãã¯ã䜿çšããŠããœãŒã¹ãã¡ã€ã«ãã¹ããŒã¹ãã©ããã倿ããããšããŸããããã§ããã°ãçµæã®ãã¡ã€ã«ãã¹ããŒã¹ã«ãªããŸãã æ¬¡ã®ããã«ãéã¹ããŒã¹ãã¡ã€ã«ãã¹ããŒã¹ãã¡ã€ã«ã«ã³ããŒã§ããŸãã
$ cp --sparse=always file file_sparse
...éã®ã¢ã¯ã·ã§ã³ïŒã¹ããŒã¹ãã¡ã€ã«ã®ãé«å¯åºŠãã³ããŒãäœæããïŒã¯æ¬¡ã®ããã«ãªããŸãã
$ cp --sparse=never file_sparse file
ãããã£ãŠãã¹ããŒã¹ãã¡ã€ã«ã䜿çšãããå Žåã¯ã次ã®ãšã€ãªã¢ã¹ã端æ«ç°å¢ã«è¿œå ã§ããŸãïŒ
~/.zshrc
ãŸãã¯
~/.bashrc
ïŒã
alias cp='cp --sparse=always'
ããã»ã¹ã
穎ã®ã»ã¯ã·ã§ã³ã®ãã€ããèªã¿åã
ãšããã¡ã€ã«ã·ã¹ãã ã¯ãããã«ãŒãã®ããŒãžãæäŸããŸãã ããšãã°ãext4ã®ããŒã«é åã«ãããã¡ã€ã«ã·ã¹ãã ãããã¡ã€ã«ãã£ãã·ã¥ãèªã¿åããããšãã«äœãèµ·ãããã確èªã§ããŸãã ãã®å Žåã
readpage.c
ã®ã·ãŒã±ã³ã¹ã¯
readpage.c
ããã«ãªããŸãã
(cache read miss) ext4_aops-> ext4_readpages() -> ... -> zero_user_segment()
ãã®åŸãããã»ã¹ã
read()
ã·ã¹ãã ã³ãŒã«ã§ã¢ã¯ã»ã¹ããããšããŠããã¡ã¢ãªã»ã°ã¡ã³ãã¯ãé«éã¡ã¢ãªããçŽæ¥ãŒããååŸããŸãã
COWãã¡ã€ã«ã·ã¹ãã ïŒã³ããŒãªã³ã©ã€ãïŒ
次ã®ïŒextãã¡ããªã®åŸã®ïŒãã¡ã€ã«ã·ã¹ãã ã®çæã¯ãããã€ãã®éåžžã«è峿·±ãæ©èœããããããŸããã ãããããZFSãBTRFSã®ãããªãã¡ã€ã«ã·ã¹ãã ã®æ©èœã®äžã§æå€§ã®æ³šç®ã¯ãCOWïŒcopy-on-writeã "copy-on-write"ïŒã«å€ããã§ãããã
ã³ããŒãªã³ã©ã€ããŸãã¯
ã¯ããŒã³ æäœ ããŸãã¯
reflinkã³ã㌠ããŸãã¯
ã·ã£ããŒã³ããŒãå®è¡ããå Žåãå®éã«ã¯ãšã¯ã¹ãã³ãã®éè€ã¯ãããŸããã æ°ãããã¡ã€ã«ã®ã¡ã¿ããŒã¿ã«æ³šéãäœæããã ãã§ãå
ã®ãã¡ã€ã«ã®åããšã¯ã¹ãã³ããåç
§ãããšã¯ã¹ãã³ãèªäœã¯
sharedãšããŠããŒã¯ã
ããŸãã åæã«ãåå¥ã«å€æŽã§ãã2ã€ã®åå¥ã®ãã¡ã€ã«ããããšããé¯èŠããŠãŒã¶ãŒç©ºéã«äœæãããŸãã ããã»ã¹ãå
±æãšã¯ã¹ãã³ãã«æžã蟌ã¿ããå Žåãã«ãŒãã«ã¯æåã«ãã®ã³ããŒãäœæãããã®ãšã¯ã¹ãã³ããåäžã®ãã¡ã€ã«ã«å±ããããšã泚éããŸãïŒå°ãªããšãçŸæç¹ã§ã¯ïŒã ãã®åŸã2ã€ã®ãã¡ã€ã«ã«ã¯ããã«éãããããŸãããå€ãã®ãšã¯ã¹ãã³ãã§å
±æã§ããŸãã ã€ãŸããCOW察å¿ãã¡ã€ã«ã·ã¹ãã ã®ãšã¯ã¹ãã³ãã¯ãã¡ã€ã«éã§åå²ã§ããFSã¯å¿
èŠãªå Žåã«ã®ã¿æ°ãããšã¯ã¹ãã³ãã®äœæãä¿èšŒããŸãã

ã芧ã®ãšãããã¯ããŒã³äœæã¯éåžžã«é«éãªæäœã§ãããéåžžã®ã³ããŒã®å Žåã«äœ¿çšãããã¹ããŒã¹ã2åã«ããå¿
èŠã¯ãããŸããã BTRFSããã³ZFSã§ã€ã³ã¹ã¿ã³ãã¹ãããã·ã§ãããäœæããå¯èœæ§ã®èåŸã«ããã®ã¯ããã®ãã¯ãããžãŒã§ãã æåéããã«ãŒããã¡ã€ã«ã·ã¹ãã å
šäœã1ç§æªæºã§è€è£œïŒãŸãã¯
ã¹ãããã·ã§ãã ïŒã§ããŸãã ããšãã°ãäœããå£ããå Žåã«ããã±ãŒãžãæŽæ°ããåã«éåžžã«äŸ¿å©ã§ãã
BTRFSã¯ãæµ
ãã³ããŒãäœæããããã®2ã€ã®æ¹æ³ããµããŒãããŠããŸãã æåã¯
ãµãããªã¥ãŒã ãåç
§ãã
btrfs subvolume snapshot
ã䜿çšããŸãã 2çªç®ã¯åã
ã®ãã¡ã€ã«çšã§ã
cp --reflink
ã䜿çšã
cp --reflink
ã ããã©ã«ãã§é«éã®æµ
ãã³ããŒãäœæããå Žåããã®ãããªãšã€ãªã¢ã¹ïŒ
~/.zshrc
ãŸãã¯
~/.bashrc
ïŒã
~/.zshrc
ãŸãã
cp='cp --reflink=auto --sparse=always'
次ã®ã¹ãããã¯ãéæµ
ãã³ããŒãŸãã¯ãã¡ã€ã«ããŸãã¯ãšã¯ã¹ãã³ãã
éè€ãããã¡ã€ã«ãããå Žåããããã
éè€æé€ããŠãå
±éã®ãšã¯ã¹ãã³ããïŒreflinkãä»ããŠïŒäœ¿çšããã¹ããŒã¹ãè§£æŸããããšãã§ããŸãã ãã®ããã®ããŒã«ã®1ã€ã¯
duperemoveã§ã ããã ããããã«ãããã¡ã€ã«ã®æçåãèªç¶ã«å¢å ããããšã«
泚æããŠãã ããã
ããã§ããã¡ã€ã«ã«ãã£ãŠãã£ã¹ã¯é åãã©ã®ããã«äœ¿çšãããããçè§£ããããšãããšãäºæ
ã¯ããã»ã©åçŽã§ã¯ãããŸããã
du
ã
dutreeã®ãããªãŠãŒãã£ãªãã£ã¯ããããã¯ã®äžéšãå
±æãããŠããå¯èœæ§ãèæ
®ããã«ã䜿çšãããŠãããããã¯ã®ã¿ãèæ
®ããŸãã
åæ§ã«ãBTRFSã®å Žåã¯ãBTRFSãã¡ã€ã«ã·ã¹ãã ã«ãã£ãŠå æãããŠããã¹ããŒã¹ã空ããšããŠè¡šç€ºãããããã
df
ã³ãã³ãã¯äœ¿çšããªãã§ãã ããã
btrfs filesystem usage
ã䜿çšããæ¹ãè¯ãïŒ
$ sudo btrfs filesystem usage /media/disk1 Overall: Device size: 2.64TiB Device allocated: 1.34TiB Device unallocated: 1.29TiB Device missing: 0.00B Used: 1.27TiB Free (estimated): 1.36TiB (min: 731.10GiB) Data ratio: 1.00 Metadata ratio: 2.00 Global reserve: 512.00MiB (used: 0.00B) Data,single: Size:1.33TiB, Used:1.26TiB /dev/sdb2 1.33TiB Metadata,DUP: Size:6.00GiB, Used:3.48GiB /dev/sdb2 12.00GiB System,DUP: Size:8.00MiB, Used:192.00KiB /dev/sdb2 16.00MiB Unallocated: /dev/sdb2 1.29TiB $ sudo btrfs filesystem usage /media/disk1 Overall: Device size: 2.64TiB Device allocated: 1.34TiB Device unallocated: 1.29TiB Device missing: 0.00B Used: 1.27TiB Free (estimated): 1.36TiB (min: 731.10GiB) Data ratio: 1.00 Metadata ratio: 2.00 Global reserve: 512.00MiB (used: 0.00B) Data,single: Size:1.33TiB, Used:1.26TiB /dev/sdb2 1.33TiB Metadata,DUP: Size:6.00GiB, Used:3.48GiB /dev/sdb2 12.00GiB System,DUP: Size:8.00MiB, Used:192.00KiB /dev/sdb2 16.00MiB Unallocated: /dev/sdb2 1.29TiB
æ®å¿µãªãããCOWãã¡ã€ã«ã·ã¹ãã å
ã®åã
ã®ãã¡ã€ã«ã®å æã¹ããŒã¹ã远跡ããç°¡åãªæ¹æ³ã¯ç¥ããŸããã ãµãããªã¥ãŒã ã¬ãã«ã§ã¯ã
btrfs-duãªã©ã®ãŠãŒãã£ãªãã£ã䜿çšããŠãã¹ãããã·ã§ããã«åºæã§ãããã¹ãããã·ã§ããéã§å
±æãããããŒã¿éã®æŠç®ãååŸã§ããŸãã
åç
§è³æ
翻蚳è
ããã®PS
ããã°ãã芧ãã ããã