.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH loop 4 "17 maja 2025 r." "Linux man\-pages 6.15" .SH NAZWA loop, loop\-control \- urządzenia pętli .SH SKŁADNIA .nf #include .fi .SH OPIS Urządzenie pętli jest urządzeniem blokowym, które przypisuje swoje bloki danych nie do urządzenia fizycznego, takiego jak dysk twardy lub napęd dysku optycznego, lecz do bloków zwykłego pliku w systemie plików lub do innego urządzenia blokowego. Może być to przydatne np. w celu udostępnienia urządzenia blokowego dla obrazu systemu plików przechowywanego w pliku, dzięki czemu można go zamontować poleceniem \fBmount\fP(8). Można wykonać: .P .in +4n .EX $\fB dd if=/dev/zero of=obraz.img bs=1MiB count=10\fP; $\fB sudo losetup /dev/loop4 plik.img\fP; $\fB sudo mkfs \-t ext4 /dev/loop4\fP; $\fB sudo mkdir /moje\-urzadzenie\-loop\fP; $\fB sudo mount /dev/loop4 /moje\-urzadzenie\-loop\fP; .EE .in .P Inny przykład opisano w podręczniku \fBlosetup\fP(8). .P Dla każdego urządzenia pętli można określić funkcję transferu, służącą do szyfrowania i odszyfrowywania. .P Urządzenie blokowe pętli udostępnia następujące operacje \fBioctl\fP(2): .TP \fBLOOP_SET_FD\fP Przypisuje urządzenie pętli do otwartego pliku, którego deskryptor pliku podaje się jako (trzeci) argument \fBioctl\fP(2). .TP \fBLOOP_CLR_FD\fP Usuwa przypisanie urządzenia pętli ze wszystkimi deskryptorami plików. .TP \fBLOOP_SET_STATUS\fP Ustawia stan urządzenia pętli za pomocą (trzeciego) argumentu \fBioctl\fP(2). Argument ten jest wskaźnikiem do struktury \fIloop_info\fP, zdefiniowanej w \fI\fP jako: .IP .in +4n .EX 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]; }; .EE .in .IP Typem szyfrowania (\fIlo_encrypt_type\fP) powinien być jeden z: \fBLO_CRYPT_NONE\fP, \fBLO_CRYPT_XOR\fP, \fBLO_CRYPT_DES\fP, \fBLO_CRYPT_FISH2\fP, \fBLO_CRYPT_BLOW\fP, \fBLO_CRYPT_CAST128\fP, \fBLO_CRYPT_IDEA\fP, \fBLO_CRYPT_DUMMY\fP, \fBLO_CRYPT_SKIPJACK\fP lub (od Linuksa 2.6.0) \fBLO_CRYPT_CRYPTOAPI\fP. .IP Pole \fIlo_flags\fP jest maską bitową mogącą zawierać zero lub więcej z poniższych znaczników: .RS .TP \fBLO_FLAGS_READ_ONLY\fP Urządzenie pętli zwrotnej jest tylko do odczytu. .TP \fBLO_FLAGS_AUTOCLEAR\fP (od Linuksa 2.6.25) .\" commit 96c5865559cee0f9cbc5173f3c949f6ce3525581 Urządzenie pętli zwrotnej zostanie automatycznie zniszczone po ostatnim zamknięciu. .TP \fBLO_FLAGS_PARTSCAN\fP (od Linuksa 3.2) .\" commit e03c8dd14915fabc101aa495828d58598dc5af98 Zezwala na automatyczne skanowanie partycji. .TP \fBLO_FLAGS_DIRECT_IO\fP (od Linuksa 4.10) .\" commit 2e5ab5f379f96a6207c45be40c357ebb1beb8ef3 Używa bezpośredniego wejścia/wyjścia przy dostępie do pliku, do którego odwołuje się urządzenie. .RE .IP Jedynymi \fIlo_flags\fP, które mogą być zmodyfikowane przez \fBLOOP_SET_STATUS\fP są \fBLO_FLAGS_AUTOCLEAR\fP i \fBLO_FLAGS_PARTSCAN\fP. .TP \fBLOOP_GET_STATUS\fP Pobiera stan urządzenia pętli. (Trzecim) argumentem \fBioctl\fP(2) musi być wskaźnik do \fIstruct loop_info\fP. .TP \fBLOOP_CHANGE_FD\fP (od Linuksa 2.6.5) Przełącza magazyn danych, do którego odwołuje się urządzenie pętli, do nowego pliku, identyfikowanego deskryptorem pliku określonym w (trzecim) argumencie \fBioctl\fP(2), który jest liczbą typu integer. Operacja ta jest dopuszczalna tylko wtedy, gdy urządzenie pętli jest tylko do odczytu, a nowy magazyn danych ma ten sam rozmiar i typ, co dotychczasowy. .TP \fBLOOP_SET_CAPACITY\fP (od Linuksa 2.6.30) .\" commit 53d6660836f233df66490707365ab177e5fb2bb4 Zmienia rozmiar działającego urządzenia pętli. Można zmienić rozmiar magazynu danych, do którego odwołuje się urządzenie pętli, a następnie skorzystać z tej operacji, dzięki której sterownik pętli dowie się o nowym rozmiarze. Ta operacja nie przyjmuje argumentów. .TP \fBLOOP_SET_DIRECT_IO\fP (od Linuksa 4.10) .\" commit ab1cb278bc7027663adbfb0b81404f8398437e11 Ustawia tryb DIRECT I/O (bezpośredniego wejścia/wyjścia) na urządzeniu pętli, dzięki czemu zostanie on użyty w stosunku do pliku, do którego odwołuje się urządzenie pętli. (Trzeci) argument \fBioctl\fP(2) jest wartością typu long bez znaku. Wartość niezerowa reprezentuje bezpośredni tryb wejścia/wyjścia. .TP \fBLOOP_SET_BLOCK_SIZE\fP (od Linuksa 4.14) .\" commit 89e4fdecb51cf5535867026274bc97de9480ade5 Ustawia rozmiar bloku urządzenia pętli. (Trzeci) argument \fBioctl\fP(2) jest wartością typu long bez znaku. Wartość ta musi być potęgą dwójki w przedziale [512,rozmiar\-strony]; w innym przypadku wystąpi błąd \fBEINVAL\fP. .TP \fBLOOP_CONFIGURE\fP (od Linuksa 5.8) .\" commit 3448914e8cc550ba792d4ccc74471d1ca4293aae Ustawia i konfiguruje wszystkie parametry urządzenia pętli w pojedynczym kroku, za pomocą (trzeciego) argumentu \fBioctl\fP(2). Argument ten jest wskaźnikiem do struktury \fIloop_config\fP, zdefiniowanej w \fI\fP jako: .IP .in +4n .EX struct loop_config { __u32 fd; __u32 block_size; struct loop_info64 info; __u64 __reserved[8]; }; .EE .in .IP Oprócz dokonania tego, co można zrobić za pomocą \fBLOOP_SET_STATUS\fP, \fBLOOP_CONFIGURE\fP można użyć dodatkowo do: .RS .IP \[bu] 3 ustawienia prawidłowego rozmiaru bloku, bezpośredniego po ustawieniu \fIloop_config.block_size\fP; .IP \[bu] jawnego zażądania trybu bezpośredniego wejścia/wyjścia, ustawiając \fBLO_FLAGS_DIRECT_IO\fP w \fIloop_config.info.lo_flags\fP; oraz .IP \[bu] jawnego zażądania trybu tylko do odczytu, ustawiając \fBLO_FLAGS_READ_ONLY\fP w \fIloop_config.info.lo_flags\fP. .RE .P Od Linuksa 2.6, istnieją dwie nowe operacje \fBioctl\fP(2): .TP \fBLOOP_SET_STATUS64\fP .TQ \fBLOOP_GET_STATUS64\fP Są podobne do opisanych wyżej \fBLOOP_SET_STATUS\fP i \fBLOOP_GET_STATUS\fP, lecz korzystają ze struktury \fIloop_info64\fP, która ma pewne dodatkowe pola i większy zakres niektórych innych pól: .IP .in +4n .EX 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; /* bajtów, 0 == możliwie najwięcej */ 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]; }; .EE .in .SS /dev/loop\-control .\" commit 770fe30a46a12b6fb6b63fbe1737654d28e84844 Od Linuksa 3.1, jądro udostępnia urządzenie \fI/dev/loop\-control\fP, które pozwala aplikacjom na dynamiczne odnalezienie wolnego urządzenia oraz na dodawanie i usuwanie urządzeń pętli z systemu. Do przeprowadzenia tych operacji, najpierw otwiera się \fI/dev/loop\-control\fP, a następnie korzysta z jednej z poniższych operacji \fBioctl\fP(2): .TP \fBLOOP_CTL_GET_FREE\fP Przydziela lub odnajduje wolne urządzenie pętli do wykorzystania. Przy powodzeniu, jako wynik wywołania zwracany jest numer urządzenia. Ta operacja nie przyjmuje argumentów. .TP \fBLOOP_CTL_ADD\fP Dodaje nowe urządzenie pętli, którego numer podano jako liczba typu long integer w trzecim argumencie \fBioctl\fP(2). Przy powodzeniu, jako wynik wywołania zwracany jest indeks urządzenia. Jeśli urządzenie zostało już przydzielone, wywołanie zawodzi z błędem \fBEEXIST\fP. .TP \fBLOOP_CTL_REMOVE\fP Usuwa urządzenie pętli, którego numer podano jako liczba typu long integer w trzecim argumencie \fBioctl\fP(2). Przy powodzeniu, jako wynik wywołania zwracany jest numer urządzenia. Jeśli urządzenie jest w użyciu, wywołanie zawodzi z błędem \fBEBUSY\fP. .SH PLIKI .TP \fI/dev/loop*\fP Specjalne pliki urządzeń blokowych pętli. .SH PRZYKŁADY Poniższy program korzysta z urządzenia \fI/dev/loop\-control\fP do odnalezienia wolnego urządzenia pętli, otwiera urządzenie pętli, otwiera plik przeznaczony do użycia przez urządzenie pętli, a następnie wiąże urządzenie pętli z tym plikiem. Poniższa sesja powłoki demonstruje użycie programu: .P .in +4n .EX $\fB dd if=/dev/zero of=plik.img bs=1MiB count=10\fP; 10+0 przeczytanych rekordów 10+0 zapisanych rekordów 10485760 bajtów (10 MB) skopiowano, 0.00609385 s, 1.7 GB/s $\fB sudo ./mnt_loop obraz.img\fP; loopname = /dev/loop5 .EE .in .SS "Kod źródłowy programu" \& .EX #include #include #include #include #include #include \& #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \[rs] } while (0) \& int main(int argc, char *argv[]) { int loopctlfd, loopfd, backingfile; long devnr; char loopname[4096]; \& if (argc != 2) { fprintf(stderr, "Użycie: %s plik\-dla\-pętli\[rs]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\[rs]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); } .EE .SH "ZOBACZ TAKŻE" \fBlosetup\fP(8), \fBmount\fP(8) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .