loop(4) - wariua/manpages-ko GitHub Wiki
loop, loop-control - ๋ฃจํ ์ฅ์น
#include <linux/loop.h>
๋ฃจํ ์ฅ์น๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ํ๋ ๋์คํฌ๋ ๊ดํ ๋์คํฌ ๋๋ผ์ด๋ธ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ฅ์น๊ฐ ์๋๋ผ ํ์ผ ์์คํ ๋ด ์ ๊ท ํ์ผ์ ๋ธ๋ก์ด๋ ๋ค๋ฅธ ๋ธ๋ก ์ฅ์น๋ก ๋งคํ ํ๋ ๋ธ๋ก ์ฅ์น์ด๋ค. ์๋ฅผ ๋ค์ด ํ์ผ๋ก ์ ์ฅ๋ ํ์ผ ์์คํ ์ด๋ฏธ์ง์ ๋ํ ๋ธ๋ก ์ฅ์น๋ฅผ ๋ง๋ค ์ ์์ ํ ๋ฐ, ๊ทธ๋ฌ๋ฉด mount(8) ๋ช ๋ น์ผ๋ก ๊ทธ ์ด๋ฏธ์ง๋ฅผ ๋ง์ดํธ ํ ์ ์๋ค. ์ฆ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
$ dd if=/dev/zero of=file.img bs=1MiB count=10
$ sudo losetup /dev/loop4 file.img
$ sudo mkfs -t ext4 /dev/loop4
$ sudo mkdir /myloopdev
$ sudo mount /dev/loop4 /myloopdev
losetup(8)์ ๋ ๋ค๋ฅธ ์ ์ฐธ๊ณ .
๋ฃจํ ์ฅ์น๋ณ๋ก ์๋ณตํธํ๋ฅผ ์ํ ๋ณํ ๊ธฐ๋ฅ์ ์ง์ ํ ์ ์๋ค.
๋ฃจํ ๋ธ๋ก ์ฅ์น๋ ๋ค์ ioctl(2)
๋์๋ค์ ์ ๊ณตํ๋ค.
LOOP_SET_FD
-
ioctl(2)
(์ธ ๋ฒ์งธ) ์ธ์๋ก ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ค ์ด๋ฆฐ ํ์ผ์ ๋ฃจํ ์ฅ์น๋ฅผ ์ฐ๊ณํ๋ค. LOOP_CLR_FD
- ๋ฃจํ ์ฅ์น์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ฐ๊ณ๋ฅผ ์์ค๋ค.
LOOP_SET_STATUS
-
ioctl(2)
(์ธ ๋ฒ์งธ) ์ธ์๋ฅผ ์ด์ฉํด ๋ฃจํ ์ฅ์น์ ์ํ๋ฅผ ์ค์ ํ๋ค. ๊ทธ ์ธ์๋loop_info
๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ์ธ๋ฐ<linux/loop.h>
์ ๋ค์์ฒ๋ผ ๊ตฌ์กฐ์ฒด๊ฐ ์ ์๋ผ ์๋ค.struct loop_info { int lo_number; /* ioctl r/o */ dev_t lo_device; /* ioctl r/o */ unsigned long lo_inode; /* ioctl r/o */ dev_t lo_rdevice; /* ioctl r/o */ int lo_offset; int lo_encrypt_type; int lo_encrypt_key_size; /* ioctl w/o */ int lo_flags; /* ioctl r/o */ char lo_name[LO_NAME_SIZE]; unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ unsigned long lo_init[2]; char reserved[4]; };
์ํธํ ๋ฐฉ์(
lo_encrypt_type
)์LO_CRYPT_NONE
,LO_CRYPT_XOR
,LO_CRYPT_DES
,LO_CRYPT_FISH2
,LO_CRYPT_BLOW
,LO_CRYPT_CAST128
,LO_CRYPT_IDEA
,LO_CRYPT_DUMMY
,LO_CRYPT_SKIPJACK
,LO_CRYPT_CRYPTOAPI
(๋ฆฌ๋ ์ค 2.6.0๋ถํฐ) ์ค ํ๋์ฌ์ผ ํ๋ค.lo_flags
ํ๋๋ ๋นํธ ๋ง์คํฌ์ด๋ฉฐ ๋ค์ ํ๋๊ทธ๋ค ์ค 0๊ฐ ์ด์์ ํฌํจํ ์ ์๋ค.LO_FLAGS_READ_ONLY
- ๋ฃจํ๋ฐฑ ์ฅ์น๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค.
-
LO_FLAGS_AUTOCLEAR
(๋ฆฌ๋ ์ค 2.6.25๋ถํฐ) - ๋ง์ง๋ง์ผ๋ก ๋ซ์ ๋ ๋ฃจํ๋ฐฑ ์ฅ์น๊ฐ ์๋์ผ๋ก ์์ด์ง๋ค.
-
LO_FLAGS_PARTSCAN
(๋ฆฌ๋ ์ค 3.2๋ถํฐ) - ์๋ ํํฐ์ ํ์์ ํ์ฉํ๋ค.
LOOP_GET_STATUS
- ๋ฃจํ ์ฅ์น์ ์ํ๋ฅผ ์ป๋๋ค.
ioctl(2)
(์ธ ๋ฒ์งธ) ์ธ์๊ฐstruct loop_info
์ ๋ํ ํฌ์ธํฐ์ฌ์ผ ํ๋ค. -
LOOP_CHANGE_FD
(๋ฆฌ๋ ์ค 2.6.5๋ถํฐ) - ๋ฃจํ ์ฅ์น์ ๊ธฐ๋ฐ ์ ์ฅ์๋ฅผ ์ ์์ธ
ioctl(2)
(์ธ ๋ฒ์งธ) ์ธ์์ ์ง์ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ํ๋ด๋ ์ ํ์ผ๋ก ๋ฐ๊พผ๋ค. ๋ฃจํ ์ฅ์น๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๊ณ ์ ๊ธฐ๋ฐ ์ ์ฅ์๊ฐ ์ด์ ๊ธฐ๋ฐ ์ ์ฅ์์ ํฌ๊ธฐ ๋ฐ ์ข ๋ฅ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ์ด ๋์์ด ๊ฐ๋ฅํ๋ค. -
LOOP_SET_CAPACITY
(๋ฆฌ๋ ์ค 2.6.30๋ถํฐ) - ๋์ ์ค์ธ ๋ฃจํ ์ฅ์น์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊พผ๋ค. ๊ธฐ๋ฐ ์ ์ฅ์์ ํฌ๊ธฐ๋ฅผ ๋ฐ๊พผ ๋ค์์ ์ด ๋์์ ์จ์ ๋ฃจํ ๋๋ผ์ด๋ฒ๊ฐ ์ ํฌ๊ธฐ๋ฅผ ์์๋ด๋๋ก ํ ์ ์๋ค. ์ด ๋์์๋ ์ธ์๊ฐ ์๋ค.
๋ฆฌ๋
์ค 2.6๋ถํฐ ๋ ๊ฐ์ง ์๋ก์ด ioctl(2)
๋์์ด ์๋ค.
-
LOOP_SET_STATUS64
,LOOP_GET_STATUS64
-
์์์ ์ค๋ช ํ
LOOP_SET_STATUS
๋ฐLOOP_GET_STATUS
์ ์ ์ฌํ๋ ํ๋๊ฐ ๋ช ๊ฐ ๋ ์๊ณ ์ผ๋ถ ํ๋๊ฐ ๋ ํฐloop_info64
๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.struct loop_info64 { uint64_t lo_device; /* ioctl r/o */ uint64_t lo_inode; /* ioctl r/o */ uint64_t lo_rdevice; /* ioctl r/o */ uint64_t lo_offset; uint64_t lo_sizelimit;/* ๋ฐ์ดํธ ๋จ์, 0 == ๊ฐ๋ฅํ ์ต๋ */ uint32_t lo_number; /* ioctl r/o */ uint32_t lo_encrypt_type; uint32_t lo_encrypt_key_size; /* ioctl w/o */ uint32_t lo_flags; /* ioctl r/o */ uint8_t lo_file_name[LO_NAME_SIZE]; uint8_t lo_crypt_name[LO_NAME_SIZE]; uint8_t lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ uint64_t lo_init[2]; };
๋ฆฌ๋
์ค 3.1๋ถํฐ ์ปค๋์์ /dev/loop-control
์ฅ์น๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๋ฅผ ํตํด ์์ฉ์์ ๋์ ์ผ๋ก ์ ํด ์ฅ์น๋ฅผ ์ฐพ์๋ด๊ณ ์์คํ
์ ๋ฃจํ ์ฅ์น๋ฅผ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ ์ ์๋ค. ๊ทธ๋ฐ ๋์๋ค์ ์ํํ๋ ค๋ฉด ๋จผ์ /dev/loop-control
์ ์ฐ ๋ค์ ๋ค์ ioctl(2)
๋์๋ค ์ค ํ๋๋ฅผ ์ฐ๋ฉด ๋๋ค.
LOOP_CTL_GET_FREE
- ์ฌ์ฉํ ์ ํด ๋ฃจํ ์ฅ์น๋ฅผ ์ฐพ๊ณ ์์ผ๋ฉด ํ ๋นํ๋ค. ์ฑ๊ณต ์ ํธ์ถ ๊ฒฐ๊ณผ๋ก ์ฅ์น ๋ฒํธ๊ฐ ๋ฐํ๋๋ค. ์ด ๋์์๋ ์ธ์๊ฐ ์๋ค.
LOOP_CTL_ADD
- ์๋ก์ด ๋ฃจํ ์ฅ์น๋ฅผ ์ถ๊ฐํ๋ฉฐ ๊ทธ ์ฅ์น ๋ฒํธ๋ฅผ ์ธ ๋ฒ์งธ
ioctl(2)
์ธ์์ longํ ์ ์๋ก ์ง์ ํ๋ค. ์ฑ๊ณต ์ ํธ์ถ ๊ฒฐ๊ณผ๋ก ์ฅ์น ๋ฒํธ๊ฐ ๋ฐํ๋๋ค. ๊ทธ ์ฅ์น๊ฐ ์ด๋ฏธ ํ ๋น๋ผ ์์ผ๋ฉดEEXIST
์ค๋ฅ๋ก ํธ์ถ์ด ์คํจํ๋ค. LOOP_CTL_REMOVE
- ๋ฃจํ ์ฅ์น๋ฅผ ์ ๊ฑฐํ๋ฉฐ ๊ทธ ์ฅ์น ๋ฒํธ๋ฅผ ์ธ ๋ฒ์งธ
ioctl(2)
์ธ์์ longํ ์ ์๋ก ์ง์ ํ๋ค. ์ฑ๊ณต ์ ํธ์ถ ๊ฒฐ๊ณผ๋ก ์ฅ์น ๋ฒํธ๊ฐ ๋ฐํ๋๋ค. ์ฅ์น๊ฐ ์ฌ์ฉ ์ค์ด๋ฉดEBUSY
์ค๋ฅ๋ก ํธ์ถ์ด ์คํจํ๋ค.
/dev/loop*
- ๋ฃจํ ๋ธ๋ก ํน์ ์ฅ์น ํ์ผ.
์๋ ํ๋ก๊ทธ๋จ์์๋ /dev/loop-control
์ฅ์น๋ฅผ ์ฌ์ฉํด ์ ํด ๋ฃจํ ์ฅ์น๋ฅผ ์ฐพ์๋ด๊ณ , ๊ทธ ๋ฃจํ ์ฅ์น๋ฅผ ์ด๊ณ , ์ฅ์น์ ๊ธฐ๋ฐ ์ ์ฅ์๋ก ์ฌ์ฉํ ํ์ผ์ ์ด๊ณ , ๋ฃจํ ์ฅ์น๋ฅผ ๊ธฐ๋ฐ ์ ์ฅ์์ ์ฐ๊ณํ๋ค. ๋ค์ ์
ธ ์ธ์
์ด ํ๋ก๊ทธ๋จ ์ฌ์ฉ ๋ฐฉ์์ ๋ณด์ฌ ์ค๋ค.
$ dd if=/dev/zero of=file.img bs=1MiB count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00609385 s, 1.7 GB/s
$ sudo ./mnt_loop file.img
loopname = /dev/loop5
#include <fcntl.h>
#include <linux/loop.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int loopctlfd, loopfd, backingfile;
long devnr;
char loopname[4096];
if (argc != 2) {
fprintf(stderr, "Usage: %s backing-file\n", argv[0]);
exit(EXIT_FAILURE);
}
loopctlfd = open("/dev/loop-control", O_RDWR);
if (loopctlfd == -1)
errExit("open: /dev/loop-control");
devnr = ioctl(loopctlfd, LOOP_CTL_GET_FREE);
if (devnr == -1)
errExit("ioctl-LOOP_CTL_GET_FREE");
sprintf(loopname, "/dev/loop%ld", devnr);
printf("loopname = %s\n", loopname);
loopfd = open(loopname, O_RDWR);
if (loopfd == -1)
errExit("open: loopname");
backingfile = open(argv[1], O_RDWR);
if (backingfile == -1)
errExit("open: backing-file");
if (ioctl(loopfd, LOOP_SET_FD, backingfile) == -1)
errExit("ioctl-LOOP_SET_FD");
exit(EXIT_SUCCESS);
}
2019-03-06