loop(4) Device Drivers Manual loop(4) NAZWA loop, loop-control - urzadzenia petli SKLADNIA #include OPIS Urzadzenie petli jest urzadzeniem blokowym, ktore przypisuje swoje bloki danych nie do urzadzenia fizycznego, takiego jak dysk twardy lub naped dysku optycznego, lecz do blokow zwyklego pliku w systemie plikow lub do innego urzadzenia blokowego. Moze byc to przydatne np. w celu udostepnienia urzadzenia blokowego dla obrazu systemu plikow przechowywanego w pliku, dzieki czemu mozna go zamontowac poleceniem mount(8). Mozna wykonac: $ dd if=/dev/zero of=obraz.img bs=1MiB count=10; $ sudo losetup /dev/loop4 plik.img; $ sudo mkfs -t ext4 /dev/loop4; $ sudo mkdir /moje-urzadzenie-loop; $ sudo mount /dev/loop4 /moje-urzadzenie-loop; Inny przyklad opisano w podreczniku losetup(8). Dla kazdego urzadzenia petli mozna okreslic funkcje transferu, sluzaca do szyfrowania i odszyfrowywania. Urzadzenie blokowe petli udostepnia nastepujace operacje ioctl(2): LOOP_SET_FD Przypisuje urzadzenie petli do otwartego pliku, ktorego deskryptor pliku podaje sie jako (trzeci) argument ioctl(2). LOOP_CLR_FD Usuwa przypisanie urzadzenia petli ze wszystkimi deskryptorami plikow. LOOP_SET_STATUS Ustawia stan urzadzenia petli za pomoca (trzeciego) argumentu ioctl(2). Argument ten jest wskaznikiem do struktury loop_info, zdefiniowanej w jako: struct loop_info { int lo_number; /* ioctl tylko do odczytu */ dev_t lo_device; /* ioctl tylko do odczytu */ unsigned long lo_inode; /* ioctl tylko do odczytu */ dev_t lo_rdevice; /* ioctl tylko do odczytu */ int lo_offset; int lo_encrypt_type; int lo_encrypt_key_size; /* ioctl do zapisu i odczytu */ int lo_flags; /* ioctl do zapisu i odczytu (tylko do odczytu przed Linuksem 2.6.25) */ char lo_name[LO_NAME_SIZE]; unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl tylko do zapisu */ unsigned long lo_init[2]; char reserved[4]; }; Typem szyfrowania (lo_encrypt_type) powinien byc jeden z: 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 lub (od Linuksa 2.6.0) LO_CRYPT_CRYPTOAPI. Pole lo_flags jest maska bitowa mogaca zawierac zero lub wiecej z ponizszych znacznikow: LO_FLAGS_READ_ONLY Urzadzenie petli zwrotnej jest tylko do odczytu. LO_FLAGS_AUTOCLEAR (od Linuksa 2.6.25) Urzadzenie petli zwrotnej zostanie automatycznie zniszczone po ostatnim zamknieciu. LO_FLAGS_PARTSCAN (od Linuksa 3.2) Zezwala na automatyczne skanowanie partycji. LO_FLAGS_DIRECT_IO (od Linuksa 4.10) Uzywa bezposredniego wejscia/wyjscia przy dostepie do pliku, do ktorego odwoluje sie urzadzenie. Jedynymi lo_flags, ktore moga byc zmodyfikowane przez LOOP_SET_STATUS sa LO_FLAGS_AUTOCLEAR i LO_FLAGS_PARTSCAN. LOOP_GET_STATUS Pobiera stan urzadzenia petli. (Trzecim) argumentem ioctl(2) musi byc wskaznik do struct loop_info. LOOP_CHANGE_FD (od Linuksa 2.6.5) Przelacza magazyn danych, do ktorego odwoluje sie urzadzenie petli, do nowego pliku, identyfikowanego deskryptorem pliku okreslonym w (trzecim) argumencie ioctl(2), ktory jest liczba typu integer. Operacja ta jest dopuszczalna tylko wtedy, gdy urzadzenie petli jest tylko do odczytu, a nowy magazyn danych ma ten sam rozmiar i typ, co dotychczasowy. LOOP_SET_CAPACITY (od Linuksa 2.6.30) Zmienia rozmiar dzialajacego urzadzenia petli. Mozna zmienic rozmiar magazynu danych, do ktorego odwoluje sie urzadzenie petli, a nastepnie skorzystac z tej operacji, dzieki ktorej sterownik petli dowie sie o nowym rozmiarze. Ta operacja nie przyjmuje argumentow. LOOP_SET_DIRECT_IO (od Linuksa 4.10) Ustawia tryb DIRECT I/O (bezposredniego wejscia/wyjscia) na urzadzeniu petli, dzieki czemu zostanie on uzyty w stosunku do pliku, do ktorego odwoluje sie urzadzenie petli. (Trzeci) argument ioctl(2) jest wartoscia typu long bez znaku. Wartosc niezerowa reprezentuje bezposredni tryb wejscia/wyjscia. LOOP_SET_BLOCK_SIZE (od Linuksa 4.14) Ustawia rozmiar bloku urzadzenia petli. (Trzeci) argument ioctl(2) jest wartoscia typu long bez znaku. Wartosc ta musi byc potega dwojki w przedziale [512,rozmiar-strony]; w innym przypadku wystapi blad EINVAL. LOOP_CONFIGURE (od Linuksa 5.8) Ustawia i konfiguruje wszystkie parametry urzadzenia petli w pojedynczym kroku, za pomoca (trzeciego) argumentu ioctl(2). Argument ten jest wskaznikiem do struktury loop_config, zdefiniowanej w jako: struct loop_config { __u32 fd; __u32 block_size; struct loop_info64 info; __u64 __reserved[8]; }; Oprocz dokonania tego, co mozna zrobic za pomoca LOOP_SET_STATUS, LOOP_CONFIGURE mozna uzyc dodatkowo do: o ustawienia prawidlowego rozmiaru bloku, bezposredniego po ustawieniu loop_config.block_size; o jawnego zazadania trybu bezposredniego wejscia/wyjscia, ustawiajac LO_FLAGS_DIRECT_IO w loop_config.info.lo_flags; oraz o jawnego zazadania trybu tylko do odczytu, ustawiajac LO_FLAGS_READ_ONLY w loop_config.info.lo_flags. Od Linuksa 2.6, istnieja dwie nowe operacje ioctl(2): LOOP_SET_STATUS64 LOOP_GET_STATUS64 Sa podobne do opisanych wyzej LOOP_SET_STATUS i LOOP_GET_STATUS, lecz korzystaja ze struktury loop_info64, ktora ma pewne dodatkowe pola i wiekszy zakres niektorych innych pol: struct loop_info64 { uint64_t lo_device; /* ioctl tylko do odczytu */ uint64_t lo_inode; /* ioctl tylko do odczytu */ uint64_t lo_rdevice; /* ioctl tylko do odczytu */ uint64_t lo_offset; uint64_t lo_sizelimit; /* bajtow, 0 == mozliwie najwiecej */ uint32_t lo_number; /* ioctl tylko do odczytu */ uint32_t lo_encrypt_type; uint32_t lo_encrypt_key_size; /* ioctl tylko do zapisu */ uint32_t lo_flags; i /* ioctl do odczytu i zapisu (tylko do odczytu przed Linuksem 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 tylko do zapisu */ uint64_t lo_init[2]; }; /dev/loop-control Od Linuksa 3.1, jadro udostepnia urzadzenie /dev/loop-control, ktore pozwala aplikacjom na dynamiczne odnalezienie wolnego urzadzenia oraz na dodawanie i usuwanie urzadzen petli z systemu. Do przeprowadzenia tych operacji, najpierw otwiera sie /dev/loop-control, a nastepnie korzysta z jednej z ponizszych operacji ioctl(2): LOOP_CTL_GET_FREE Przydziela lub odnajduje wolne urzadzenie petli do wykorzystania. Przy powodzeniu, jako wynik wywolania zwracany jest numer urzadzenia. Ta operacja nie przyjmuje argumentow. LOOP_CTL_ADD Dodaje nowe urzadzenie petli, ktorego numer podano jako liczba typu long integer w trzecim argumencie ioctl(2). Przy powodzeniu, jako wynik wywolania zwracany jest indeks urzadzenia. Jesli urzadzenie zostalo juz przydzielone, wywolanie zawodzi z bledem EEXIST. LOOP_CTL_REMOVE Usuwa urzadzenie petli, ktorego numer podano jako liczba typu long integer w trzecim argumencie ioctl(2). Przy powodzeniu, jako wynik wywolania zwracany jest numer urzadzenia. Jesli urzadzenie jest w uzyciu, wywolanie zawodzi z bledem EBUSY. PLIKI /dev/loop* Specjalne pliki urzadzen blokowych petli. PRZYKLADY Ponizszy program korzysta z urzadzenia /dev/loop-control do odnalezienia wolnego urzadzenia petli, otwiera urzadzenie petli, otwiera plik przeznaczony do uzycia przez urzadzenie petli, a nastepnie wiaze urzadzenie petli z tym plikiem. Ponizsza sesja powloki demonstruje uzycie programu: $ dd if=/dev/zero of=plik.img bs=1MiB count=10; 10+0 przeczytanych rekordow 10+0 zapisanych rekordow 10485760 bajtow (10 MB) skopiowano, 0.00609385 s, 1.7 GB/s $ sudo ./mnt_loop obraz.img; loopname = /dev/loop5 Kod zrodlowy programu #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, "Uzycie: %s plik-dla-petli\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); } ZOBACZ TAKZE losetup(8), mount(8) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.15 17 maja 2025 r. loop(4)