๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
6. CS ๊ธฐ์ดˆ ๐Ÿ“š/Linux & Unix ๐Ÿง

[Linux/Unix][5-2] ํ•˜๋“œ ๋งํฌ vs ์‹ฌ๋ณผ๋ฆญ ๋งํฌ

by lxvxxu 2025. 10. 21.

Hard Link์™€ Symbolic Link๋Š” ๋ชจ๋‘ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์™€์˜ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

์šฐ์„ , Hard Link๋Š” File System ๋‚ด์—์„œ ๋™์ผํ•œ inode ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋Š” ์›๋ณธ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ๊ณต์œ ํ•œ๋‹ค. ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋ฆ„์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค. ์›๋ณธ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋”๋ผ๋„ Hard Link๋กœ ์—ฐ๊ฒฐ๋œ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋˜ํ•œ ์œ ์ง€๋œ๋‹ค. ํ•˜๋“œ ๋งํฌ๋Š” ์›๋ณธ ํŒŒ์ผ๊ณผ ๊ตฌ๋ณ„๋˜์ง€ ์•Š์œผ๋ฉฐ ๋™์ผํ•œ ํŒŒ์ผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ํŒŒ์ผ์—๋„ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜์˜๋œ๋‹ค. ๋˜ํ•œ Hard Link๋Š” ๋™์ผํ•œ File System ๋‚ด์—์„œ๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. Directory์— ๋Œ€ํ•œ Hard Link๋Š” ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜ค์ง File์— ๋Œ€ํ•œ Link๋งŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Symbolic Link๋Š” ์›๋ณธ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ„์ ‘์ ์ธ ํฌ์ธํ„ฐ์ด๋‹ค. ์ด๋Š” ์›๋ณธ ํŒŒ์ผ๊ณผ ์ƒ์ดํ•œ inode ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์›๋ณธ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์›๋ณธ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋ฉด Symbolic Link๋Š” ๊นจ์ง€๋ฉฐ, ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค(broken link). Symbolic Link๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์œ„์น˜ํ•œ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ File ๋ฟ ์•„๋‹ˆ๋ผ Directory๋„ Linkํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์•„๋ž˜๋Š” ๋„ˆ๊ฐ€ ์ค€ ๋‚ด์šฉ์„ ๊ต์žฌ๋‚˜ ์‹œํ—˜ ๋Œ€๋น„์šฉ์œผ๋กœ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•œ ๋ฒ„์ „์ด์•ผ.
๊ตฌ์กฐ๋Š” ๐Ÿ“˜ ๊ฐœ๋… ๋น„๊ต → ๐Ÿ”น Hard Link → ๐Ÿ”น Symbolic Link → โš–๏ธ ๋น„๊ตํ‘œ → ๐Ÿ’ก์ถ”๊ฐ€ ์„ค๋ช… ์ˆœ์œผ๋กœ ์งฐ์–ด.
(์ด๋ชจ์ง€, ํ‘œ, ํ•ต์‹ฌ์–ด ๊ฐ•์กฐ๋กœ ๊ฐ€๋…์„ฑ ๊ทน๋Œ€ํ™”ํ•จ)


๐Ÿ”— Hard Link vs Symbolic Link

UNIX/Linux์—์„œ ๋งํฌ(Link) ๋Š”
ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜,
๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋งํฌ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค:

  • Hard Link (ํ•˜๋“œ ๋งํฌ)
  • Symbolic Link (์‹ฌ๋ณผ๋ฆญ ๋งํฌ, ํ˜น์€ Soft Link)

๐Ÿ”น 1๏ธโƒฃ Hard Link (ํ•˜๋“œ ๋งํฌ)

๐Ÿ“ ๊ฐœ๋…

  • ๊ฐ™์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋™์ผํ•œ inode ๋ฒˆํ˜ธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ด๋‹ค.
  • ์ฆ‰, ํ•˜๋‚˜์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก(ํŒŒ์ผ ๋‚ด์šฉ) ์„ ์—ฌ๋Ÿฌ ์ด๋ฆ„์ด ๊ณต์œ ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.

๐Ÿง  ํ•ต์‹ฌ ํŠน์ง•

  • ์›๋ณธ ํŒŒ์ผ๊ณผ inode ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™๋‹ค.
  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ฐธ์กฐ → ๋‚ด์šฉ์ด ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋จ.
  • ์›๋ณธ ํŒŒ์ผ์„ ์‚ญ์ œํ•ด๋„ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋œ๋‹ค.
    (๋‹ค๋ฅธ ํ•˜๋“œ ๋งํฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ, ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ)
  • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ํ•˜๋“œ ๋งํฌ ์ƒ์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅ.
  • ๊ฐ™์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‚ด์—์„œ๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ.

๐Ÿ“Ž ๋ช…๋ น์–ด ์˜ˆ์‹œ

ln original.txt hardlink.txt

→ original.txt์™€ hardlink.txt๋Š” ์™„์ „ํžˆ ๋™์ผํ•œ ํŒŒ์ผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

๐Ÿ“Š ๋™์ž‘ ์˜ˆ

 
$ echo "Hello" > a.txt
$ ln a.txt b.txt
$ ls -li
131072 -rw-r--r-- 2 user user 6 Oct 21 12:30 a.txt
131072 -rw-r--r-- 2 user user 6 Oct 21 12:30 b.txt

inode ๋ฒˆํ˜ธ๊ฐ€ ๋™์ผ(131072) → ๊ฐ™์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ๊ณต์œ 


๐Ÿ”น 2๏ธโƒฃ Symbolic Link (์‹ฌ๋ณผ๋ฆญ ๋งํฌ / ์†Œํ”„ํŠธ ๋งํฌ)

๐Ÿ“Ž ๊ฐœ๋…

  • ์›๋ณธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ(path) ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ์ด๋‹ค.
  • ์ผ์ข…์˜ “์ง€๋ฆ„๊ธธ(Shortcut)” ๋˜๋Š” ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿง  ํ•ต์‹ฌ ํŠน์ง•

  • ์›๋ณธ ํŒŒ์ผ๊ณผ inode ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๋‹ค.
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด ์•„๋‹ˆ๋ผ, “๊ฒฝ๋กœ ๋ฌธ์ž์—ด” ์„ ์ €์žฅํ•œ๋‹ค.
  • ์›๋ณธ ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋ฉด ๋งํฌ๊ฐ€ ๋Š๊ธด๋‹ค → Broken Link (๊นจ์ง„ ๋งํฌ)
  • ํŒŒ์ผ๋ฟ ์•„๋‹ˆ๋ผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋„ ๋งํฌ ๊ฐ€๋Šฅ.
  • ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ„์—๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Ž ๋ช…๋ น์–ด ์˜ˆ์‹œ

 
ln -s /home/user/original.txt link.txt

→ link.txt๋Š” /home/user/original.txt๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ๋œ๋‹ค.

๐Ÿ“Š ๋™์ž‘ ์˜ˆ

 
$ ls -li
131072 -rw-r--r-- 1 user user 6 Oct 21 12:30 original.txt
131080 lrwxrwxrwx 1 user user 17 Oct 21 12:31 link.txt -> /home/user/original.txt

inode ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅด๊ณ (131072 vs 131080), ->๋กœ ์›๋ณธ ๊ฒฝ๋กœ๋ฅผ ํ‘œ์‹œํ•จ


โš–๏ธ Hard Link vs Symbolic Link ๋น„๊ตํ‘œ

๊ตฌ๋ถ„Hard LinkSymbolic Link
inode ๋ฒˆํ˜ธ ๋™์ผ (์›๋ณธ๊ณผ ๊ฐ™์Œ) ์„œ๋กœ ๋‹ค๋ฆ„
๋ฐ์ดํ„ฐ ๊ณต์œ  O (๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ธ”๋ก) X (๊ฒฝ๋กœ๋งŒ ์ €์žฅ)
์›๋ณธ ์‚ญ์ œ ์‹œ ๋ฐ์ดํ„ฐ ์œ ์ง€๋จ ๋งํฌ ๊นจ์ง (broken link)
๋Œ€์ƒ ํŒŒ์ผ๋งŒ ๊ฐ€๋Šฅ ํŒŒ์ผ + ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฐ€๋Šฅ
ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๊ณ„ ๋„˜์„ ์ˆ˜ ์—†์Œ ๊ฐ€๋Šฅ
์—ญํ•  ๋™์ผํ•œ ํŒŒ์ผ์˜ ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„ ์›๋ณธ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
์ƒ์„ฑ ๋ช…๋ น์–ด ln file link ln -s file link
๋””์Šคํฌ ๊ณต๊ฐ„ ๋™์ผํ•œ ๋ธ”๋ก์„ ๊ณต์œ  → ํšจ์œจ์  ๋ณ„๋„ ๋งํฌ ํŒŒ์ผ ํ•„์š”
์‚ฌ์šฉ ์˜ˆ ๋ฐฑ์—…, ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ฐ”๋กœ๊ฐ€๊ธฐ, ๊ฒฝ๋กœ ๋‹จ์ถ•

๐Ÿ’ก ์ถ”๊ฐ€ ์„ค๋ช…

  • inode ๊ธฐ๋ฐ˜ ์ฐจ์ด
    Hard Link๋Š” ๋™์ผํ•œ inode๋ฅผ, Symbolic Link๋Š” ๋ณ„๋„์˜ inode๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ls -l์—์„œ ํ™•์ธํ•˜๊ธฐ
    • Hard Link: ๊ถŒํ•œ ์•ž์— ์ผ๋ฐ˜ ํŒŒ์ผ(-rw-r--r--) ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋จ
    • Symbolic Link: ์•ž์— l์ด ๋ถ™์Œ (lrwxrwxrwx)
      → -> ๋’ค์— ์›๋ณธ ๊ฒฝ๋กœ ํ‘œ์‹œ
  • Broken Link ์˜ˆ์‹œ
$ rm original.txt
$ cat link.txt
cat: link.txt: No such file or directory
  • ์›๋ณธ์ด ์‚ฌ๋ผ์ ธ์„œ ๊ฒฝ๋กœ ์ฐธ์กฐ๊ฐ€ ๋ฌดํšจํ™”๋œ ์ƒํƒœ