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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
tanuki
February 17, 2023
Programming
0
24
coreutils/rm Dive Deep
tanuki
February 17, 2023
Tweet
Share
More Decks by tanuki
See All by tanuki
AWSへの移行 1年間の軌跡
_ht_mn_
0
25
クラウドネイティブ化への第一歩/excitech-20211018
_ht_mn_
0
2.2k
Other Decks in Programming
See All in Programming
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1.1k
CSC307 Lecture 08
javiergs
PRO
0
690
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
390
文字コードの話
qnighy
43
16k
Python’s True Superpower
hynek
0
190
TROCCOで実現するkintone+BigQueryによるオペレーション改善
ssxota
0
110
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
470
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
340
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
1
330
Ruby x Terminal
a_matsuda
5
490
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
2.7k
株式会社 Sun terras カンパニーデック
sunterras
0
1.9k
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
670
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Color Theory Basics | Prateek | Gurzu
gurzu
0
220
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
200
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
130
The Cult of Friendly URLs
andyhume
79
6.8k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.7k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
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