.\" -*- coding: UTF-8 -*-
.\" Copyright 2002 Urs Thuermann (urs@isnogud.escape.de)
.\" and Copyright 2015 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: GPL-2.0-or-later
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH loop 4 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
loop, loop\-control \- urządzenia pętli
.SH SKŁADNIA
.nf
#include <linux/loop.h>
.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
$ \fBdd if=/dev/zero of=obraz.img bs=1MiB count=10\fP
$ \fBsudo losetup /dev/loop4 plik.img\fP
$ \fBsudo mkfs \-t ext4 /dev/loop4\fP
$ \fBsudo mkdir /moje\-urzadzenie\-loop\fP
$ \fBsudo 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<linux/loop.h>\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<linux/loop.h>\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
$ \fBdd 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
$ \fBsudo ./mnt_loop obraz.img\fP
loopname = /dev/loop5
.EE
.in
.SS "Kod źródłowy programu"
\&
.EX
#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); \[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
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Michał Kułach <michal.kulach@gmail.com>
.
.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 .
