loop(4) Device Drivers Manual loop(4) loop loop-control - loop #include loop . 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) . loop . ioctl(2) loop : LOOP_SET_FD loop ioctl(2) (). LOOP_CLR_FD loop . LOOP_SET_STATUS loop ioctl(2) (). loop_info : 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/w (r/o 2.6.25) */ 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 ( 2.6.0) LO_CRYPT_CRYPTOAPI. lo_flags : LO_FLAGS_READ_ONLY loopback . LO_FLAGS_AUTOCLEAR ( 2.6.25) loopback . LO_FLAGS_PARTSCAN ( 3.2) . LO_FLAGS_DIRECT_IO ( 4.10) / . lo_flags LOOP_SET_STATUS LO_FLAGS_AUTOCLEAR LO_FLAGS_PARTSCAN. LOOP_GET_STATUS loop. ioctl(2) () struct loop_info. LOOP_CHANGE_FD ( 2.6.5) loop ioctl(2) () . loop . LOOP_SET_CAPACITY ( 2.6.30) loop . loop . . LOOP_SET_DIRECT_IO ( 4.10) / (DIRECT I/O) loop . ioctl(2) () . / . LOOP_SET_BLOCK_SIZE ( 4.14) loop. ioctl(2) () . [512,pagesize] EINVAL. LOOP_CONFIGURE ( 5.8) loop ioctl(2) (). loop_config : struct loop_config { __u32 fd; __u32 block_size; struct loop_info64 info; __u64 __reserved[8]; }; LOOP_SET_STATUS LOOP_CONFIGURE : o loop_config.block_size o / LO_FLAGS_DIRECT_IO loop_config.info.lo_flags o LO_FLAGS_READ_ONLY loop_config.info.lo_flags. 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; i /* ioctl r/w (r/o 2.6.25) */ 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 loop . /dev/loop-control ioctl(2) : LOOP_CTL_GET_FREE loop . . . LOOP_CTL_ADD loop ioctl(2) . . EEXIST. LOOP_CTL_REMOVE loop ioctl(2) . . EBUSY. /dev/loop* loop . /dev/loop-control loop loop loop . : $ dd if=/dev/zero of=file.img bs=1MiB count=10; 10+0 10+0 10485760 (10 ) 0.00609385 1.7 / $ sudo ./mnt_loop file.img; loopname = /dev/loop5 #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int loopctlfd, loopfd, backingfile; long devnr; char loopname[4096]; if (argc != 2) { fprintf(stderr, ": %s backing-file\n", argv[0]); exit(EXIT_FAILURE); } loopctlfd = open("/dev/loop-control", O_RDWR); if (loopctlfd == -1) err(EXIT_FAILURE, ": /dev/loop-control"); devnr = ioctl(loopctlfd, LOOP_CTL_GET_FREE); if (devnr == -1) err(EXIT_FAILURE, "ioctl-LOOP_CTL_GET_FREE"); sprintf(loopname, "/dev/loop%ld", devnr); printf("loopname = %s\n", loopname); loopfd = open(loopname, O_RDWR); if (loopfd == -1) err(EXIT_FAILURE, ": loopname"); backingfile = open(argv[1], O_RDWR); if (backingfile == -1) err(EXIT_FAILURE, ": backing-file"); if (ioctl(loopfd, LOOP_SET_FD, backingfile) == -1) err(EXIT_FAILURE, "ioctl-LOOP_SET_FD"); exit(EXIT_SUCCESS); } losetup(8) mount(8) 3 . . : . 6.18 8 2026 loop(4)