loop(4) - wariua/manpages-ko GitHub Wiki

NAME

loop, loop-control - ๋ฃจํ”„ ์žฅ์น˜

SYNOPSIS

#include <linux/loop.h>

DESCRIPTION

๋ฃจํ”„ ์žฅ์น˜๋ž€ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ํ•˜๋“œ ๋””์Šคํฌ๋‚˜ ๊ด‘ํ•™ ๋””์Šคํฌ ๋“œ๋ผ์ด๋ธŒ ๊ฐ™์€ ๋ฌผ๋ฆฌ์  ์žฅ์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‚ด ์ •๊ทœ ํŒŒ์ผ์˜ ๋ธ”๋ก์ด๋‚˜ ๋‹ค๋ฅธ ๋ธ”๋ก ์žฅ์น˜๋กœ ๋งคํ•‘ ํ•˜๋Š” ๋ธ”๋ก ์žฅ์น˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ๋กœ ์ €์žฅ๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋ธ”๋ก ์žฅ์น˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ํ…๋ฐ, ๊ทธ๋Ÿฌ๋ฉด 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];
};

/dev/loop-control

๋ฆฌ๋ˆ…์Šค 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 ์˜ค๋ฅ˜๋กœ ํ˜ธ์ถœ์ด ์‹คํŒจํ•œ๋‹ค.

FILES

/dev/loop*
๋ฃจํ”„ ๋ธ”๋ก ํŠน์ˆ˜ ์žฅ์น˜ ํŒŒ์ผ.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” /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);
}

SEE ALSO

losetup(8), mount(8)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ