BOOTPARAM(7)

NAZWA
bootparam - wprowadzenie do parametrów rozruchowych jądra Linux

OPIS
Jądro (kernel) Linux przyjmuje pewne "opcje wiersza poleceń"", lub "parametry rozruchowe" podczas uruchamiania. Ogólnie jest to używane do przekazywania jądru informacji o parametrach sprzętu, których samodzielnie nie potrafi ono określić lub by zapobiec wartościom, które jądro by normalnie wykryło.

Kiedy jądro jest uruchamiane bezpośrednio przez BIOS, nie ma możliwości przekazywania żadnych parametrów. Tak więc, aby móc mieć tę możliwość, trzeba używać programu rozruchowego zdolnego do przekazywania parametrów, takiego jak GRUB.

  Lista argumentów
Wiersz poleceń jądra jest przetwarzany w listę łańcuchów (argumentów rozruchowych) rozdzielonych spacjami. Większość argumentów rozruchowych przyjmuje postać:

    nazwa[=wartość_1][,wartość_2]...[,wartość_10]

gdzie "nazwa" jest unikalnym słowem kluczowym, które jest używane do określania, która część jądra ma otrzymać związane z nim wartości. Poszczególne argumenty rozruchowe są zwyczajnie oddzielone spacjami, w formacie wyżej podanym. Proszę zauważyć, że limit 10 wartości jest rzeczywisty, jako że obecnie kod obsługuje jedynie 10 oddzielonych przecinkami parametrów dla słowa kluczowego (można jednak użyć tego samego słowa kluczowego drugi raz, aby pomieścić dodatkowe parametry).

Most of the sorting is coded in the kernel source file init/main.c. First, the kernel checks to see if the argument is any of the special arguments 'root=', 'nfsroot=', 'nfsaddrs=', 'ro', 'rw', 'debug', or 'init'. The meaning of these special arguments is described below.

Potem przechodzi przez listę funkcji konfigurujących, aby zobaczyć czy podany tekst argumentu (taki jak "foo") nie jest związany z funkcją konfigurującą ("foo_setup()") dla konkretnego urządzenia, lub części jądra. Jeśli przekazało się jądru linię foo=3,4,5,6 to przeszuka ono tablice bootsetupowe aby sprawdzić, czy "foo" było zarejestrowane. Jeśli było, wywołuje funkcję konfigurującą związaną z "foo" (foo_setup()) i przekazuje jej argumenty 3, 4, 5 i 6 podane w linii poleceń jądra.

Wszystko, co jest w postaci "foo=bar", co nie jest akceptowane jako funkcja konfigurująca, jak opisano powyżej, zostaje zinterpretowane jako zmienna środowiskowa, która ma być ustawiona. (Bezużytecznym?) przykładem może być użycie "TERM=vt100" jako argumentu rozruchowego.

Wszelkie pozostałe argumenty, które nie były wybrane przez jądro i nie były zinterpretowane jako zmienne środowiskowe, zostają potem przekazane procesowi PID 1, którym zwykle jest program init(1). Najpopularniejszym argumentem, który jest przekazywany procesowi init jest słowo "single", które mówi mu, by uruchomił komputer w trybie pojedynczego użytkownika, żeby nie odpalał wszystkich normalnych demonów. Proszę sprawdzić na stronie podręcznika init(1), jakie argumenty przyjmuje.

  Ogólne argumenty nieprzeznaczone do konkretnego urządzenia

'init=...'
    Ustawia to pierwotne polecenie do wykonania przez jądro. Jeśli nie jest ono ustawione lub nie może zostać znalezione, to jądra wypróbowuje /sbin/init, następnie /etc/init, później /bin/init i w końcu /bin/sh a ostatecznie panikuje, jeśli wszystkie te próby zawiodą.

'nfsaddrs=...'
    Ustawia adres rozruchowy NFS na podany łańcuch. Adres rozruchowy jest używany w przypadku rozruchu sieciowego.

'nfsroot=...'
    Ustawia nazwę katalogu głównego NFS na podany łańcuch. Jeśli łańcuch ten nie rozpoczyna się od "/", "," lub cyfry, to jest on poprzedzany przez "/tftpboot/". Ta nazwa katalogu głównego jest używana w przypadku rozruchu sieciowego.

'root=...'
    Ten argument mówi jądru, którego urządzenia użyć do jako głównego systemu plików podczas rozruchu. Domyślna wartość tego ustawienia jest skonfigurowana podczas kompilacji i zwykle jest wartością urządzenia głównego systemu, na którym zbudowano jądro. Aby nadpisać tę wartość i wybrać na urządzenie główne np. drugi napęd dyskietek, należy użyć "root=/dev/fd1".

    The root device can be specified symbolically or numerically. A symbolic specification has the form /dev/XXYN, where XX designates the device type (e.g., 'hd' for ST-506 compatible hard disk, with Y in 'a'–'d'; 'sd' for SCSI compatible disk, with Y in 'a'–'e'), Y the driver letter or number, and N the number (in decimal) of the partition on this device.

    Proszę zauważyć, że nie ma to nic do czynienia z przeznaczeniem tych urządzeń w bieżącym systemie. Część "/dev/" jest tylko konwencją.

    Powyższe urządzenia można przekazywać także w niewygodnej i mniej przenośnej reprezentacji numerycznej, która jest kombinacją numerów głównych/pobocznych (major/minor) urządzeń. (np. /dev/sda3 ma numer główny 8 i poboczny 3, więc można użyć "root=0x803" jako alternatywy).

'rootdelay='
    Parametr ustawia przerwę (w sekundach) przed próbą zamontowania głównego systemu plików.

'rootflags=...'
    Parametr ustawia łańcuch opcji montowania dla głównego systemu plików (więcej informacji również w fstab(5)).

'rootfstype=...'
    Opcja 'rootfstype' nakazuje jądru zamontowanie głównego systemu plików tak, jak gdyby był on podanego typu. Może być to przydatne (przykładowo) do zamontowania systemu plików ext3 jako ext2 i usunięcia dziennika w głównym systemie plików, cofając tak naprawdę jego format z ext3 do ext2 bez potrzeby rozruchu komputera z innego nośnika.

'ro' i 'rw'
    Opcja 'ro' mówi jądru, by zamontowało główny system plików jako przeznaczony tylko do odczytu, aby fsck mógł pracować na nieruchomym systemie plików. Żaden proces nie może zapisywać plików na systemie plików, dopóki nie zostanie remontowany jako przeznaczony do odczytu i zapisu, np. poprzez "mount -w -n -o remount /" (patrz też mount(8)).

    Opcja 'rw' mówi jądru, by zamontować główny system plików jako przeznaczony do odczytu/zapisu. Tak jest domyślnie.

'resume=...'
    Przekazuje do jądra położenie zahibernowanych danych, z których chce się wznowić pracę systemu po hibernacji. Zwykle jest to partycja lub plik wymiany. Przykład:

        resume=/dev/hda2

'reserve=...'
    Ta komenda jest używana do chronienia regionów portów wejścia/wyjścia przed sondowaniem. Postać polecenia:

        reserve=iobase,extent[,iobase,extent]...

    W niektórych komputerach może być niezbędne chronienie sterowników urządzeń od szukania urządzeń (autosondowanie) w określonych regionach. Może to wynikać z błędnej reakcji sprzętu, możliwej błędnej identyfikacji lub po prostu z tego, że nie chce się tego sprzętu inicjalizować.

    Argument reserve podaje region portu wejścia/wyjścia, który nie ma być sondowany. Sterownik urządzenia nie będzie sondować zarezerwowanego regionu, chyba że inny argument rozruchowy wyjątkowo mu to nakaże.

    Na przykład, wiersz rozruchowy

        reserve=0x300,32 blah=0x300

    powstrzymuje wszystkie sterowniki urządzeń, poza sterownikiem "blah" od sondowania 0x300-0x31f.

'panic=N'
    Domyślnie, jądro nie uruchomi się ponownie po panice, ale za pomocą tej opcji można spowodować, że jądro wykona ponowne uruchomienie systemu po N sekundach (jeśli N jest większe niż zero). Czas ten można również ustawić za pomocą

        echo N > /proc/sys/kernel/panic.

'reboot=[warm|cold][,[bios|hard]]'
    Od Linuksa 2.0.22 ponowne uruchomienie jest domyślnie "zimne" (cold). Można również wybrać stare ustawienie za pomocą 'reboot=warm'. "Zimny" restart może wymagać zresetowania określonego sprzętu, może również zniszczyć jeszcze nie zapisane dane w buforach dysku. "Ciepły" restart może być szybszy. Domyślnie, ponowne uruchomienie jest "twarde" (hard), poprzez żądanie pulsowania bitu 0 na linii resetu kontrolera klawiatury, lecz istnieje przynajmniej jeden typ płyt głównych, z którym to nie działa. Opcja 'reboot=bios' może w zamian przeskoczyć przez BIOS.

'nosmp' i 'maxcpus=N'
    Tylko gdy zdefiniowano __SMP__. Opcja wiersza polecenia 'nosmp' lub 'maxcpus=0' wyłączy całkowicie aktywację SMP, natomiast opcja 'maxcpus=N' ograniczy maksymalną liczbę aktywowanych procesorów w trybie SMP do N.

  Argumenty rozruchowe do użycia przez deweloperów jądra

'debug'
    Komunikaty jądra są przekazywane do demona (np. klogd(8) lub podobnego), tak że mogą zostać zapisane na dysku. Wiadomości o priorytetach powyżej console_loglevel są także wypisywane na konsoli (informacje na temat poziomów priorytetów zawiera syslog(2)). Domyślnie console_loglevel jest ustawiona na logowanie wszystkiego co ważniejsze niż KERN_DEBUG. Ten argument rozruchowy dodatkowo nakazuje wypisywanie wiadomości o priorytecie KERB_DEBUG.. Poziom logowania konsoli można również ustawić podczas pracy systemu dzięki plikowi /proc/sys/kernel/printk (opisanemu w syslog(2)), operacji syslog(2) SYSLOG_ACTION_CONSOLE_LEVEL lub dmesg(8).

'profile=N'
    Możliwe jest włączenie funkcji profilowania jądra, aby dowiedzieć się na co jądro zużywa cykle procesora. Profilowanie jest włączane, za pomocą ustawienia zmiennej prof_shift na wartość niezerową. Można to zrobić podając CONFIG_PROFILE w chwili kompilacji lub używając opcji 'profile='. Wartość prof_shift będzie wynosić N, jeśli zostanie podana lub CONFIG_PROFILE_SHIFT, gdy poda się ją, lub 2 - wartość domyślną. Ważność tej zmiennej jest taka, że daje ona rozdrobnienie profilowania: za każdym cyknięciem zegara, jeśli system wykonywał kod jądra, licznik jest zwiększany:

        profile[address >> prof_shift]++;

    Surowe informacje profilowania można odczytać z /proc/profile. Prawdopodobnie będzie trzeba użyć narzędzia takiego jak readprofile.c, aby je uporządkować. Zapis do /proc/profile wyczyści liczniki.

  Argumenty rozruchowe do użytku z ramdyskiem
Tylko jeśli jądro zostało skompilowane z CONFIG_BLK_DEV_RAM. Generalnie, złym pomysłem jest używanie ramdysku w Linuksie - system sam będzie korzystał z dostępnej pamięci bardziej wydajnie. Jednak w trakcie rozruchu często przydatne okazuje się załadowanie zawartości dyskietki na ramdysk. Może się również okazać, że pewne moduły (np. do systemu plików lub sprzętu) muszą zostać załadowane przed uzyskaniem dostępu do głównego dysku.

    W Linuksie 1.3.48, obsługa ramdysku uległa całkowitej zmianie. Wcześniej, pamięć była alokowana statycznie i istniał parametr 'ramdisk=N', który określał jego rozmiar. Mogło to również służyć do ustawienia obrazu jądra w czasie kompilacji. Obecnie, ramdysk używa buforów i powiększa się w sposób dynamiczny. Wiele informacji o bieżącej konfiguracji ramdysku zawiera plik źródeł jądra Documentation/blockdev/ramdisk.txt (w starszych jądrach Documentation/ramdisk.txt).

    Są cztery parametry: dwa logiczne i dwa całkowite.

'load_ramdisk=N'
    Jeśli N=1 - ładuje ramdysk, przy N=0 nie ładuje ramdysku (tak jest domyślnie).

'prompt_ramdisk=N'
    Jeśli N=1 - prosi o włożenie dyskietki (tak jest domyślnie), jeśli N=0 - nie prosi (dlatego parametr ten nigdy nie jest potrzebny).

'ramdisk_size=N' lub (przestarzałe) 'ramdisk=N'
    Ustawia maksymalny rozmiar ramdysków na N kB. Domyślny wynosi 4096 (4 MB).

'ramdisk_start=N'
    Ustawia startowy numer bloku (przesunięcie na dyskietce, gdzie ramdysk się rozpoczyna) na N. Jest to potrzebne w przypadku, gdy ramdysk znajduje się za obrazem jądra.

'noinitrd'
    Tylko gdy jądro zostało skompilowane z CONFIG_BLK_DEV_RAM i CONFIG_BLK_DEV_INITRD. Obecnie, można skompilować jądro tak, aby używało initrd. Gdy ta funkcja jest włączona, proces rozruchowy załaduje jądro i początkowy ramdysk; następnie jądro konwertuje initrd do "normalnego" ramdysku, który jest montowany w trybie do odczytu i zapisu, jako urządzenie główne; następnie wykonywane jest /linuxrc; później montowany jest "rzeczywisty" główny system plików, a system plików initrd jest przenoszony do /initrd; na końcu wykonywana jest zwykła sekwencja rozruchowa (np. wywołanie /sbin/init).

    For a detailed description of the initrd feature, see the kernel source file Documentation/admin-guide/initrd.rst (or Documentation/initrd.txt before Linux 4.10).

    Opcja 'noinitrd' mówi jądru, że choć zostało skompilowane w celu działania z initrd, to nie powinno przechodzić przez powyższe kroki, lecz pozostawić dane initrd w /dev/initrd. To urządzenie może być użyte jedynie jednokrotnie: dane są zwalniane w chwili, gdy ostatni proces, który je używał zamknie /dev/initrd.

  Argumenty rozruchowe do urządzeń SCSI
Ogólne pojęcia w tej sekcji:

iobase -- pierwszy port I/O, który zajmuje host SCSI. Są one podawane w notacji heksadecymalnej i zazwyczaj leżą w zakresie od 0x200 do 0x3ff.

irq -- przerwanie sprzętowe, które wykorzystuje karta. Prawidłowe wartości zależą od rozpatrywanej karty, lecz zwykle są to 5, 7, 9, 10, 11, 12 i 15. Inne wartości są zwykle używane w peryferiach takich jak dyski twarde IDE, stacje dysków, porty szeregowe, itp.

scsi-id -- identyfikator, którego adapter używa do identyfikowania siebie na szynie SCSI. Tylko niektóre adaptery umożliwiają zmianę tej wartości, jako że większość ma ją trwale ustaloną wewnątrz. Częstą wartością domyślną jest 7, lecz zestawy Seagate i Future Domain TMC-950 używają 6.

parity -- określa, czy adapter SCSI oczekuje od załączonych urządzeń dostarczania wartości parzystości przy wymianach informacji. Podanie jedynki oznacza, że sprawdzanie parzystości jest włączone, a zero ją wyłącza. Znowu jednak nie wszystkie adaptery przyjmują wybranie zachowania parzystości podczas rozruchu.

'max_scsi_luns=...'
    A SCSI device can have a number of 'subdevices' contained within itself. The most common example is one of the new SCSI CD-ROMs that handle more than one disk at a time. Each CD is addressed as a 'Logical Unit Number' (LUN) of that particular device. But most devices, such as hard disks, tape drives, and such are only one device, and will be assigned to LUN zero.

    Niektóre słabo dopracowane urządzenia SCSI nie mogą obsłużyć sondowania LUN nierównego zeru. Dlatego, jeśli flaga kompilacji CONFIG_SCSI_MULTI_LUN nie była ustawiona, nowe jądra sondują domyślnie tylko LUN zero.

    Aby podać ilość sondowanych LUN-ów podczas rozruchu, wpisuje się 'max_scsi_luns=n' jako argument rozruchowy, gdzie n jest liczbą między 1 a 8. Aby zapobiec problemom opisanym wyżej, używa się n=1 aby zapobiec denerwowaniu nieprawidłowych urządzeń.

Konfiguracja napędu kasetowego SCSI
    Niektóre parametry konfiguracji sterownika kasetowego SCSI mogą być osiągnięte przez użycie następującego:

        st=buf_size[,write_threshold[,max_bufs]]

    Pierwsze dwie liczby są podane w jednostkach kilobajtowych. Domyślna wartość buf_size to 32k B, a maksymalna wartość to 16384 kB. Wartość write_threshold jest wartością przy której bufor jest przekazywany na kasetę z domyślną wartością 30 kB. Maksymalna liczba buforów zmienia się z liczbą wykrytych napędów, a domyślną wartością jest 2. Przykładowym użyciem może być:

        st=32,30,2

    Szczegóły można znaleźć w pliku Dcumentation/scsi/st.txt (lub drivers/scsi/README.st w starszych jądrach) w źródłach jądra Linux.

  Dyski twarde

Parametry sterownika dysków/CD-ROM-ów IDE
    The IDE driver accepts a number of parameters, which range from disk geometry specifications, to support for broken controller chips. Drive-specific options are specified by using 'hdX=' with X in 'a'–'h'.

    Opcje niespecyficzne napędom są przekazywane z przedrostkiem "hd=". Proszę zauważyć, że używanie przedrostka specyficznego dyskowi dla niespecyficznej opcji także zadziała, a opcja zostanie zaaplikowana tak jak oczekiwano.

    Proszę zauważyć także, że "hd=" może być użyty w odniesieniu do następnego niepodanego napędu w sekwencji (a, ..., h). W następujących omówieniach, opcja "hd=" będzie cytowana dla zwięzłości. Proszę zapoznać się z plikiem Documentation/ide/ide.txt (lub Documentation/ide.txt w starszych jądrach albo drivers/block/README.ide w archaicznych jądrach) w źródłach jądra Linux, aby dowiedzieć się więcej.

Opcje 'hd=cyls,heads,sects[,wpcom[,irq]]'
    Tych opcji używa się do przekazywania fizycznej geometrii dysku. Jedynie pierwsze trzy wartości są wymagane. Wartości cylinder/head/sectors będą tymi używanym przez fdisk. Wartość wpcom (write precompensation) jest ignorowana dla dysków IDE. Podana wartość IRQ będzie używana dla interfejsu, na którym rezyduje napęd i nie jest tak naprawdę parametrem specyficznym napędowi.

Opcja 'hd=serialize'
    Chip CMD-640 interfejsu dual IDE jest wadliwy; zaprojektowano go tak, że gdy napędy z drugiego interfejsu są używane równocześnie z napędami pierwszego, dane ulegają zniszczeniu. Używanie tej opcji mówi sterownikowi by upewnił się, że oba interfejsy nigdy nie są używane naraz.

Opcja 'hd=noprobe'
    Nie sonduje danego dysku. Np.

        hdb=noprobe hdb=1166,7,17

    wyłączy sondowanie, lecz wciąż poda geometrię dysku, więc będzie zarejestrowany jako prawidłowe urządzenie blokowe, a więc będzie się nadawać do użytku.

Opcja 'hd=nowerr'
    Niektóre napędy czasami mają trwale załączony bit WRERR_STAT. To usprawnia działanie tych wadliwych urządzeń.

Opcja 'hd=cdrom'
    Mówi to sterownikowi IDE, że w miejscu normalnego dysku IDE mamy CD-ROM typu ATAPI. W większości wypadków, CD-ROM jest wykrywany automatycznie, lecz jeśli tak nie jest, to to powinno pomóc.

Opcje standardowego sterownika dysków ST-506 ('hd=')
    Standardowy sterownik dysków może przyjmować argumenty geometrii dla dysków podobnie do sterownika IDE. Proszę zauważyć jednak, że oczekuje on jedynie trzech wartości (C/H/S) -- więcej lub mniej spowoduje ciche zignorowanie podanego polecenia. Podobnie też, przyjmuje jedynie "hd=" jako argument, np. "hda=" jest tu nieprawidłowe. Format jest następujący:

        hd=cylindry,głowice,sektory

    Jeśli są tam zainstalowane dwa dyski, powyższe jest powtarzane z parametrami geometrii dla drugiego dysku.

  Urządzenie ethernetowe
Różne sterowniki używają różnych parametrów, ale wszystkie przynajmniej dzielą IRQ, wartość bazowego portu I/O i nazwę. W najogólniejszej formie wygląda to tak:

    ether=irq,iobase[,param_1[,param_2,...param_8]],nazwa

Pierwszy nienumeryczny argument jest pobierany jako nazwa. Wartości param_n (jeśli mają zastosowanie) zwykle mają różne znaczenia dla różnych kart/sterowników. Typowe wartości param_n są używane do podawania rzeczy takich jak adres pamięci dzielonej, wyboru interfejsu, kanału DMA i podobnych.

Najpopularniejszym wykorzystaniem tego parametru jest wymuszenie sondowania drugiej karty ethernetowej, jako że domyślnie sondowana jest tylko jedna. Można tego dokonać prostym:

    ether=0,0,eth1

Proszę zauważyć, że wartości zera dla IRQ i bazy I/O w powyższym przykładzie mówią sterownikowi, by je wysondował automatycznie.

Ethernet-Howto zawiera rozległą dokumentację o używaniu wielorakich kart i o specyficznych implementacjach karta/sterownik wartości param_n. Zainteresowani powinni odnieść się do odpowiedniej sekcji w tamtym dokumencie.

  Sterownik stacji dyskietek
Istnieje wiele opcji sterownika stacji dyskietek i wszystkie są wymienione w Documentation/blockdev/floppy.txt (lub Documentation/floppy.txt w starszych jądrach albo drivers/block/README.fd w archaicznych jądrach) w źródle jądra Linux. Tam można znaleźć szczegółowe informacje.

  Sterownik dźwięku
Sterownik dźwięku może także akceptować argumenty rozruchowe do przesłonięcia wartości wkompilowanych. Nie jest to zalecane i jest raczej złożone. Jest to opisane w pliku w źródłach jądra Linux Documentation/sound/oss/README.OSS (drivers/sound/Readme.linux w przypadku starszych wersji jądra). Przyjmuje parametr rozruchowy postaci:

    sound=urządzenie1[,urządzenie2[,urządzenie3...[,urządzenie10]]]

gdzie każda wartość urządzenieN jest formatu 0xTaaaId, a bajty są użyte następująco:

T - rodzaj urządzenia: 1=FM, 2=SB, 3=PAS, 4=GUS, 5=MPU401, 6=SB16, 7=SB16-MPU401

aaa - heksadecymalnie zapisany adres I/O.

I - heksadecymalnie zapisana linia przerwań (np. 10=a, 11=b, ...)

d - kanał DMA.

Jak widać, jest to całkiem bałaganiarskie i lepiej wkompilować swoje własne wartości do sterownika. Używanie argumentu "sound=0" wyłączy sterownik dźwięku.

  Sterownik drukarki wierszowej

'lp='
    Składnia:

        lp=0
        lp=auto
        lp=reset
        lp=port[,port...]

    Można przekazać sterownikowi drukarki, który port ma użyć, a którego nie. To ostatnie przydaje się, jeśli nie chce się aby sterownik drukarki zajął wszystkie dostępne porty równoległe, dzięki czemu inne sterowniki (np. PLIP, PPA) mogą ich użyć w zamian.

    Format argumentu to wiele nazw portów. Np. lp=none,parport=0 użyje pierwszego portu równoległego do lp1 i wyłączy lp0. Aby wyłączyć cały sterownik drukarki, można użyć lp=0.

ZOBACZ TAKŻE
klogd(8), mount(8)

Aktualne informacje znajdują się w pliku źródeł jądra Documentation/admin-guide/kernel-parameters.txt.

O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.13 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.