Jak zrobić Xterminal lub prosty terminal tekstowy?

Poniższy dokument opisuje jak w dosyć prosty sposób z komputera klasy i386dx, 486 zrobić całkiem przzwoity X-terminal lub zwykły terminal tekstowy. W zasadzie wszystko zostało już opisane, mój dokument to może "inne" spojrzenie na ten temat - rozwinięcie (uzupełnienie) już istniejących dokumentów:

  • Diskless-HOWTO (po angielsku)
  • Diskless.pl.txt (polskie tłumaczenie)
  • "Stacja robocza z głównym systemem plików z sieci"
  • "Jak założyć główny system plików przez NFS"

    dokumenty są dostępne w polskim tłumaczeniu mini-HOWTO:

  • NFS-Root-Client.pl.txt
  • NFS-Root.pl.txt

    Polecam również przeczytanie dokumentacji z kernela, czyli:
  • nfsroot.txt

    Jeżeli powyższe dokumenty nie wystarczyły Ci, to zapraszam do przeczytania mojego opisu: ;)



    Na początku może spróbuję wyjaśnic co to jest ów Terminal. W skórcie można powiedzieć, że jest to komputer spełniający rolę końcówki sieciowej. Osoba pracująca przy takim terminalu korzysta z zasobów serwera. Czyli wszelkie programy są uruchamiane na serwerze. Uruchomione programy korzystają z procesora, RAMu, dysków serwera. Terminal służy jedynie do komunikacji użytkownika z serwerem. Rozwiązanie takie ma sporo zalet. Terminal nie musi być wyposażony w dysk twardy, może posiadać "słaby" procesor i nie musi posiadać sporej ilości pamięci operacyjnej (minimum 4MB dla trybu tekstowego, 8-16MB dla trybu graficznego). Do budowy takiego Xterminala może oczywiście posłużyć stary PC, w przyadku chęci korzystania z trybu graficznego warto wyposażyć go w kartę graficzną zdolną do wyświetlania większej liczby kolory (więcej niż 256) i pracy w wyższych rozdzielczościach.

    Jak działać będzie taki (X)termnial ? Po starcie kernela, terminal uzyska przy pomocy bootp swój adres IP, oraz adres routera i inne informacje dotyczące sieci. "podmountowanie" za pomocą NFS mini root filesytemu, a następnie - zależnie od konfiguracji - start Xów (X -query serwer) lub też np. ssh -l user serwer.

    Pierwszym (najprostszym) etapem jest skonfigurwanie terminala (klienta).


    Konfiguracja klienta

    Kernel dla klienta:

    Konfiguracja kernela dla takiego terminala powinna w sobie zawierać wpsarcie dla TCP/IP, wsparcie dla karty sieciowej (takiej jaka będzie znajdować się w naszym terminalu). Dodatkowo warto pamiętać o wkompilowaniu wsparcia dla NFS tudzież dla BOOTP i opcjonalnie dla RARP.

    Opcje, o których trzeba pamiętać konfigrując kernel dla klienta (terminal):

    
    Networking options  --->
    [*] IP: kernel level autoconfiguration
    [*]       BOOTP support (NEW)                          
    [*]       RARP support (NEW)                            
    
    Filesystems  --->
    Network File Systems  --->
    <*> NFS filesystem support 
    [*]    Root file system on NFS (NEW)
    
    
    Tak skompilowany kernel, może być załadowany na bardzo wiele sposobów.
    Jednym z nich może być użycie dosowego pogramu
    loadlin.exe
    Start loadlina, może odbywać się np. z systemowej dyskietki DOS
    Wpisujemy do autoexec.bat następującą linie:
    
    loadlin zimage nfsroot=192.0.0.2:/image
    Gdzie 192.0.0.2 to adres serwera, na którym udostępniony jest za pomocą NFS katalog /image. Innym sposobem "bootowania" terminala może być użycie LILO (LInux LOader) Przygotowanie dyskietki zostało opisane w nfsroot.txt oraz w NFS-Root.pl.txt Jeszcze innym sposobem jest użycie bootromów, oraz usługi TFTP (tej metody jednak nie opisuję). Mając skonfigurwany Xterminal, możemy przystąpić do konfigracji serwera:

    Konfiguracja Serwera

  • BOOTP (Bootstrap Protocol)

    Usługa będzie nam służyła do automagicznego nadawania adresów IP terminalom. Każdej karcie sieciowej będziemy przyporządkowywać zawsze ten sam numer IP, inaczej mówiąc adresowi sprzętowemu karty siecowej (MAC) jest przypisywany numer IP (zawsze ten sam)

    Potrzebny będzie nam pakiet bootp. Usługę boot odpalamy z inetd: Fragment pliku /etc/inetd.conf bootps dgram udp wait root /usr/sbin/tcpd bootpd /etc/bootptab Plikiem konfigracyjnym dla usługi bootp jest plik /etc/bootptab Poniżej przedtawiam przykładową konfigurację:
    .config:hd=/tmp:bf=null:\
            :ds=195.205.208.1:\
            :sm=255.255.255.0:\
            :gw=195.205.208.1:\
            :cs=195.205.208.1,195.205.208.1:\
            :ht=ethernet:\
            :to=-7200:
    test:ha=0000C03D9567:ip=195.205.208.235:tc=.config
    lt:ha=0000C0FCAD67:ip=195.205.208.234:tc=.config
    
    Oznaczenia:
    sm = Host subnet mask
    gw = Gateway address list
    cs = Cookie server address list
    ds = Domain name server address list
    ht = Host hardware type
    to = Time offset in seconds from UTC
    ha = Host hardware address
    
    Szczegółowe informacje na temat konfigracji bootp można znaleźć oczywiście w manualu do bootp, a szczególności w man bootptab Aby przetestować działanie bootp, możemy użyć programu bootptest

    Mająć skonfigurwane BOOTP, możemy przystąpić do konfiguracji NFS

  • NFS

    Przede wszystkim musimy zaopatrzyć się w pakiet nfs-server bądź też w knfsd (RedHat), który umożliwi odpalenie NFS serwera. Musimy pamiętać również o odpowiednim skonfigurowaniu kernela, czyli:

    Filesystems  ---> 
    Network File Systems  --->
    <*> NFS filesystem support
    [ ]    Root file system on NFS
    <*> NFS server support 
    
  • Udostępnienie mini root filesystemu Plikiem konfiguracyjnym od NFS serwera jest /etc/exports. Określamy w nim co, komu i na jakich zasadach ma być udostępnione. Przykładowo plik taki może wyglądać następująco:

    /images    *.wsisiz.edu.pl(r,all_squash)
    

    Wszystkim maszynom z domeny wsisiz.edu.pl jest udostępniany katalog /images w trybie odczytu. W naszym wypadku klient (terminal) nie ma potrzeby mieć możliwość zapisywania czegokolwiek w tym katalogu! ;) Więcej informacji o opcjach pliku exports w man exports ;)

  • Przygotowanie mini root filesystemu

    Tworzymy katalog, w którym umiejscowimy nasz mini root filesystem. Np. mkdir /images następnie tworzymy w nim katalog /etc /usr/ bin /var /proc /tmp czyli wszystkie te, które znajdują sie normalnie w root filesystemie. Następnie przekopiowujemy tylko to co niezbędne do tych katalogów. Czyli do /bin wystarczy przekopiować binaria takie jak: bash (ash),init mount,umount,ls,ld i XF86_XX (czyli X-serwery). Oczywiście to co znajdzie się w /bin zależy od inwidualny potrzeb. Dosyć istotną sprawą jest przekopiowanie odpowiednich bibliotek do katalou /lib. (cp -a /lib/ld.* /lib/libc.* /lib/libcursses.* /images). Przdatne może tu się okozać polecenie ldd, które pokazuje z czym są zlinkowane poszczególne binaria.

    np.:
    [lukasz@lt ]$ ldd /bin/bash
            libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000)
            libdl.so.2 => /lib/libdl.so.2 (0x4001e000)
            libc.so.6 => /lib/libc.so.6 (0x40021000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    
    

    Do katalogu /dev przekopiowujemy wszystkie te urządzenia, które będa używane w naszym terminalu (fd0). Jeżeli nie wiemy, które będa potrzebe, możemy przekopiować cały katalog /dev/ (np. cp -a /dev/ /images/) W katalogu /images/etc powinno się znaleźć pliki:

    fstat, group, host,conf,inittab,ioctl.save,nsswitch.conf,passwd,profile protocols,services, rgb.txt, resolv.conf, ld.so.cache

    Zapewnią one poprawny start maszyny oraz poprawne działanie binariów. Jeżeli do /bin przekopiowaliśmy jakiś program, który korzysta standardowo z dodatkowych plików z /etc powinniśmy je również przekopiować do katalog /etc/ naszego mini root-filesystemu. (np. w przyadku ssh /etc/ssh_config itp.)

    Poniżej przedstawiam, jak mogą wyglądać przykładowe pliki z /etc
    Plik /etc/passwd
    root:x:0:0:root:/:/bin/bash
    
    Plik /etc/group
    root::0:root
    
    Plik /etc/host.conf
    order hosts,bind
    multi on
    
    Plik /etc/mtab dobrze jest zrobić linkiem do /proc/mounts, czyli:
    mtab -> /proc/mounts
    
    Plik /etc/inittab (dosyć istotny plik!)
    
    id:5:initdefault:
    x:1235:respawn:/bin/startx
    
    
    Jak widać w pliku inittab domyślnym runlevelem jest 5 (tryb graficzny) i zaraz po uruchomieniu inita (pierwszy proces, który uruchamia się po załadowaniu kerenela) uruchamiany jest pogram startx. (Startowanie Xów) W naszym wpyadku startx może wyglądać tak:
    #!/bin/ash
    mount -n /proc
    XF86_S3 -query 192.0.0.2 -nolock
    

    Otóż jak widać startx mountuje "filesystem" /proc (opcja -n przy mount mówi, aby nie dokonywać zmian w /etc/mtab) i startuje X-serwer (przykładowo serwer dla kart S3) z opcja -nolock, która nie tworzy w katalogu /tmp żadnych plików "lockujących" opcja -query 192.0.0.2 mówi Xserwerowi aby podłączył się oczywiście do naszego serwera o numerze IP 192.0.0.2

    Idealną sytuacją jest sytuacją kiedy wszystkie nasze terminale są wyposażone w identyczne komponenty. Wtedy wystarczy jeden plik XF86Config, jeden startx itp. Niestety może się okazać, że mamy różne karty graficzne w poszczególnych terminalach, co wtedy? Możemy stworzyć osobny katalog, który udstępnimy po NFS, a nim osobną, inną konfigurację. W przyadadku Xów można tworzyć osobne pliki XF86Config. Np. XF86Config.192.0.0.20, XF86Config.192.0.0.30 jak widać są to osobne configi dla osobnych komputerów. W tym wypadku X serwer autmoatycznie wczyta odpowiednią konfiguracje (plik) - maszyna o numerze IP 192.0.0.20 wczyta XF86Config.192.0.0.20 itp.

    Poniżej przedstawiam wynik komend ls -R i ls -all -R wykonanych na serwerze, z któego jest udostepniany taki file-system:

  • ls -R.txt
  • ls -all -R.txt
    A także udostępniam katalog /etc (oczywiście ten dla mini root-filesystemu) ;)
  • Katalog /etc
    W powyższym opisie starałem się pokazać konfigurację od strony praktycznej. Domyślam się, że nie wyczerpałem tematu. Wszelkie uwagi dotyczące powyższego dokumentu mile widziane. ;)
    Łukasz Trąbiński 15.01.2000