Wyjście do pliku Linux. Jak zapisać dane wyjściowe konsoli do pliku

Jeśli dane wyjściowe do konsoli (graficznej) nie są zbyt duże, możesz po prostu zaznaczyć fragment myszą i wkleić go do wiadomości, klikając środkowy przycisk. W przeciwnym razie możesz użyć przekierowania danych wyjściowych do pliku za pomocą „lejka”, takiego jak ten:

Some_command parametry > logfile.txt

Aby zobaczyć wynik wykonania na ekranie, a jednocześnie zapisać do pliku, możesz użyć polecenia tee:

Niektóre_parametry polecenia | tee - plik dziennika.txt

Polecenie setterm -dump tworzy migawkę bieżącego bufora konsoli wirtualnej jako zwykły plik tekstowy o domyślnej nazwie screen.dump. Możesz użyć numeru konsoli, dla której chcesz wykonać zrzut jako argumentu. A dodanie opcji -file nazwa_pliku przekieruje ten zrzut do pliku o określonej nazwie. Opcja -append dołączy nowy zrzut do istniejącego pliku - „domyślnego” screen.dump lub pliku nazwanego z opcją -file.

Te. po użyciu polecenia like

Setterm -dump -file /root/screenlog

odpowiednio w pliku /root/screenlog będzie zawartość jednej strony konsoli.

Znaleziono inne rozwiązanie do kopiowania/wklejania tekstu w konsoli tekstowej bez użycia myszy. Możesz także skopiować tekst z bufora przewijania (tj. Wszystko na ekranie i nad ekranem). Aby lepiej to zrozumieć, przeczytaj o ekranie menedżera okien opartym na konsoli. Przydatne może być również zwiększenie rozmiaru bufora przewijania.

1) Ekran uruchamiania

2) Naciśnij Enter. Wszystko. Jesteśmy w zerowym oknie konsoli.

3) Wykonujemy niezbędne polecenia, których dane wyjściowe należy skopiować.

4) Ctrl+A, Ctrl+[ - jesteśmy w trybie kopiowania. Umieszczamy kursor na początku zaznaczenia, wciskamy spację, następnie umieszczamy kursor na końcu zaznaczenia, wciskamy spację. Tekst skopiowany do schowka.

5) Ctrl+A, c - stworzyliśmy nowe 1. okno.

6) Ctrl+A, 1 - przeszliśmy do pierwszego okna.

7) Otwórz dowolny (?) edytor tekstu (próbowałem w mc) i naciśnij Ctrl + A, Ctrl +] - tekst zostanie wstawiony. Ratujemy.

8) Ctrl+A, Ctrl+0 - powrót do okna zerowego.

Jak zwiększyć bufor przewijania?

Pierwszym rozwiązaniem jest zwiększenie domyślnego (domyślnego) rozmiaru bufora w źródłach jądra i ponowna kompilacja. Załóżmy, że jesteś tak samo niechętny do robienia tego jak ja i szukasz bardziej elastycznego medium.

I jest takie narzędzie, ale nazywa się framebuffer console , w skrócie fbcon. To urządzenie ma plik dokumentacji fbcon.txt; jeśli zainstalowałeś dokumentację jądra, to ją masz. Poszukaj go gdzieś w okolicy /usr/udostępnij branchs (nie mogę podać dokładnej ścieżki ze względu na różnice w dystrybucji).

W tym momencie przepraszam: musimy zrobić małą dygresję i porozmawiać trochę o buforze wideo ( bufor ramki ).

Bufor wideo to bufor między wyświetlaczem a kartą wideo. Jego piękno polega na tym, że można nim manipulować: pozwala na sztuczki, które nie zadziałałyby, gdyby adapter był podłączony bezpośrednio do wyświetlacza.

Jedna taka sztuczka jest związana z buforem przewijania; okazuje się, że możesz „poprosić” bufor wideo o przydzielenie większej ilości pamięci do bufora przewijania. Osiąga się to poprzez parametry rozruchowe jądra. Najpierw wymagasz bufor ramki(bufor wideo); Potem pytasz większy bufor zwój.

Poniższy przykład dotyczy GRUB-a, ale można go łatwo dostosować do LILO. W pliku konfiguracyjnym GRUB - menu.lst- znajdź linię odpowiadającą jądru, a następnie: Usuń opcję vga=xxx, jeśli jest obecna. Dodaj opcję video=vesabf lub cokolwiek, co pasuje do twojego sprzętu. Dodaj opcję fbcon=scrollback:128 . Po tej procedurze wiersz parametrów jądra powinien wyglądać mniej więcej tak:

Jądro /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

Pytanie brzmi, po co usuwać opcję vga=xxx? Ze względu na możliwe konflikty z opcją wideo. Na mojej karcie ATI nie mogę zmienić bufora przewijania, jeśli na liście znajduje się vga=xxx. Być może w twoim przypadku tak nie jest. Jeśli powyższe opcje działają - dobrze; ale co, jeśli chcesz zwiększyć liczbę linii lub ustawić mniejszą czcionkę na ekranie? Zawsze robiłeś to z opcją vga=xxx i właśnie to zniknęło. Bez obaw - to samo można osiągnąć zmieniając parametry fbcon zgodnie z opisem w pliku fbcon.txt(ale nie opisane w tym artykule).

Z opcją fbcon=scrollback:128 mój bufor przewijania wzrósł do 17 ekranów (35 razy Shift+PgUp pół ekranu). Nawiasem mówiąc, 128 to kilobajt. Autor artykułu twierdzi, że więcej nie da się ustalić. nie próbowałem.

Możesz użyć skryptu.

Nazwa pliku skryptu.log

po wykonaniu wszystkich wymaganych poleceń -

Wszystko jest zapisywane w nazwa_pliku.log

FreeBSD ma wspaniałe narzędzie do oglądania, które pozwala monitorować terminale, ale jak się okazało, w Linuksie wykonuje zupełnie inne funkcje =\ Warto googlować w tym temacie, jest coś ...

Kiedy pracujesz w terminalu, naturalnie widzisz wszystkie dane wyjściowe poleceń w czasie rzeczywistym bezpośrednio w oknie terminala. Ale są chwile, kiedy dane wyjściowe muszą zostać zapisane, aby móc z nimi później pracować (przeanalizować je, porównać itp.). Tak więc, pracując w Bash, masz możliwość przekierowania wyświetlanych informacji z okna terminala do plik tekstowy. Zobaczmy, jak to się robi.

Opcja 1: przekieruj tylko wyjście terminala do pliku

W takim przypadku cały wynik pracy dowolnego polecenia zostanie zapisany do pliku tekstowego, bez wyświetlania go na ekranie. Oznacza to, że dosłownie przekierujemy informacje z ekranu do pliku. Aby to zrobić, musisz użyć operatorów > I >> i ścieżka do pliku do zapisu, na końcu wykonywanego polecenia.

Operator > zapisuje wynik polecenia do określonego pliku i, jeśli zawiera on już jakieś informacje, nadpisuje je.

Operator >> przekieruje wyjście polecenia do pliku, a jeśli zawiera również informacje, nowe dane zostaną dodane na końcu pliku.

Przyjrzyjmy się przykładowemu poleceniu ls , który wyświetla listę plików i folderów w określonym katalogu. Zapiszmy wynik jej pracy do pliku tekstowego. Musimy napisać polecenie, umieścić operator i podać ścieżkę do pliku:

Ls > /home/rosłan/przykład

Teraz zobaczmy, czy wszystko zadziałało. Aby to zrobić, możesz użyć dowolnego posiadanego edytora tekstu. Możesz to również zrobić bezpośrednio w terminalu za pomocą polecenia cat:

Kot /home/rusłan/przykład

Wszystko działa.

Zapamietaj to " > " nadpisze wszystkie dane, które były wcześniej w pliku, więc jeśli chcesz coś dodać do pliku, użyj operatora " >> «

Powiedzmy, że po przekierowaniu wyjścia polecenia ls do pliku " przykład » postanowiliśmy sprawdzić wersję jądra systemu, a także zapisać dane wyjściowe do tego samego pliku. Aby znaleźć wersję jądra, użyj polecenia nienazwa i parametr -A , następnie mówimy Bashowi jak i gdzie zapisać wynik jego wykonania:

Unazwa -a >> /home/rusłan/przykład

Sprawdźmy ponownie wynik:

Kot /home/rusłan/przykład

Jak widać utrwaliliśmy wyniki prac i ls , I nienazwa .

Opcja 2: przekierowanie wyjścia do pliku i wyświetlenie go na ekranie

Nie wszyscy i nie zawsze wygodni w obsłudze operatorzy > I >> , ponieważ jeszcze lepiej jest, gdy lawinę poleceń można obserwować w czasie rzeczywistym w oknie terminala. W takim przypadku możemy użyć polecenia trójnik , który wyświetli wykonanie poleceń na ekranie i zapisze je do pliku. Jego składnia jest następująca:

Zespół | tee /ścieżka/do/pliku

Ta opcja jest podobna do operatora > z poprzedniego akapitu, czyli przy zapisie do pliku wszystkie stare dane zostaną usunięte. Jeśli chcesz dołączyć do pliku, musisz dodać parametr do konstrukcji -A :

Zespół | tee -a /ścieżka/do/pliku

Jednym z najbardziej interesujących i przydatnych tematów dla administratorów systemu i nowych użytkowników, którzy dopiero zaczynają rozumieć pracę z terminalem, jest przekierowanie wejścia/wyjścia w systemie Linux. Ta funkcja terminala umożliwia przekierowanie danych wyjściowych poleceń do pliku lub zawartości pliku do danych wejściowych poleceń, łączenie poleceń razem i tworzenie potoków poleceń.

W tym artykule przyjrzymy się, jak działa przekierowanie we/wy Linuksa, jakie operatory są do tego używane i gdzie można to wszystko zastosować.

Wszystkie wykonywane przez nas polecenia zwracają nam trzy rodzaje danych:

  • Wynik wykonania polecenia, zwykle dane tekstowe żądane przez użytkownika;
  • Komunikaty o błędach - informują o przebiegu wykonywania polecenia i zaistniałych nieprzewidzianych okolicznościach;
  • Kod powrotu to liczba, która pozwala ocenić, czy program zadziałał poprawnie.

W systemie Linux wszystkie substancje są uważane za pliki, w tym strumienie wejścia/wyjścia systemu Linux — pliki. Każda dystrybucja ma trzy główne pliki strumieniowe, z których mogą korzystać programy, są one definiowane przez powłokę i identyfikowane przez numer deskryptora pliku:

  • STDIN lub 0- ten plik jest powiązany z klawiaturą i stąd większość poleceń pobiera swoje dane;
  • STDWYJŚCIE lub 1- to jest standardowe wyjście, tutaj program wysyła wszystkie wyniki swojej pracy. Jest powiązany z ekranem, a dokładnie z terminalem, w którym wykonywany jest program;
  • STDERR lub 2- wszystkie komunikaty o błędach są wyprowadzane do tego pliku.

Przekierowanie we/wy umożliwia zastąpienie jednego z tych plików własnym. Na przykład możesz zmusić program do odczytywania danych z pliku w systemie plików zamiast z klawiatury, możesz też zapisywać błędy do pliku zamiast na ekranie itd. Wszystko to odbywa się za pomocą symboli "<" I ">" .

Przekieruj wyjście do pliku

Wszystko jest bardzo proste. Możesz przekierować dane wyjściowe do pliku za pomocą symbolu >. Na przykład przechowujmy dane wyjściowe polecenia top:

top -bn 5 > top.log

Opcja -b powoduje, że program działa w nieinteraktywnym trybie wsadowym, a opcja n powtarza operację pięć razy, aby uzyskać informacje o wszystkich procesach. Zobaczmy teraz, co dzieje się z kotem:

Symbol ">" nadpisuje informacje z pliku, jeśli coś już tam jest. Aby dodać dane do końca, użyj ">>" . Na przykład przekieruj dane wyjściowe do pliku linux na górę:

top -bn 5 >> top.log

Domyślnym przekierowaniem jest użycie standardowego deskryptora pliku wyjściowego. Ale możesz to wyraźnie określić. To polecenie da ten sam wynik:

top -bn 5 1>top.log

Przekieruj błędy do pliku

Aby przekierować wyjście błędu do pliku, musisz jawnie określić deskryptor pliku, który chcesz przekierować. W przypadku błędów jest to numer 2. Na przykład podczas próby uzyskania dostępu do katalogu głównego ls zgłosi błąd:

Możesz przekierować standardowy błąd do takiego pliku:

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Aby dołączyć dane na końcu pliku, użyj tego samego symbolu:

ls -l /root/ 2>>ls-error.log

Przekieruj standardowe wyjście i błędy do pliku

Możesz także przekierować wszystkie dane wyjściowe, błędy i standardowe wyjście do jednego pliku. Można to zrobić na dwa sposoby. Pierwsza, starsza, polega na przekazaniu obu deskryptorów:

ls -l /root/ >ls-error.log 2>&1

Najpierw dane wyjściowe polecenia ls zostaną wysłane do pliku ls-error.log przy użyciu pierwszego znaku przekierowania. Ponadto wszystkie błędy zostaną przesłane do tego samego pliku. Druga metoda jest prostsza:

ls -l /root/ &> ls-error.log

Możesz także użyć dołączania zamiast zastępowania:

ls -l /root/ &>> ls-error.log

standardowe wejście z pliku

Większość programów, z wyjątkiem usług, otrzymuje dane do swojej pracy przez standardowe wejście. Domyślnie wejście standardowe wymaga wprowadzenia danych z klawiatury. Ale możesz zmusić program do odczytania danych z pliku z instrukcją "<" :

kot

Możesz także natychmiast przekierować dane wyjściowe do pliku. Na przykład zmieńmy kolejność na liście:

sortować sortowanie danych wyjściowych

W ten sposób przekierowujemy dane wejściowe i wyjściowe systemu Linux w jednym poleceniu.

Korzystanie z tuneli

Możesz pracować nie tylko z plikami, ale także przekierować dane wyjściowe jednego polecenia jako dane wejściowe do innego. Jest to bardzo przydatne w przypadku skomplikowanych operacji. Na przykład wydrukujmy pięć ostatnio zmodyfikowanych plików:

ls -lt | głowa -n 5

Za pomocą narzędzia xargs można łączyć polecenia w taki sposób, aby standardowe dane wejściowe były przekazywane jako parametry. Na przykład skopiujmy jeden plik do kilku folderów:

test echa/tmp/ | xargs -n 1 cp -v plik testowy.sh

Tutaj opcja -n 1 określa, że ​​tylko jeden parametr powinien być zastąpiony jednym poleceniem, a opcja -v w cp pozwala na wydrukowanie szczegółowych informacji o ruchach. Innym poleceniem przydatnym w takich przypadkach jest tee. Odczytuje dane ze standardowego wejścia i zapisuje na standardowe wyjście lub do plików. Na przykład:

echo "Tee test" | plik tee1

W połączeniu z innymi poleceniami wszystko to można wykorzystać do tworzenia złożonych instrukcji z kilku poleceń.

wnioski

W tym artykule omówiliśmy podstawy przekierowania strumienia we/wy w systemie Linux. Teraz wiesz, jak przekierować dane wyjściowe do pliku linux lub dane wyjściowe z pliku. Jest to bardzo proste i wygodne. Jeśli masz jakieś pytania, zadaj je w komentarzach!

Podczas gdy normalnie, jak wspomniano, programowe wejścia/wyjścia są powiązane ze standardowymi strumieniami, w powłoce dostępne są specjalne narzędzia do przekierowywania wejścia/wyjścia.

5.5.1 Operatorzy >,< и >>

Symbole „ są używane do wskazania przekierowania. > ", "< " I " >> „Najczęstszym zastosowaniem jest przekierowanie wyjścia polecenia do pliku. Oto odpowiedni przykład:

$ ls -l > /home/jim/dir.txt

To polecenie zapisze listę plików i podkatalogów katalogu, który był aktualny w momencie wykonania polecenia w pliku /home/jim/dir.txt ls; jednocześnie, jeśli określony plik nie istniał, zostanie utworzony; jeśli istniał, zostanie nadpisany; jeśli chcesz, aby dane wyjściowe polecenia były dołączane na końcu istniejącego pliku, zamiast symbolu > używać >> . W tym przypadku obecność spacji przed lub po znakach > Lub >> jest nieistotne i służy wyłącznie wygodzie użytkownika.

Możesz skierować dane wyjściowe nie tylko do pliku, ale także do wejścia innego polecenia lub do urządzenia (takiego jak drukarka). Na przykład, aby policzyć liczbę słów w pliku /home/jim/report.txt, możesz użyć następującego polecenia:

$ cat /home/jim/report.txt > wc -w

i wydrukować plik - polecenie:

$ cat /home/jim/report.txt > lpr

Jak widać, operator > służy do przekierowania strumienia wyjściowego. W stosunku do strumienia wejściowego podobną funkcję pełni operator < . Powyższe przykładowe polecenie zliczania liczby słów w określonym pliku można przepisać w następujący sposób (zwróć uwagę na brak polecenia kot):

$ wc -w< /home/jim/report.txt

Ten typ przekierowania jest często używany w różnych skryptach dla poleceń, które normalnie akceptują (lub oczekują danych wejściowych) z klawiatury. W skrypcie, który automatyzuje niektóre rutynowe operacje, możesz przekazać poleceniu niezbędne informacje z pliku zawierającego informacje, które należy wprowadzić, aby wykonać to polecenie.

Ponieważ symbole < , > I >> działać na standardowych strumieniach, można ich używać nie tylko w zwykły sposób, jak to zwykle się robi, ale także w nieco inny sposób. Tak więc następujące polecenia są równoważne:

$ kot > plik

$kot> plik

$ > plik cat

$ > plik cat

Jednak sam (bez żadnego polecenia, dla którego zdefiniowano standardowe strumienie) nie można użyć znaku przekierowania, więc nie można na przykład wpisać w wierszu poleceń

$ plik1 > plik2

dostać kopię jakiegoś pliku. Nie umniejsza to jednak wartości tego mechanizmu, ponieważ dla każdego polecenia zdefiniowane są standardowe strumienie. W takim przypadku możesz przekierować nie tylko standardowe wejście i wyjście, ale także inne strumienie. W tym celu przed symbolem przekierowania należy podać numer strumienia, który ma zostać przekierowany. Standardowe wejście stdin to numer 0, standardowe wyjście stdout to numer 1, standardowy strumień komunikatów o błędach stderr to numer 2. Oznacza to, że pełny format polecenia przekierowania to (pamiętaj, że spacje obok > nie są wymagane):

polecenie N > M

Gdzie N I M— numery strumieni standardowych (0,1,2) lub nazwy plików. Użycie symboli w niektórych przypadkach < , > I >> bez podania numeru kanału lub nazwy pliku jest możliwe tylko dlatego, że zamiast brakującego numeru domyślnie podstawiana jest 1, czyli standardowe wyjście. Tak, operatora > bez numeru jest interpretowane jako 1 > .

Oprócz prostego przekierowania standardowych strumieni, istnieje również możliwość nie tylko przekierowania strumienia do jednego lub drugiego kanału, ale także wykonania kopii zawartości standardowego strumienia. Jest do tego specjalny znak. & , który jest umieszczony przed numerem kanału, na który strumień jest przekierowywany:

polecenie N > &M

To polecenie oznacza, że ​​wyjście kanału o numerze N jest wysyłany zarówno na standardowe wyjście, jak i jest duplikowany w potoku z numerem M. Na przykład, aby komunikaty o błędach zostały zduplikowane na standardowym wyjściu, należy wydać polecenie 2>&1, chwila 1>&2 duplikuje stdout do stderr. Ta funkcja jest szczególnie przydatna podczas przekierowywania danych wyjściowych do pliku, ponieważ wtedy oboje widzimy komunikaty na ekranie i zapisujemy je w pliku.

5.5.2 Operatora |

Szczególnym wariantem przekierowania wyjścia jest organizacja kanału programowego (nazywanego czasem potokiem lub potokiem). Aby to zrobić, dwa lub więcej poleceń, tak aby dane wyjściowe poprzedniego służyły jako dane wejściowe dla następnego, są połączone (lub rozdzielone, jeśli wolisz) znakiem pionowej kreski - „|”. W tym przypadku standardowy strumień wyjściowy polecenia znajduje się po lewej stronie symbolu | , jest kierowane na standardowe wejście programu znajdujące się po prawej stronie znaku | . Na przykład:

$ cat mój plik | grep Linux | wc -l

Ta linia oznacza, że ​​dane wyjściowe polecenia kot, czyli tekst z pliku myfile, zostanie skierowany na wejście polecenia grep, który wybierze tylko wiersze zawierające słowo „Linux”. wyjście polecenia grep zostanie z kolei przekierowany na wejście polecenia wc -l, która policzy liczbę takich wierszy.

Potoki programowe służą do łączenia kilku małych programów, z których każdy wykonuje tylko określone przekształcenia na swoim strumieniu wejściowym, w celu utworzenia uogólnionego polecenia, którego wynikiem będzie bardziej złożona transformacja.

Należy zauważyć, że powłoka jednocześnie wywołuje wszystkie polecenia zawarte w potoku, uruchamiając oddzielną instancję powłoki dla każdego z poleceń, tak że gdy tylko pierwszy program zacznie wydawać coś do swojego strumienia wyjściowego, następne polecenie zaczyna go przetwarzać. W ten sam sposób każde kolejne polecenie wykonuje swoją operację, czekając na dane z poprzedniego polecenia i podając jego wyniki jako dane wejściowe do następnego. Jeśli chcesz, aby jedno polecenie zakończyło się całkowicie przed rozpoczęciem wykonywania następnego, możesz użyć go w tym samym wierszu, co symbolu potoku | i średnik ; . Przed każdym średnikiem powłoka zatrzyma się i zaczeka, aż wszystkie poprzednie polecenia zawarte w potoku zakończą wykonywanie.

Status wyjścia (wartość logiczna zwracana po zakończeniu programu) z potoku jest taki sam, jak status wyjścia zwrócony przez ostatnie polecenie w potoku. Przed pierwszym poleceniem potoku można umieścić symbol „!”, wówczas status wyjścia z potoku będzie logiczną negacją statusu wyjścia z ostatniego polecenia. Powłoka czeka na zakończenie wszystkich poleceń potoku przed ustawieniem wartości zwracanej.

5.5.3 Filtry

Ostatni z powyższych przykładów (za pomocą polecenia grep) można wykorzystać do zilustrowania innego ważnego pojęcia, a mianowicie programu filtrującego. Filtry to polecenia (lub programy), które przyjmują strumień danych wejściowych, wykonują na nim pewne przekształcenia i wyprowadzają wynik na standardowe wyjście (skąd może zostać przekierowany w inne miejsce na żądanie użytkownika). Polecenia filtrowania obejmują polecenia już wymienione powyżej. kot, więcej, mniej, wc, cmp, różnica, a także następujące polecenia.

Tabela 5.1. Filtruj polecenia

Zespół

Krótki opis

grep, fgrep, egrep

Wyszukaj w pliku wejściowym lub standardowym wejściu wiersze zawierające określony wzorzec i wypisz je na standardowe wyjście

Zastępuje w strumieniu wejściowym wszystkie wystąpienia znaków wymienionych na określonej liście odpowiednimi znakami z drugiej określonej listy

kom

Porównuje dwa pliki wiersz po wierszu i wypisuje 3 kolumny na standardowe wyjście: jeden zawiera wiersze występujące tylko w 1 pliku, drugi zawiera wiersze występujące tylko w drugim pliku, a trzeci zawiera wiersze występujące w obu plikach

Formatuje plik tekstowy lub zawartość standardowego wejścia do drukowania.

sed

Edytor liniowy służący do wykonywania pewnych przekształceń strumienia danych wejściowych (pobranych z pliku lub ze standardowego wejścia)

Specjalnym filtrem jest polecenie trójnik, który „podwaja” strumień wejściowy, kierując go z jednej strony na standardowe wyjście, az drugiej do pliku (którego nazwę należy podać). Łatwo zauważyć, że w swoim działaniu komenda trójnik podobny do operatora przekierowania 1>&plik.

Możliwości filtrów można znacznie rozszerzyć poprzez zastosowanie wyrażeń regularnych, które pozwalają np. uporządkować wyszukiwanie według różnych, często bardzo skomplikowanych, wzorców.

O przekierowaniu i filtrach można by wiele powiedzieć. Ale ten materiał można znaleźć w większości książek o systemach UNIX i Linux, takich jak Petersen [A1.4] i Kelly-Bootle [A1.8] . Dlatego ograniczamy się do tego, co zostało powiedziane, i przystępujemy do rozważenia tak zwanego środowiska lub środowiska stworzonego przez powłokę.

V. Kostromin (kos w rus-linux dot net) - 5,5. Przekierowanie I/O, kanały i filtry

System I/O w systemie LINUX.

W systemie I/O wszystkie urządzenia zewnętrzne są traktowane jako pliki, na których dozwolone są normalne operacje na plikach. Oczywiście istnieją również sterowniki urządzeń, ale interfejs z nimi jest przeznaczony dla użytkownika jako wywołanie specjalnego pliku. Pliki specjalne służą do ujednolicenia systemu I/O.

Z każdym podłączonym urządzeniem (terminalem, dyskami, drukarką itp.) jest powiązany co najmniej jeden specjalny plik. Większość tych specjalnych plików jest przechowywana w katalogu /dev:
$ cd/dev
$ls -l
panel kontrolny systemu na podeszwie
fragmenty dsk na dysku
dyskietka fd0 1
pamięć mem
drukarka lp
lp0 port równoległy 0
. . .
część root na dysku dla głównego systemu plików
zamień część wymiany
alternatywna nazwa konsoli syscon
systty to inna nazwa konsoli systemowej
katalog terminów dla terminali
port szeregowy ttyS0 0 (COM1)
. . .

Kiedy program zapisuje do takiego specjalnego pliku, system operacyjny przechwytuje je i wysyła do urządzenia, takiego jak drukarka). Podczas odczytywania danych z tego typu pliku, w rzeczywistości są one odbierane z urządzenia takiego jak dysk. Program nie powinien uwzględniać specyfiki urządzenia I / O. Służą do tego specjalne pliki (sterowniki), które pełnią rolę interfejsu między komponentami jądra systemu operacyjnego a aplikacjami ogólnego przeznaczenia.

System wykrywa różnicę między zwykłym plikiem a plikiem specjalnym dopiero po przeanalizowaniu odpowiedniego i-węzła, do którego odwołuje się pozycja katalogu.
I-węzeł specjalnego pliku zawiera informacje o klasie, typie i numerze urządzenia. Klasa urządzenia definiuje zarówno urządzenia znak po znaku, jak i blok po bloku. Przykładem urządzenia z wymianą znak po znaku jest klawiatura. Pliki specjalne, które zapewniają komunikację z urządzeniami tego typu, nazywane są zorientowanymi na bajty. Urządzenia blokowe charakteryzują się wymianą dużych bloków informacji, co przyspiesza wymianę i czyni ją bardziej wydajną. Wszystkie urządzenia dyskowe obsługują wymianę bloków, a obsługujące je specjalne pliki nazywane są zorientowanymi na bloki. Pliki specjalne nie zawierają żadnych informacji o znakach, więc ich długość nie jest wskazana na liście katalogów.

Typ i numer urządzenia są również głównymi cechami pilników specjalnych (numery główne i pomocnicze odpowiedniego urządzenia są umieszczane w polu długości). Pierwsza z nich określa typ urządzenia, druga - identyfikuje je wśród podobnych urządzeń. System operacyjny może jednocześnie obsługiwać kilkadziesiąt, a nawet setki terminali. Każdy z nich musi mieć swój własny specjalny plik, więc posiadanie głównego i dodatkowe numery pozwala na ustalenie wymaganej korespondencji między urządzeniem a takim plikiem.

Na jednym dysku można utworzyć wiele systemów plików. Niektóre systemy używają jednego systemu plików na dysk, podczas gdy inne używają kilku. Nowy system plików można utworzyć za pomocą komendy mkfs (make file system). Na przykład wyrażenie # /sbin/mkfs /dev/dsk/fl1 512 oznacza: utwórz na dyskietce b: rozmiar 512 bloków.

Opcjonalnie można ustawić rozmiar systemu plików w blokach oraz liczbę i-węzłów (tj. maksymalną liczbę plików, które mogą być przechowywane w systemie plików). Domyślnie liczba i-węzłów jest równa liczbie bloków podzielonej przez cztery. Maksymalna liczba i-węzłów w pojedynczym systemie plików to 65 000. Jeśli z jakiegoś powodu potrzebujesz więcej niż 65 000 i-węzłów na dysku, musisz utworzyć dwa lub więcej systemy plików na tym dysku.

Dowolny system plików można dołączyć (zamontować) do wspólnego drzewa katalogów w dowolnym miejscu w nim. Na przykład katalog / jest katalogiem głównym systemu, ponadto jest podstawą systemu plików, który jest zawsze montowany. Katalog /usr1 znajduje się w katalogu /, ale w tym przypadku jest to odrębny system plików od głównego systemu plików, ponieważ wszystkie znajdujące się w nim pliki znajdują się na osobnej części dysku, a nawet na osobnym dysku. System plików /usr1 jest zamontowanym systemem plików — zakorzenionym w punkcie, w którym w ogólnej hierarchii istnieje katalog /usr1 (rysunki 1 i 2).

Ryż. 1. System plików przed
montowanie /dev/dsk/os1

Ryż. 2. System plików po
zamontuj /dev/dsk/os1 jako /usr/

Polecenie /sbin/mount służy do montowania systemu plików. To polecenie pozwala umieścić dany system plików w dowolnym miejscu w istniejącej strukturze katalogów:
#/sbin/mount/dev/dsk/osl/usr1 montuje /dev/dsk/osl na /usr1
#/sbin/mount/dev/dsk/flt/a montuje /dev/dsk/flt na /a

Jeśli chcesz zamontować system plików na dyskach, które muszą być chronione przed zapisem, aby system był tylko do odczytu, musisz dodać opcję -r do polecenia /sbin/mount.
Katalog, do którego podłączony jest system plików, musi być obecnie pusty, ponieważ jego zawartość nie będzie dostępna podczas montowania systemu plików.

Aby uzyskać informacje o systemach plików, które są zamontowane, na przykład w systemie LINUX, można użyć polecenia /sbin/mount bez argumentów (rysunek 3).

Ryż. 3.

To polecenie wyświetla katalog, w którym system plików został zamontowany (np. usrl), urządzenie /dev, na którym się znajduje, oraz godzinę i datę zamontowania. Polecenie /sbin/umount służy do odmontowania systemu plików, co jest przeciwieństwem polecenia mount. Uwalnia system plików i jakby usuwa go z całej struktury katalogów, dzięki czemu wszystkie jego własne pliki i katalogi są niedostępne:
# /sbin/umontuj /b
# /sbin/umount /dev/dsk/0s2

Nie można odmontować głównego systemu plików. Ponadto polecenie umount nie powiedzie się, jeśli ktoś używa pliku z odmontowywanego systemu plików (może to być nawet tak proste, jak użytkownik znajdujący się w jednym z katalogów odmontowywanego systemu plików).

W poleceniach mount i umount użytkownik używa skrótu fizycznego urządzenia dyskowego.
W systemie LINUX napędy dysków mają osobliwe oznaczenia. W systemie LINUX użytkownik nigdy nie staje przed problemem dokładnego określenia fizycznego urządzenia, na którym znajdują się informacje. W systemie LINUX dowolna liczba urządzeń zewnętrznych może być bardzo duża, więc użytkownik ma do czynienia tylko z nazwą katalogu, w którym znajdują się potrzebne mu pliki. Wszystkie systemy plików są montowane raz, zwykle podczas uruchamiania systemu. Systemy plików można również montować w niektórych katalogach z komputerów zdalnych.

W przypadku urządzeń fizycznych LINUX ma katalogi dsk i rdsk, które zawierają pliki odpowiadające urządzeniom dyskowym. Zwykle nazwy plików w tych katalogach są takie same, a jedyną różnicą między nimi jest to, że katalog rdsk zawiera urządzenia dyskowe ze specjalnym dostępem (surowe), których niektóre urządzenia systemowe używają do szybszego dostępu do dysku. Jeden typowy katalog dsk zawiera następujące urządzenia:
$ 1s /dev/dsk
0s0 1s0 c0t0d0s0 c0tld0s0 f0 f05q f13dt fld8d
0sl 1sl c0t0d0sl c0tld0sl f03d f05qt f13h fld8dt
0s2 1s2 c0t0d0s2 c0tld0s2 f03dt f0d8d f13ht fld8t
. . .
$

W systemie LINUX urządzenia dyskowe są logicznie podzielone na partycje, podobnie jak partycje zdefiniowane w tabeli partycji MasterBoot MS DOS. Pliki 0s1, 0s2, 0s3 itd. odpowiadają sekcjom pierwsza, druga, trzecia itd. dysku numer 0. Pliki 1s0, 1sl, 1s2 itd. odpowiadają sekcjom pierwsza, druga, trzecia itd. dysku numer 1. Jeśli system ma więcej dysków, partycje będą ponumerowane ns0, nsl itd. dla każdego dysku o numerze n.

Systemy z wieloma dyskami używają następującego systemu numeracji:
z sekcją dysku kontrolera d

gdzie kontroler - numer kontrolera dysku; dysk - numer dysku; sekcja - numer sekcji dysku.
Tak więc 0s0 jest zwykle odpowiednikiem c0t0d0s0, a 0sl to c0t0d0sl, a trzyznakowe nazwy partycji to tylko skrót kontrolera dysku o numerze 0.

Pliki, których nazwy zaczynają się od f definiują różne rodzaje dyskietek. Katalog rmt zawiera pliki na urządzeniach taśmowych:
$ 1s /dev/rmt
c0s0 cls0 c3s0 ntape ntapel taśma taśma

Pliki c0s0, cls0, c2s0 i c3s0 definiują cztery urządzenia do przechowywania kaset magnetofonowych. Pliki taśma i taśma definiują dwubębnowe magnetyczne urządzenia pamięci masowej. Pliki, których nazwy zaczynają się na literę n, odnoszą się do tych samych urządzeń, tylko taśma nie jest przewijana po użyciu, podczas gdy użycie innych plików powoduje, że taśma jest przewijana po zakończeniu programu, który z niej korzysta.

W niektórych systemach pliki te mają różne nazwy, ale zawsze znajdują się w /dev, a słownik, który zwykle jest dostarczany z systemem, zawiera szczegółowy opis urządzeń i powiązanych z nimi plików.

System plików extX wykorzystuje buforowanie danych dla operacji we/wy. Podczas odczytu bloku informacji jądro wysyła żądanie operacji I/O do kilku sąsiednich bloków. Takie operacje znacznie przyspieszają pobieranie danych podczas sekwencyjnego odczytu plików. Podczas zapisywania danych do pliku system plików extX, zapisując nowy blok, umieszcza z wyprzedzeniem do 8 sąsiednich bloków obok siebie. Metoda ta pozwala na umieszczanie plików w ciągłych blokach, co przyspiesza ich odczyt i umożliwia osiągnięcie wysokiej wydajności systemu.

mob_info