Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
coreutils/rm Dive Deep
Search
tanuki
February 17, 2023
Programming
0
17
coreutils/rm Dive Deep
tanuki
February 17, 2023
Tweet
Share
More Decks by tanuki
See All by tanuki
AWSへの移行 1年間の軌跡
_ht_mn_
0
19
クラウドネイティブ化への第一歩/excitech-20211018
_ht_mn_
0
1.7k
Other Decks in Programming
See All in Programming
Reactive Thinking with Signals and the Resource API
manfredsteyer
PRO
0
100
あなたとKaigi on Rails / Kaigi on Rails + You
shimoju
0
170
AI駆動で0→1をやって見えた光と伸びしろ
passion0102
1
760
コードとあなたと私の距離 / The Distance Between Code, You, and I
hiro_y
0
190
O Que É e Como Funciona o PHP-FPM?
marcelgsantos
0
180
テーブル定義書の構造化抽出して、生成AIでDWH分析を試してみた / devio2025tokyo
kasacchiful
0
260
Writing Better Go: Lessons from 10 Code Reviews
konradreiche
3
5.6k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
130
オープンソースソフトウェアへの解像度🔬
utam0k
17
3.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
570
CSC305 Lecture 10
javiergs
PRO
0
220
CSC305 Lecture 08
javiergs
PRO
0
270
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
The Cult of Friendly URLs
andyhume
79
6.6k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Producing Creativity
orderedlist
PRO
347
40k
Building Applications with DynamoDB
mza
96
6.7k
The World Runs on Bad Software
bkeepers
PRO
72
11k
Navigating Team Friction
lara
190
15k
Context Engineering - Making Every Token Count
addyosmani
7
280
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
610
Build your cross-platform service in a week with App Engine
jlugia
232
18k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
Transcript
coreutils/rm Dive Deep ΤΩαΠτגࣜձࣾɹٶ൏ਓ 1
͡Ίʹ 2
͜Μͳ͜ͱͳ͍Ͱ͔͢ʁ 3
ྫ͑ 1.োൃੜʂ 2.͍Ζ͍Ζௐ͚ͨͲΑ͘Θ͔ΒΜʂ 3.ոͦ͠͏ͳͱ͜ΖΛݟ͚ͭͨʂमਖ਼ͯ͠σϓϩΠʂ 4.ͳΜ͔Α͘Θ͔ΒΜ͚Ͳಈ͍ͨʂ 4 ͡Ίʹ
͑ͬ 5
νϣοτϚος • ࠶ಉ͡ࣄʹૺ۰ͯ͠ରԠͰ͖Δʁ • ͦΜͳোใࠂͰେৎ͔ʁ • ͪΌΜͱղܾͰ͖͍ͯͳ͍ɺͬͯͳΜ͔չ͘͠ͳ͍ʁ 6 ͡Ίʹ
7 ࠓͷΰʔϧ ͡Ίʹ • ಈ͍͔ͨΒϤγɺͰऴΘΒͤͳ͍ͨΊʹʁ • ͳΜ͔Α͘Θ͔ΒΜɺ͔Β٫͢Δʹʁ • ٕज़ͷਂ۷Γͱͦͷઌʹ͋Δͷʁ
8 ࠓɺ͞ͳ͍͜ͱ ͡Ίʹ • CPUͱ͔ϝϞϦཧͱ͔ • ઐྖҬͰͳ͍ͷͰɺࡉ͔͍࣭ʹ͑ΒΕͳ͍Α • ͱɺ༧ઢΛ͓ͬͯ͘
Coreutilsʹ͍ͭͯ 9
lsͯ͠Δʁ • ࠇ͍ը໘ʹίϚϯυೖྗɺ୭ͬͨ͜͠ͱ͕͋Δͣ 10 $PSFVUJMTʹ͍ͭͯ
͓·͚ɿexa͍͍κ 11 $PSFVUJMTʹ͍ͭͯ
ଞʹcatͱ͔rmͱ͔ • ͜ΕΒΛϢʔςΟϦςΟʢίϚϯυʣͱݺͿ • CoreutilsͦͷϢʔςΟϦςΟΛ·ͱΊͨͷ • POSIXSUSͰنఆ͞Ε͍ͯΔ • lscatrmɺ࠷৽ͷنఆʢPOSIX.1-2017ʣͰඞਢ 12
$PSFVUJMTʹ͍ͭͯ
LinuxίϚϯυ is Կʁ 13
ͦͦLinuxͱʁ • ਖ਼֬ʹΧʔωϧ͚ͩΛࢦࣔ͢͠ • LinuxΧʔωϧͱGNUιϑτΣΞ܈Λ߹ΘͤͯGNU/Linux • glibcʢGNU C Libraryʣ •
gccʢGNU Compiler Collectionʣ • GNU CoreutilsʢGNU Core Utilitiesʣ • ͜ΕΒʹै͑ɺLinuxίϚϯυͳΜͯଘࡏ͠ͳ͍͚Ͳ... 14 $PSFVUJMTʹ͍ͭͯ
LinuxίϚϯυͰྑ͍͡ΌΜ 15 ͜·͚͍͍͐ͨ͊͜ΜͩΑ
͓͞Β͍ɿΧʔωϧͷجૅ • ϓϩηεετϨʔδͳͲͷϋʔυΣΞʹΞΫηεͰ͖ͳ͍ • ϓϩηεΧʔωϧΛհͯ͠σόΠεͳͲʹΞΫηε͢Δ • ϓϩηεγεςϜίʔϧΛൃߦͯ͠ΧʔωϧʹॲཧΛґཔ͢Δ 16 $PSFVUJMTʹ͍ͭͯ
GNU Coreutils • macͷlsͱGNU/Linuxͷlsผ • ωοτʹస͕͍ͬͯΔίϚϯυ͕macͰಈ͔ͳ͍ɺ͋Δ͋Δ • ྫ͑psɺmacͷඪ४ίϚϯυͰ--sortΦϓγϣϯ͕ͳ͍ 17 $PSFVUJMTʹ͍ͭͯ
※ CPU༻ϝϞϦফඅͰιʔτͰ͖Δ
ʮmacͰGNU Coreutils͕͍ͨ͠ʂʯ • macʹGNU CoreutilsΛΠϯετʔϧͯ͠ΈΑ͏ • brew install coreutils 18
$PSFVUJMTʹ͍ͭͯ
rmͷΦϓγϣϯ 19
લఏ • GNU Coreutils 8.22 • glibc 2.26 • kernel
5.10.x • Amazon Linux 2 x86_64 20 SNͷجຊΛ͓͞Β͍
ϓϩϯϓτ͕ग़Δ݅ɺͳʔΜͩʁ • ॳճ͚ͩ • -I, --interactive=once ͕༩͑ΒΕɺ3ͭΑΓଟ͍ϑΝΠϧΛআ͢Δͱ͖ • -r, -R,
--recursive ͕༩͑ΒΕͨͱ͖ • ຖճ • ॻ͖ࠐΈෆՄೳɺඪ४ೖྗ͕ɺ-f, --force ͕༩͑ΒΕ͍ͯͳ͍ͱ͖ • -i, --interactive=always ͕༩͑ΒΕͨͱ͖ 21 SNͷجຊΛ͓͞Β͍
ͦͷଞͷΦϓγϣϯ • ۭͷσΟϨΫτϦΛআ͢Δʹʁ • rm -t <ۭͷσΟϨΫτϦ> • -iͱ-fΛಉ࣌ʹࢦఆͨ͠Βʁ •
ޙऀͷΦϓγϣϯͰ্ॻ͖͞ΕΔ • ϑΝΠϧ໊ʹ - ͕ண͍͍ͯΔ߹ʁ • rm -- -foo ͘͠ɺrm ./-foo 22 SNͷجຊΛ͓͞Β͍
ίʔυϦʔσΟϯά 23
४උ • GNU Coreutils • git clone git://git.sv.gnu.org/coreutils • linux
• git clone
[email protected]
:torvalds/linux.git • glibc • git clone https://sourceware.org/git/glibc.git 24 ίʔυϦʔσΟϯά
·ͣstraceͯ͠ΈΔ • strace ʻ࣮ߦίϚϯυʼ Έ͍ͨʹ͏ • ྫɿstrace rm test.txt •
ҎԼͷΑ͏ͳ͜ͱ͕֬ೝͰ͖Δ • ϓϩάϥϜ͕ൃߦͨ͠γεςϜίʔϧ • ݺͼग़͞ΕͨΧʔωϧػೳͷ࣮ߦʹ͔͔ͬͨ࣌ؒ • ଟ͘ར༻͞ΕͨγεςϜίʔϧͳʹ͔ 25 ίʔυϦʔσΟϯά
26
unlinkat(AT_FDCWD, "test.txt", 0) 27 Ͳ͔͜ͰunlinkatγεςϜίʔϧ͕ൃߦ͞Ε͍ͯΔ
coreutils/src/rm.c • ࠷ऴతʹɺremove.c ͷ rm ؔʹඈΜͰ͍Δ 28 ίʔυϦʔσΟϯά
coreutils/src/remove.c 29 ίʔυϦʔσΟϯά
coreutils/src/remove.c • xfts_open • ϑΝΠϧσΟεΫϦϓλΛؚΉFTSߏମΛฦ͢ • σΟϨΫτϦΛͤ࠶ؼతʹ֊Λḷͬͯ͘ΕΔ • fts_read •
FTSENTߏମΛฦ͢ • ύεϑΝΠϧ໊ͳͲͷใΛ֨ೲ͍ͯ͠Δ 30 ίʔυϦʔσΟϯά
• લड़ͷFTSͱFTSENTΛunlinkatʹ͢ coreutils/src/remove.c 31 ίʔυϦʔσΟϯά
glibc/sysdeps/unix/sysv/linux/x86_64/sysdep.h 32 ίʔυϦʔσΟϯά
ΞηϯϒϦ܅... • ઌ΄ͲͷΞηϯϒϦΛ࣮ߦ͞ΕΔͱ • ϨδελʹΛηοτ͠ɺsyscall໋ྩΛ࣮ߦ • CPU͕ΧʔωϧϞʔυʹભҠ • ϓϩηεͷΘΓʹΧʔωϧ͕ॲཧΛ࣮ߦ •
ॲཧ͕ऴΘͬͨΒɺCPUϢʔβϞʔυʹભҠ • ݺͼग़͠ݩʹΔ 33 ίʔυϦʔσΟϯά
linux/fs/namei.c • γεςϜίʔϧͷઌΧʔωϧͷॲཧ 34 ίʔυϦʔσΟϯά
linux/fs/namei.c 35 ίʔυϦʔσΟϯά
VFSͬͯͳΜͶΜ 36 ίʔυϦʔσΟϯά • ϑΝΠϧγεςϜΛҙࣝ͢Δඞཁ͕ແ͍ • ϑΝΠϧૢ࡞ͷΠϯλʔϑΣʔεͱͯ͠ͷׂ ϓϩηε VFSʢVirtual Filesystemʣ
ext4༻ͷॲཧ zfs༻ͷॲཧ σόΠευϥΠό σόΠεA σόΠεB
dentryͱinodeͷ؆୯ͳҧ͍ 37 ίʔυϦʔσΟϯά • inodeϑΝΠϧ໊Λ͍࣋ͬͯͳ͍ • lsͰฦ͞ΕΔUIDαΠζͳͲΛอ࣋ • dentry͕ϑΝΠϧ໊ͱinodeΛඥ͚Δ
linux/fs/ext4/namei.c 38 ίʔυϦʔσΟϯά • vfs_unlink͔Β֤fsຖͷ࣮ • ͜͜Ͱext4 • ͜ͷઌ·ͩ·ͩଓ͘
39 rmͷཱྀ࿏ͷՌͯ ίʔυϦʔσΟϯά • Coreutilsͷrm͕γεςϜίʔϧΛൃߦ • glibcͷϥούʔ͕ؔγεςϜίʔϧΛ࣮ߦ • ΧʔωϧVFSܦ༝ͰΦϒδΣΫτͷআ •
ϑΝΠϧγεςϜଆͰɺdentryinodeͷআ͕࢝·Δʢআ͞Εͨ ͱݴͬͯͳ͍ʣ
͓ΘΓʹ 40
݁ہɺԿ͕ݴ͍͍ͨͷʁ • CoreutilsͷιʔείʔυʹڵຯΛ࣋ͬͨͷ͕࢝·Γ • ݁ՌతʹΧʔωϧʹḷΓண͍ͯ͠·͚ͬͨͩ • ࠷ॳ͔ΒਂΛ͖͔ͨͬͨΘ͚Ͱͳ͍ 41 ͓ΘΓʹ
݁ہɺԿ͕ݴ͍͍ͨͷʁ • ෳࡶͳՕॴͰநԽ͞Ε͍ͯΕɺཪଆΛਂ͘ཧղ͠ͳͯ͘ ʢมԽ͕͋ͬͯʣγεςϜ։ൃ͕Ͱ͖Δ • ͋Εʁ͜ΕͬͯීஈͷΞϓϦέʔγϣϯ։ൃͱಉ͡͡ΌΜʁ • ۀͱతʹؔͷͳ͍ྖҬ͔ΒಘΒΕΔͷ͕͋Δʂ 42 ͓ΘΓʹ
ʮຊʹʯಘΒΕͨͷ • ʮ༁ͷΘ͔Βͳ͍ͷʯʹग़ձ͏ָ͠Έ • ϨΠϠʔͷڪා৺ɺΛ্ճΔ΄Ͳͷڵຯؔ৺ • ࠔͳࣄʹཱ͔ͪ͏ͨΊͷڧ͘ંΕͳ͍৺ • ʑֶͼଓ͚Δɺͱ͍͏͜ͱ 43
͓ΘΓʹ
Keep Going! 44