Основы взаимодействия с ОС

В рамках данной лабораторной работы предлагается получить опыт работы с широким классом «команднострочных» программ — на примере включенных в варианты системы GNU/Linux, в частности — Debian GNU/Linux. Предполагается, однако, что задания будут большей частью выполнимы в рамках любой системы, реализующей стандарт IEEE Std 1003.1-2017 (POSIX.1-2017) — при условии, возможно, установки на такую систему соответствующих дополнительных программ.

Номинальный вклад этой работы в оценку — 20 единиц.

Стандартный ввод-вывод

  1. Наиболее простым элементом команднострочного интерфейса являются, по-видимому, команды-источники, формирующие некоторый вывод не требуя ввода. В зависимости от конфигурации используемой системы, в ней могут быть доступны, в частности, следующие такие команды.

    • alias
    • apg
    • arch
    • ascii
    • atq
    • cal
    • calendar
    • date
    • ddate
    • df
    • dir
    • du
    • echo
    • eval
    • export
    • faillog
    • false
    • fc-cat
    • fc-list
    • filan
    • find
    • findmnt
    • free
    • from
    • groups
    • help
    • history
    • hostid
    • hostname
    • id
    • /sbin/ifconfig
    • infocmp
    • ip link
    • ip address
    • ip addrlabel
    • ip route
    • ip rule
    • ip neigh
    • ip ntable
    • ip tunnel
    • ip tuntap
    • ip maddress
    • ip mroute
    • ip mrule
    • ip netns
    • ip tcp_metrics
    • ip token
    • ip netconf
    • ip vrf
    • ip sr
    • ipcs
    • jobs
    • last
    • lastb
    • lastlog
    • locale
    • logname
    • ls
    • lsattr
    • lsblk
    • lscpu
    • lsipc
    • lslocks
    • lslogins
    • lsmem
    • lsns
    • lsof
    • manpath
    • mcd
    • mcheck
    • mcookie
    • mdir
    • mesg
    • mlabel
    • mount
    • mtoolstest
    • ncal
    • netstat
    • nproc
    • panoinfo
    • pg_isready
    • pg_lsclusters
    • pinky
    • printenv
    • prlimit
    • procan
    • ps
    • pstree
    • pwd
    • readonly
    • resize
    • revpath
    • rpcinfo
    • set
    • shopt
    • showrgb
    • slabtop
    • sselp
    • stty
    • sync
    • time
    • times
    • toe
    • trap
    • tree
    • true
    • tty
    • type
    • typeset
    • ulimit
    • umask
    • uname
    • uptime
    • users
    • uuidgen
    • validateconf
    • vdir
    • vmstat
    • w
    • which
    • who
    • whoami
    • wmname
    • xdpyinfo
    • xdriinfo
    • xfsinfo
    • xgamma
    • xhost
    • xlsatoms
    • xlsclients
    • xlsfonts
    • xrandr
    • xrefresh
    • xvinfo

    Обратите внимание, что справочную информацию по большинству из этих команд можно получить (в случае системы Debian GNU/Linux) используя http://manpages.debian.org/.

    1. (1 ед.) Выполните какие-либо команды-источники. Сверившись, при необходимости, с документацией, объясните вывод трех успешно завершившихся из них. (Обратите внимание, что не все команды могут быть доступны на конкретной системе, или иметь смысл в конкретном контексте.)

      Пример: выполнение команды ps на Debian GNU/Linux.
      $ ps 
        PID TTY          TIME CMD
      12011 pts/7    00:00:00 ps
      32600 pts/7    00:00:08 -bash
      $ 
      
      Пример: выполнение команды ps на NetBSD.
      $ ps 
        PID TTY    STAT    TIME COMMAND
      10428 pts/13 Ss   0:00.07 -bash 
      17253 pts/13 O+   0:00.00 ps 
      $ 
      
    2. (1 ед.) Передавая выбранным командам аргументы командной строки, добейтесь предсказуемого изменения их вывода.

      Пример: выполнение команды ps с измененным набором выводимых полей.
      $ ps -o pid,lstart,args 
        PID                  STARTED COMMAND
      12063 Tue Apr  7 19:20:25 2020 ps -o pid,lstart,args
      32600 Tue Dec  3 04:57:32 2019 -bash
      $ 
      
  2. Далее рассмотрим команды-фильтры, получающие данные со стандартного ввода, определенным образом преобразующие их, и выводящие результат на стандартный вывод. В системе GNU/Linux обычно доступны по меньшей мере следующие такие команды.

    • base32
    • base64
    • cat
    • cksum
    • col
    • colcrt
    • colrm
    • column
    • hexdump
    • nl
    • od
    • rev
    • sha224sum
    • sha256sum
    • sha384sum
    • sha512sum
    • shuf
    • sort
    • tac
    • wc

    Обратите внимание, что ввод с клавиатуры по-умолчанию завершается вводом C-d — как это задается настройками терминала (tty-устройства системы.) Cf., e. g., (coreutils)stty invocation.

    1. (1 ед.) Изучите работу каких-либо команд-фильтров. Сверившись, при необходимости, с документацией, опишите преобразования, выполняемые тремя из них.

      Пример: декодирование данных Base64 фильтром base64.
      $ base64 -d 
      SGVsbG8sIHdvcmxkIQo=
      ^D
      Hello, world!
      $ 
      
    2. (2 ед.) Сформируйте из команд-источников и команд-фильтров три нетривиальных конвейера (вида: источник | фильтр) и опишите их работу. При необходимости используйте аргументы командной строки.

      Пример: выполнение команды ps с выделением концов строк символом $ фильтром cat.
      $ ps | cat -E 
        PID TTY          TIME CMD$
      12011 pts/7    00:00:00 ps$
      32600 pts/7    00:00:08 -bash$
      $ 
      
  3. (2 ед.) Ознакомьтесь с документацией на программы постраничного просмотра less, more и most. Сформируйтеe два конвейера вида источник | просмотрщик и два конвейера вида источник | фильтр | просмотрщик. Добавьте к команде просмотрщика какой-либо из найденных в документации аргументов («ключей») командной строки. Объясните результирующие изменения в поведении программы — или же отсутствие таковых.

    Пример: выполнение команды cal с выделением особых символом просмотрщиком less.
    $ cal | less -U 
         April 2020
    Su Mo Tu We Th Fr Sa
              1  2  3  4
     5  6 _^H _^H7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30
    
    (END)
    

Локаль

Изучите вывод команды locale.

  1. (1 ед.) Установив переменную окружения LC_MESSAGES, LC_NUMERIC или LC_TIME в некоторое новое (осмысленное) значение удостоверьтесь, что поведение двух команд-источников изменилось соответственно новому значению переменной.

    Некоторое представление о допустимых значениях может дать статья List of ISO 639-1 codes англоязычной Википедии и, в случае GNU/Linux, вывод команды ls -- /usr/lib/locale.

    Обратите внимание, что значение переменной LC_ALL имеет преимущество перед всеми прочими переменными локали. При наличии переменной LC_ALL в окружении ее имеет смысл удалить (export -n, или же unset.)

    Пример: выполнение команды cal с использованием чешской чешской (sic) локали.
    $ export LC_TIME=cs_CZ.utf8 
    $ cal 
         Dubna 2020       
    Ne Po Út St Čt Pá So  
              1  2  3  4  
     5  6  7  8  9 10 11  
    12 13 14 15 16 17 18  
    19 20 21 22 23 24 25  
    26 27 28 29 30        
                          
    $ 
    
  2. (1 ед.) Подавите локализацию установив LC_ALL=C. Проверьте, что какая-либо из прежде локализованных команд-источников формирует вывод строго в кодировке ASCII. Удалив переменную из окружения удостоверьтесь, что локализация восстановлена.

  3. (2 ед.) Измените значение категории LC_CTYPE. Продемонстрируйте соответствующее изменение поведения какой-либо программы.

Файловая система

В зависимости от контекста, под файловой системой понимают или совокупность всех файловых объектов («файлов»), доступных конкретному процессу в конкретный момент времени; или же конкретный способ организации данных, позволяющий интерпретировать эти данные как набор файлов («тип файловой системы»; например: Btrfs, Ext2, FAT, SquashFS, etc.); или же реализацию этого способа на конкретном носителе. В данном разделе мы рассмотрим работу файловой системы в первом смысле.

  1. (1 ед.) Выполните три командных строки вида источник > файл && фильтр < файл. Поясните, в чем отличие от использования конвейера.

  2. (1 ед.) Многие из команд-фильтров допускают указание аргументом командной строки имени файла; в этом случае, источником данных для обработки становится указанный файл (вместо стандартного ввода.) Продемонстрируйте работу двух из ранее изученных фильров в таком режиме.

    Пример: использование фильтра cat для выделения концов строк файла /etc/issue.net символом $.
    $ cat -E -- /etc/issue.net 
    Debian GNU/Linux 10$
    $ 
    
  3. Стандарт IEEE Std 1003.1-2017 (POSIX.1-2017) предполагает иерархическую организацию файловой системы: файлы особого типа — директории — содержат записи, связывающие имена файлов с собственно файлами — включая другие (вложенные) директории. Директорию, являющуюся корнем результирующего дерева, называют корневой.

    Изучите следующие команды.

    • cd
    • mkdir
    • pwd
    • rmdir
    • touch
    • tree
    1. (1 ед.) Создайте пять новых директорий, сформировав из них дерево глубиной 3. Отобразите его командой tree.

      Пример: создание дерева директорий и его отображение командой tree.
      $ mkdir -p -- donald/huey/dewey/louie donald/mickey
      $ tree -- donald 
      donald
      ├── huey
      │   └── dewey
      │       └── louie
      └── mickey
      
      4 directories
      $ 
      
    2. (1 ед.) Создайте где-либо в дереве новые пустые обычные файлы с именами .utwo (например: touch -- директория/.utwo) и kones. Сравните вывод команд tree -F и tree -a для данного дерева.

  4. Еще одним типом файлов (помимо обычных и директорий) являются файлы устройств.

    Изучите функции следующих файлов директории /dev.

    • full
    • null
    • random
    • tty
    • urandom
    • zero
    1. (1 ед.) Прочитайте 64 байта из каких-либо двух файлов выше. (Например, командой od -N64 или hexdump -n64.) Объясните результат.

    2. (1 ед.) Попробуйте записать какую-либо строку в два файла выше. Объясните результат.

  5. В Unix-подобных системах, один (обычный) файл как правило может иметь несколько имен (или даже, в некоторых случаях, не иметь имен вовсе.) В пределах одной файловой системы (в смысле конкретной реализации способа организации файловых объектов), может быть создано несколько равноценных таких имен. Кроме того, вне зависимости от расположения, на заданные имена файлов (включая несуществующие) могут быть созданы символьные ссылки.

    Изучите следующие команды.

    • link
    • ln
    • mv
    • readlink
    • rm
    • stat
    • unlink
    1. (1 ед.) Создайте новый обычный файл и, используя ln (или link), создайте ему еще одно имя в какой-либо другой директории. Удостоверьтесь в равноценности имен, сначала записав данные используя одно имя и считав используя другое; затем удалив первое имя, и считав данные вновь используя второе.

    2. (1 ед.) Создайте символьную ссылку (ln -s) на некоторый существующий файл. Переименовав файл, покажите неравноценность исходного имени и ссылки.

    3. (1 ед.) Сравните поведение ln и ln -s в отношении файла, находящегося на другой файловой системе (например, /etc/passwd или /proc/mounts.)