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
12
coreutils/rm Dive Deep
tanuki
February 17, 2023
Tweet
Share
More Decks by tanuki
See All by tanuki
AWSへの移行 1年間の軌跡
_ht_mn_
0
17
クラウドネイティブ化への第一歩/excitech-20211018
_ht_mn_
0
1.6k
Other Decks in Programming
See All in Programming
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
380
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
11
3k
React 使いじゃなくても知っておきたい教養としての React
oukayuka
14
4k
バイブコーディング超えてバイブデプロイ〜CloudflareMCPで実現する、未来のアプリケーションデリバリー〜
azukiazusa1
2
730
What's new in Adaptive Android development
fornewid
0
120
20250708_JAWS_opscdk
takuyay0ne
2
160
Gemini CLI のはじめ方
ttnyt8701
1
110
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
40
15k
Jakarta EE Meets AI
ivargrimstad
0
400
[DevinMeetupTokyo2025] コード書かせないDevinの使い方
takumiyoshikawa
2
220
CDK引数設計道場100本ノック
badmintoncryer
2
590
Workers を定期実行する方法は一つじゃない
rokuosan
0
130
Featured
See All Featured
Writing Fast Ruby
sferik
628
62k
Designing for humans not robots
tammielis
253
25k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
The World Runs on Bad Software
bkeepers
PRO
70
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
4 Signs Your Business is Dying
shpigford
184
22k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
390
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Fireside Chat
paigeccino
37
3.5k
Navigating Team Friction
lara
187
15k
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