| loop(4) | Device Drivers Manual | loop(4) |
loop, loop-control - dispozitive de buclă
#include <linux/loop.h>
Dispozitivul de buclă este un dispozitiv de blocuri care cartografiază blocurile sale de date nu la un dispozitiv fizic, cum ar fi un disc dur sau o unitate de disc optic, ci la blocurile unui fișier obișnuit dintr-un sistem de fișiere sau la un alt dispozitiv de blocuri. Acest lucru poate fi util, de exemplu, pentru a furniza un dispozitiv de blocuri pentru o imagine a sistemului de fișiere stocată într-un fișier, astfel încât acesta să poată fi montat cu comanda mount(8). Ați putea face
$ 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
Vedeți losetup(8) pentru un alt exemplu.
O funcție de transfer poate fi specificată pentru fiecare dispozitiv de buclă în scopul criptării și decriptării.
Următoarele operații ioctl(2) sunt furnizate de dispozitivul de blocuri al buclei:
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 înainte de
Linux 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];
};
struct loop_config {
__u32 fd;
__u32 block_size;
struct loop_info64 info;
__u64 __reserved[8];
};
Începând cu Linux 2.6, există două noi operații ioctl(2):
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; /* octeți, 0 == maxim disponibil */
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 înainte de
Linux 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];
};
Începând cu Linux 3.1, nucleul oferă dispozitivul /dev/loop-control, care permite unei aplicații să găsească în mod dinamic un dispozitiv liber și să adauge și să elimine dispozitive de buclă din sistem. Pentru a efectua aceste operații, se deschide mai întâi /dev/loop-control și apoi se utilizează una dintre următoarele operații ioctl(2):
Programul de mai jos utilizează dispozitivul /dev/loop-control pentru a găsi un dispozitiv de buclă liber, deschide dispozitivul de buclă, deschide un fișier care să fie utilizat ca spațiu de stocare de bază pentru dispozitiv și apoi asociază dispozitivul de buclă cu spațiul de stocare de bază. Următoarea sesiune shell demonstrează utilizarea programului:
$ dd if=/dev/zero of=file.img bs=1MiB count=10 10+0 înregistrări in 10+0 înregistrări out 10485760 octeți (10 Mo) copiați, 0.00609385 s, 1.7 Go/s $ sudo ./mnt_loop fișier.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, "Utilizare: %s fișier-susținere\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: fișier-susținere");
if (ioctl(loopfd, LOOP_SET_FD, backingfile) == -1)
errExit("ioctl-LOOP_SET_FD");
exit(EXIT_SUCCESS);
}
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 15 iunie 2024 | Pagini de manual de Linux 6.9.1 |