loop(4) Device Drivers Manual loop(4) NUME loop, loop-control - dispozitive de bucla SINOPSIS #include DESCRIERE Dispozitivul de bucla este un dispozitiv de blocuri care cartografiaza 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 fiier obinuit dintr-un sistem de fiiere 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 fiiere stocata intr-un fiier, astfel incat acesta sa poata fi montat cu comanda mount(8). Ai 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 Vedei losetup(8) pentru un alt exemplu. O funcie de transfer poate fi specificata pentru fiecare dispozitiv de bucla in scopul criptarii i decriptarii. Urmatoarele operaii ioctl(2) sunt furnizate de dispozitivul de blocuri al buclei: LOOP_SET_FD Asociaza dispozitivul buclei cu fiierul deschis al carui descriptor de fiier este pasat ca (al treilea) argument al ioctl(2). LOOP_CLR_FD Dezasociaza dispozitivul buclei de orice descriptor de fiier. LOOP_SET_STATUS Stabilete starea dispozitivului buclei utilizand (al treilea) argument al ioctl(2). Acest argument este un indicator catre o structura loop_info, definita in ca: 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 inainte 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]; }; Tipul de criptare (lo_encrypt_type) trebuie sa fie unul dintre 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 sau ( incepand cu Linux 2. 6.0) LO_CRYPT_CRYPTOAPI. Campul lo_flags este o masca de bii care poate include niciuna sau mai multe dintre urmatoarele: LO_FLAGS_READ_ONLY Dispozitivul de bucla este numa-pentru-citire. LO_FLAGS_AUTOCLEAR (incepand cu Linux 2.6.25) Dispozitivul de bucla se va autodistruge la ultima inchidere. LO_FLAGS_PARTSCAN (incepand cu Linux 3.2) Permite scanarea automata a partiiilor. LO_FLAGS_DIRECT_IO (incepand cu Linux 4.10) Utilizeaza modul In/Ie direct pentru a accesa fiierul de susinere. Singurele lo_flags care pot fi modificate de LOOP_SET_STATUS sunt LO_FLAGS_AUTOCLEAR i LO_FLAGS_PARTSCAN. LOOP_GET_STATUS Obine starea dispozitivului buclei. Argumentul (al treilea) al ioctl(2) trebuie sa fie un indicator catre o structura struct loop_info. LOOP_CHANGE_FD (incepand cu Linux 2.6.5) Comuta stocarea de susinere a dispozitivului de bucla la noul descriptor de fiier identificat in fiierul specificat in (al treilea) argument al ioctl(2), care este un numar intreg. Aceasta operaie este posibila numai in cazul in care dispozitivul de bucla este numai pentru citire, iar noua stocare de susinere are aceeai dimensiune i acelai tip ca vechea stocare de susinere. LOOP_SET_CAPACITY (incepand cu Linux 2.6.30) Redimensioneaza un dispozitiv de bucla activ. Se poate modifica dimensiunea stocarii de susinere subiacente i apoi se poate utiliza aceasta operaie astfel incat controlorul buclei sa afle despre noua dimensiune. Aceasta operaie nu are niciun argument. LOOP_SET_DIRECT_IO (incepand cu Linux 4.10) Stabilete modul de In/Ie DIRECT pe dispozitivul de bucla, astfel incat acesta sa poata fi utilizat pentru a deschide fiierul de susinere. Al (treilea) argument al ioctl(2) este o valoare lunga fara semn. O valoare diferita de zero reprezinta modul de In/Ie direct. LOOP_SET_BLOCK_SIZE (incepand cu Linux 4.14) Stabilete dimensiunea blocului dispozitivului buclei. Al (treilea) argument al ioctl(2) este o valoare lunga fara semn. Aceasta valoare trebuie sa fie o putere de doi in intervalul [512,dimensiune-pagina]; in caz contrar, rezulta o eroare EINVAL. LOOP_CONFIGURE (incepand cu Linux 5.8) Stabilete i configureaza toi parametrii dispozitivului buclei intr-un singur pas utilizand argumentul (al treilea) al ioctl(2). Acest argument este un indicator catre o structura loop_config, definita in ca: struct loop_config { __u32 fd; __u32 block_size; struct loop_info64 info; __u64 __reserved[8]; }; In plus faa de ceea ce poate face LOOP_SET_STATUS, LOOP_CONFIGURE poate fi utilizat i pentru a face urmatoarele: o stabilete imediat dimensiunea corecta a blocului prin parametrul loop_config.block_size; o solicita in mod explicit modul de I/O direct prin definirea LO_FLAGS_DIRECT_IO in loop_config.info.lo_flags; i o solicita in mod explicit modul numai-citire prin definirea LO_FLAGS_READ_ONLY in loop_config.info.lo_flags. Incepand cu Linux 2.6, exista doua noi operaii ioctl(2): LOOP_SET_STATUS64 LOOP_GET_STATUS64 Acestea sunt similare cu LOOP_SET_STATUS i LOOP_GET_STATUS descrise mai sus, dar utilizeaza structura loop_info64, care are cateva campuri suplimentare i un interval mai mare pentru alte campuri: 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; /* octei, 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 inainte 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]; }; /dev/loop-control Incepand cu Linux 3.1, nucleul ofera dispozitivul /dev/loop-control, care permite unei aplicaii sa gaseasca in mod dinamic un dispozitiv liber i sa adauge i sa elimine dispozitive de bucla din sistem. Pentru a efectua aceste operaii, se deschide mai intai /dev/loop-control i apoi se utilizeaza una dintre urmatoarele operaii ioctl(2): LOOP_CTL_GET_FREE Aloca sau gasete un dispozitiv de bucla liber pentru utilizare. In caz de succes, numarul dispozitivului este returnat ca rezultat al apelului. Aceasta operaie nu are niciun argument. LOOP_CTL_ADD Adauga noul dispozitiv de bucla al carui numar de dispozitiv este specificat ca numar intreg lung in al treilea argument al ioctl(2). In caz de succes, indicele dispozitivului este returnat ca rezultat al apelului. Daca dispozitivul este deja alocat, apelul eueaza cu eroarea EEXIST. LOOP_CTL_REMOVE Elimina dispozitivul buclei al carui numar de dispozitiv este specificat ca numar intreg lung in al treilea argument al ioctl(2). In caz de succes, numarul dispozitivului este returnat ca rezultat al apelului. Daca dispozitivul este in uz, apelul eueaza cu eroarea EBUSY. FIIERE /dev/loop* Fiierele dispozitivelor speciale de blocuri ai buclei. EXEMPLE Programul de mai jos utilizeaza dispozitivul /dev/loop-control pentru a gasi un dispozitiv de bucla liber, deschide dispozitivul de bucla, deschide un fiier care sa fie utilizat ca spaiu de stocare de baza pentru dispozitiv i apoi asociaza dispozitivul de bucla cu spaiul de stocare de baza. Urmatoarea sesiune shell demonstreaza utilizarea programului: $ dd if=/dev/zero of=file.img bs=1MiB count=10 10+0 inregistrari in 10+0 inregistrari out 10485760 octei (10 Mo) copiai, 0.00609385 s, 1.7 Go/s $ sudo ./mnt_loop fiier.img loopname = /dev/loop5 Sursa programului #include #include #include #include #include #include #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 fiier-susinere\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: fiier-susinere"); if (ioctl(loopfd, LOOP_SET_FD, backingfile) == -1) errExit("ioctl-LOOP_SET_FD"); exit(EXIT_SUCCESS); } CONSULTAI I losetup(8), mount(8) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.12 15 iunie 2024 loop(4)