201304280646


UNIX

                          +-------------------------------+
                          |       LIVE FREE OR DIE        |
                          |                               |
                          |             UNIX*             |
                          |                               |
                          |    *TRADEMARK OF BELL LABS    |
                          +-------------------------------+

До 2010 года изучение Unix-like операционных систем имело исключительно важное значение в определении структуры интеллектуальной пирамиды. Действовавшая тогда структура:

  человеческая личность - распределенный разум - животные - ...
   
похоже, сменилась. В сегодняшней структуре человеческая личность более не занимает верхнюю ступеньку:
   
  распределенный разум* - человеческая личность - животные - ...
   
Технические решения, создаваемые распределенным разумом работоспособны, но настолько объемны, что не помещаются целиком в сознании одного человека** (даже с предельными интеллектуальными способностями - так называемого динозавра). Однако любая небольшая часть проекта, как правило, прозрачна и может быть легко осмыслена. Молодое поколение с энтузиазмом восприняло окончание эры динозавров***. В частности, в качестве доказательства силы распределенного разума, с целью включения механизма поддержки SMP (symmetric multiprocessing) было успешно переписано ядро операционной системы FreeBSD, в четвертой версии все еще содержавшее код, созданный одним из авторов UNIX - Кеном Томпсоном. Одновременно, для 64-х битных систем была снята "проблема" конца света 2037 года, когда в античных UNIX ядрах наступит переполнение счетчика UNIx-time ведущего отсчет от 1 января 1970 года.

------
Примечания:

 *)   Распределенный разум - это потомок коллективного разума, усиленного поисковыми службами, экспертными системами и другими возможностями глобальных компьютерных сетей.
    
      Переживать по этому поводу бесполезно, так как большинству людей образовавшийся симбиоз нравится (Jaan Kikas, ETV Ringvaade 2012-09-24 19:15) а негативные последствия редки (Китайский участник ролевой интернет-игры убил соотечественника за виртуальный меч, 31.03.2005, 23:36:04,
     
       http://lenta.ru/news/2005/03/31/sword/e)
 
  **)  Впрочем, стремление к простоте не чуждо и современным разработчикам. Таковы, например, новая иерархическая файловая система от фирмы Apple в которой нет иерархии, и новая операционная система Windows RT 8, в которой нет окон (метро). [примечание автора]
   
     Mountain Lion’s New File System by Oliver Reichenstein. Apple has been working on its file system and with iOS it had almost killed the concept of folders - before reintroducing them with a peculiar restriction: only one level! With Mountain Lion it brings its one folder level logic to OSX.. 
   
       http://informationarchitects.net/blog/mountain-lions-new-file-system/)
          
***) Остается непонятным, кем или чем был вызван названный эмоциональный подъем, так как к указанному периоду средства пиара, рекламы и развлечений эффективно управляли желаниями масс. [примечание автора]

----------

Определимся с вопросом о том, зачем и в каком объеме следует освоить UNIX. Установим (верхний по списку ниже) мотиватор на отметку 100 баллов сложности.

  100 - хочу стать системным администратором UNIX-like облака 
  
  XXX - хочу досконально разобраться с вопросом о том, как работает мой мобильный телефон (до 10000 человеко-лет) 
  
  3   - хочу получить свидетельство об успешном окончании 24-х часового курса знакомства с семейством операционных систем UNIX
    
  1   - изучил изложенный в документе материал
   
Отличительная особенность оригинального UNIX в том, что при (большом) желании система может быть понята от начала до конца одним человеком (примеры: Кен Томпсон Kenneth Thompson (1943), Линус Торвальдс Linus Torvalds (1969) возможно Стив Джобс (Steve Jobs, 1955 — 2011) , Эндрю Стюарт Таненбаум (Andrew Stuart Tanenbaum, 1944), Джон Лайонс (John Lions, 1937 - 1998) и другие).

Система UNIX исключительно легко переносится на новые архитектуры электронных вычислительных машин (ЭВМ), (например, на уникальную архитектуру ARM с полностью асинхронным ядром. До 20121025 UNIX доминировал на рынке процессоров с ядром ARM: SoC Tegra 3, SoC Qualcom Snapdragon, Cortex-A15 MPCore, Apple A6 и другие. В настоящее время UNIX-подобная, но сильно фрагментированная ОС Андроид v.2.3, v.3.1, v.4.1, v.4.2 и менее UNIX-подобная iOS-6, теснится недавно вышедшей на рынок ARM системой Windows 8 RT, и, находящейся в разработке, Windows Blue ARM)

Тем не менее UNIX, в значительной мере, сохраняет за собой высокие позиции по количеству пользователей благодаря: 

  - невысокой цене кода, закупаемого разработчиками
  
  - понятной схеме оплаты, когда:
  
    * приложение находится на сервере или в облаке.
    
    * скачка приложений в устройство клиента только из 
      онлайн-магазина (app-store).
      
    * подписка оплаты за техническую поддержку.
  
  - предустановке бесплатно распространяемого программного обеспечения на новые приобретаемые устройства (компьютеры, медиа-проигрыватели, дигибоксы, сетевое оборудование и т.д.)
      
  - UNIX-системы доминируют на рынке серверов. 
  
  - UNIX-системы установлены почти на все суперкомпьютеры. (для работы современного суперкомпьютера может потребоваться миллион и более лицензий ОС - по количеству процессоров).

Примеры UNIX-like систем.

  Linux
  
  *BSD (FreeBSD, NetBSD, OpenBSD, Darwin, etc..)
  
  Solaris (OpenSolaris)
  
  Android = Linux Kernel 2.6 + Java (open android-x86 project)
  
  MacOSX  = Darwin (BSD) + Carbon (Objective C, NextStep, Cocoa)
  
  iOS     = подмножество MacOSX для более слабого железа

Изучать работу UNIX удобно в следующей последовательности (сверху вниз)

 - Классический UNIX 197x годов (простота, доступны исходные коды, есть симуляторы, легендарная книга "Lions Book")
   
 - Linux (либо FreeBSD)
 
 - коммерческая ОС (MacOSX, Android)


Программа курса.

  +----------------------------------------------------------------+
  |Неделя Часов  Тема, описание                      Самостоятельно|
  +----+---+-----------------------------------------------+-------+
  | 1. | 4 | Введение. Операционные системы. UNIX-like     |       |
  |    |   | операционные системы. Дистрибутивы. Версии    |       |
  |    |   | ядра. Типы лицензий. Преимущества и недостатки|       |
  |    |   | системы Unix. Области применения системы UNIX.|       |
  |    |   | Интернет, файл- и принт- серверы. Серверы     |       |
  |    |   | приложений и СУБД. Кластеры и облака.         |       |
  |    |   | Суперкомпьютеры. Рабочие станции. Планшеты и  |       |
  |    |   | смартофоны. Настольные компьютеры и ноутбуки. |       |
  |    |   | Обзор железа (hardware). Процессор (CPU)      |       |
  |    |   | Оперативная память (RAM). Жесткий диск.|              |
  |    |   | Материнская плата (чипсет, контроллер         |       |
  |    |   | периферии, шины (PCIe, SATAx, USBx),          |       |
  |    |   | видеокарты, сетевые карты. Установка UNIX     |       |
  |    |   | (Linux, FreeBSD, OpenSolaris, Android-x86,    |       |
  |    |   | Darwin). Логическая структура информации на   |       |
  |    |   | диске и ее редактирование (PartED). Установка |       |
  |    |   | с носителя (CD/DVD/USB). Установка по сети.   |       |
  |    |   | Клонирование.                                 |       |
  +----+---+-----------------------------------------------+-------+
  | 2. | 4.| Линукс для user'а. Shell, консоль, виртуальные|       |
  |    |   | терминалы (alt-f*), ядро. Начало и конец      |       |
  |    |   |  сессии. Получение подсказки. Основные команды|       |
  |    |   | (BASH, SH). Shutdown. Дерево каталогов.       |       |
  |    |   | Команды pwd, cd, mkdir. rmdir, ls.            |       |
  |    |   | Метасимволы. Вывод содержания текстовых и     |       |
  |    |   | бинарных файлов на консоль, поиск информации в|       |
  |    |   | теле файла (grep). Регулярные выражения.      |       |
  |    |   | Поиск файлов (find). Жесткие и софт-линки.    |       |
  |    |   | Атрибуты файлов. Владелец, группа, специальные|       |
  |    |   | атрибуты и их редактирование. Редактирование  |       |
  |    |   | файлов (ed, vi. emacs и др.).                 |       |
  |    |   | Администрирование файловой системы. Папка /dev|       |
  |    |   | Типы файловых систем. Монтирование. Работа с  |       |
  |    |   | внешними носителями (CD/DVD), память          |       |
  |    |   | подключаемая по USB. Вывод на консоль         |       |
  |    |   | свободного места на диске (df,du), проверка и |       |
  |    |   | исправление ошибок файловой системы (fsck).   |       |
  |    |   | Квота. SH shell. Потоки и файлы.              |       |
  |    |   | Перенаправление STDIN, STDOUT, STDERR. Трубы  |       |
  |    |   | (pipes). Переменные окружения. Скрипты.       |       |
  |    |   | Инициализация системы.                        |       |
  +----+---+-----------------------------------------------+-------+
  | 3. | 4.| Процесс загрузки. Bootloader'ы LILO, GRUB,    |       |
  |    |   | GRUB 2. Runlevel. Файл /etc/inittab. Upstart. |       |
  |    |   | Автостарт демонов. Процессы. Вывод списка     |       |
  |    |   | процессов на консоль. Уничтожение процессов.  |       |
  |    |   | (kill). Системные вызовы fork и exec.         |       |
  |    |   | Процессы на заднем и переднем плане (bg, fg)  |       |
  |    |   | Приорететы. Запуск процессов согласно графику |       |
  |    |   | работ (crond ja atd). Администрирование LOG-  |       |
  |    |   | файлов (dmesg, syslogd ja klogd). Фильтры и   |       |
  |    |   | шаблоны. Администрирование пользователей.     |       |
  |    |   | Создание, изменение, уничтожение учетных      |       |
  |    |   | записей пользователей, смена паролей. Группы  |       |
  |    |   | пользователей. Права пользователей.           |       |
  +----+---+-----------------------------------------------+-------+
  | 4. | 4.| Подсистема X-windows. Запуск и остановка.     |       |
  |    |   | Конфигурирование и утилиты настройки X-windows|       |
  |    |   | Настройка печати. CUPS. Архивирование и       |       |
  |    |   | создание резервных копий. (compress, gzip,    |       |
  |    |   | bzip2, tar, cpio, dump/restore, cdrecord/wodim|       |
  |    |   | ). Программные пакеты. Компилирование из      |       |
  |    |   | исходников. Введение в средства программирова-|       |
  |    |   | ния - gcc, gdb, make, strip. Структура скрипта|       |
  |    |   | make. Конфигурирование ядра, патчи,           |       |
  |    |   | компиляция ядра. Команды загрузки и удаления  |       |
  |    |   | модулей ядра, их конфигурационные файлы       |       |
  +----+---+-----------------------------------------------+-------+
  | 5. | 4.| Настройка сети. протокол TCP/IP. Классы       |       |
  |    |   | адресов и сегменты (подсети). Конфигурирование|       |
  |    |   | сетевой карты (NIC). DNS. Настройка сетевого  |       |
  |    |   | интерфейса со статическим и динамическим      |       |
  |    |   | адресом IP. Команды ifconfig, route. Клиенты  |       |
  |    |   | telnet, ftp, ssh, mail. Настройка NFS на      |       |
  |    |   | стороне клиента.                              |       |
  +----+---+-----------------------------------------------+-------+
  | 6. | 6.| Сетевые службы. Start, stop, restart, status. |       |
  |    |   | Местоположение конф.-файлов и их структура.   |       |
  |    |   | Webmin. Демоны sshd, telnetd, ftpd.           |       |
  |    |   | Безопасность сети. Iptables. Настройка        |       |
  |    |   | брандмауера (Firewall). Sniffing.             |       |
  |    |   | Snord. Обнаружение атак.                      |       |
  +----+---+-----------------------------------------------+-------+


Заметки по некоторым темам


Редактор vi. Создание файла в домашней папке.

Переходим в домашнюю папку

  $ cd ~

Убедимся, что мы находимся в домашней папке

  $ pwd
  /home/user

  Если вас зовут user то домашней будет папка /home/user

Запускаем текстовый редактор.

  $ vi lesson1.txt

Наименьшее количество проблем возникнет, если удастся свыкнуться с мыслью, что на клавиатуре есть только кнопки основной группы:

  [ESC][1][2][3][4][5][6][7][8][9][0][-][=][ <-- ]
        [Q][W][E][R][T][Y][U][I][O][P][[][]]
         [A][S][D][F][G][H][J][K][L][;]['] [Enter]
  [Shift] [Z][X][C][V][B][N][M][,][.][/]
              [      Space      ] 

Peдактор имеет три режима работы

  - режим ввода (В)
  - режим правки (П)
  - командный режим (К)

Переход между режимами:

     В -> П  Esc
     В -> К  Esc :
     П -> В  i (insert, вставка) или a (append, дополнить)
     П -> К  :
     К -> В  Esc i
     К -> П  Esc

Перемещаться по тексту следует в режиме правки кнопками. В этом же режиме осуществляется простое редактирование.

     h   - влево, "а не в Хвост строки"
     j   - вниз, "а не Йог левитирующий"
     k   - вверх, "а не Копать" 
     l   - вправо, "a не наЛево"
     
     x   - удалить текущий символ "крест поставить"
     r   - заменить текущий "replace"

Шутки, заключенные в кавычки призваны помочь запомнить кнопки редактора vi-vi-vi. Текущий объект отмечен курсором (чтобы не утек).
  

Oперации с текущей строкой.
  
  dd  - (delete) удалить и забрать в буфер
  yy  - (yank) забрать в буфер текущую строку
  p   - (paste) поместить содержимое буфера обмена под текущей 
        строкой.
  
Сохранить файл можно командой (переходим в командный режим) 

  w или
  w имя_файла 
  
Выход из редактора также осуществляется в командном режиме

  q         выход
  wq        выход с сохранением
  q!        выход без сохранения
  
Ссылки и литература на русском языке

  https://www.ibm.com/developerworks/ru/edu/l-vi/index.html
  
----------

Операционная система (ОС) Linux (Fedora)

0. Введение

Выбираем из следующих возможностей:

0.1. Использовать дистрибутив Fedora Live CD (Gnome)

  Самый простой способ для новичка.
  
   - Скачать файл образа компакт-диска с сайта fedoraproject.org
   - Запишите образ на CD-R или CD-RW диск
   - В случае необходимости измените последовательность загрузки в BIOS (поставить CD / DVD первым).
   - Перезагрузите компьютер с изготовленного диска.

0.2. Установить ОС на виртуальную машину (ВМ).

   Легкий способ одновременно использовать несколько ОС на одном компьютере.

   - Скачать программу виртуализации сайте http://virtualbox.org выбрав подходящий вариант операционной системы хоста.
   - Установить, запустить и построить подходящую ВМ (768MB RAM, 4 Гб IDE HD, 1 pcnet32 NIS, Fedora OS)
   - Используя файл образа из первого пункта, загрузить ВМ.
   - Запустить в виртуальной машине скрипт установки на жесткий диск и ответить на вопросы задаваемые этим скриптом.

0.3. Зарезервируйте компьютер только под Linux.

   Хороший вариант для тех, кто имеет соответствующий компьютер.

   - То же что в п. 1. плюс
   - Запустите в машине скрипт установки на жесткий диск и ответьте на вопросы задаваемые этим скриптом.
     
0.4. Установить ОС на освобожденное дисковое пространство.

   NB! В связи с риском потери имеющейся информации, рекомендуется пользователям, знакомым с компьютерами.

   - Запустить Partition Magic, GParted, EPM partition manager либо такую live систему, в которой возможно переместить или сжать существующий раздел.
   - На освобожденном месте создать две партиции: Linux (> 4 Гб) и подкачки (swap) (~ 2 * RAM)
   - Запустить в машине скрипт установки на жесткий диск и ответить на вопросы задаваемые этим скриптом.


Первое знакомство

Большинство ознакомительных экспериментов будет проводиться в командной строке, так что было бы хорошо выяснить, где находится окно вашего терминала.
 
В ОС Fedora Gnome есть несколько возможностей открыть окно терминала.

   - Applications -> Sеarch -> Terminal
   
   - Alt-F1 (Alt-F2, ALT-F3 и т.д.) открывает Virtual Console.
     Вернуться в графику - Alt-F7 


1.1 Login и logout. Помощь.

   Открыть виртуальную консоль (Alt-F1)
   
   login:    user-name
   password: user-password
    
     $ man intro
    
   знакомит с главными командами и структурой подсказки (фрагмента сказки, man).
    
     $ exit

   Командой exit закончим сессию.

   Права администратора могут быть получены с помощью команды

     $ su -

   или войдя в систему с именем пользователя root

     Логин:  root
     Пароль: root-password

     #

   приглашение в виде решетки (#) напоминает вам, что вы root.
   

1.2 Где я ?

  +----------------------------+
  | дацзыбао 0. ВСЁ ЕСТЬ ФАЙЛЫ |
  +----------------------------+
  
В Unix-подобных системах, устройства, папки и даже некоторые системные таблицы и структуры данных в оперативной памяти по сути, являются файлами.


1.2.1 Формат команды

В темноте командной строки вы можете оглядеться вокруг с помощью команд. Формат команды чаще всего такой:
  
      команда -a -b --long_key0 argument0 arg1 .. argN
     
  где дефис используется для однобуквенных ключей, и два дефиса для длинных ключей.


1.2.2 Вывод рабочей папки ( pwd - print work directory ).

Отображает текущую папку в дереве каталогов (сразу после входа в систему, пользователь с именем "user" находится в папке /home/user а суперпользователь с именем "root" - в папке /root

  $ pwd

Все файлы образуют древовидную структуру, растущую из папки с именем "/" (корневой каталог). В корневой папке находятся такие важные каталоги, как:

  /bin     программы
  /boot    kernel (ядро)
  /grub    bootloader (мультизагрузчик)
  /etc     конфигурационные файлы
  /X11     графика
  /home    домашние папки пользователей
  /lib     библиотеки (libraries)
  /mnt     монтировать здесь
  /root    домашний каталог пользователя "root"
  /sbin    системные программы
  /tmp     временные файлы
  /proc    таблицы ядра, переключатели, отчеты (в ОЗУ)
  /usr     уровень 2
    /bin
    /sbin
    /lib
    /local уровень 3
      /bin
      /lib
      /sbin
  /src
  /var     log файлы, кэш (cache) ...
  
  
1.2.3. Изменение каталога (cd).

Можно перемещаться из одной папки в другую командой cd. Помогают в этом специальные имена папок:

  .     - Текущий каталог
  ..    - Одну директорию вверх. (корень дерева в мире UNIX 
          находится вверху, а крона дерева внизу)
  ~     - Наша домашняя папка (здесь мы были сразу после входа  
          в систему)
  ~foo  - домашний каталог пользователя "foo"
  /     - Корневой каталог (корень файлового дерева)
  /root - домашний каталог суперпользователя

   Пример 1

   pwd                 находимся в папке /home/user
   cd /usr/share/doc   находимся в папке /usr/share/doc
   cd ..               находимся в папке /usr/share
   cd ../..            находимся в папке /
   cd boot             находимся в папке /boot
   cd /grub            такой папки здесь нет, ошибка. 
                       Мы там, где мы были (/boot) 
   cd grub             находимся в папке /boot/grub
   cd ~                Мы вернулись домой (/home/user)


1.2.4  List files (ls)

  ls ( -l, -d, -a)

  Пример 1. Зайти в папку /boot. Оглядеться вокруг.

  $ cd /boot
  $ ls
  
  config-2.6.26.5.fc9.i686         memtest86+-2.01
  efi                              System.map-2.6.26.5.fc9.i686
  grub                             vmlinuz-2.6.26.5.fc9.i686
  initrd-2.6.26.5.fc9.i686.img

  Пример 2. Сделать длинный обзор папки /home/user/Desktop

  $ ls -l /home/user/Desktop/
  total 8
  -rw-rw-r-- 1 user user 5701 2008-10-21 21:53 penguin

  Показанная строка содержит не только имя файла, но и его атрибуты
  
  - специальный флажок, указывающий, что это не папка (d directory), не блочное устройство (b block device) не последовательное устройство (c character device) и не ссылка (l link).

   r - владелец файла имеет право читать (r read) этот файл
   w - владелец имеет право писать (w write) в этот файл
   - - владельцу не разрешено запускать (x execute) этот файл

   r - члены группы имеют право читать файл
   w - члены группы имеют право писать в этот файл
   - - члены группы не имеют права запустить этот файл

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

   user - user владелец файла
   user - владелец файла принадлежит к группе user

   5701       - размер файла 5701 байт
   2008-10-21 - последнее изменение: 21 октября 2008
   21:41      - в 21:41

   penguin - penguin это имя файла  

  Пример 2. Сделать длинный обзор папки /home/user,
            показать скрытые файлы.

  $ ls -la /home/user
  total 152
  drwx------ 26 user user 4096 2008-10-21 22:08 .
  drwxr-xr-x  3 root root 4096 2008-09-20 18:00 ..
  -rw-------  1 user user  392 2008-10-12 22:42 .bash_history
  -rw-r--r--  1 user user   18 2008-02-29 16:27 .bash_logout
  -rw-r--r--  1 user user  176 2008-02-29 16:27 .bash_profile
  -rw-r--r--  1 user user  124 2008-02-29 16:27 .bashrc
  ...
  -rw-------  1 user user 1324 2008-10-21 20:00 .xsession-errors
  
Если имя файла начинается с точки, то это скрытый файл. Такие файлы обычно используются для настройки среды (обитания).

Маски имен файлов используются для ограничения вывода из ls.
 
   *     любые символы
   ?     любой символ
   [A-D] большими буквами от А до D

  Пример 4. Показать все файлы в папке /usr/bin, которые начинаются с x, t, или z буквы и заканчиваются буквой d

  $ ls /usr/bin/[xtz]*d
  /usr/bin/tload   /usr/bin/xfd          /usr/bin/xload  
  /usr/bin/xwud    /usr/bin/xclipboard   /usr/bin/xkbevd  
  /usr/bin/xwd     /usr/bin/xxd
  
   d - ключ используем в том случае, если хотим знать атрибуты папки
  
  Пример 5. Показать атрибуты папки /etc/X11  

  $ ls -ld /etc/X11
  drwxr-xr-x 6 root root 4096 2008-10-12 11:33 /etc/X11

 
1.2.5. Сколько свободной оперативной памяти ОЗУ (free)

Показывает, сколько свободной оперативной памяти можно использовать

  Пример 1. 46MB свободной памяти RAM

  $ free
               total    used    free  shared  buffers  cached
  Mem:        319904  273792   46112       0    12148  111132
  -/+ buffers/cache:  150512  169392
  Swap:       337356       0  337356


1.2.6. Свободное пространство на диске. disk free (df)

Показывает количество свободной памяти на дисках.

  Пример 1.  1.4GB свободны на первом разделе

  $ df
  Filesystem     1K-blocks    Used Available Use% Mounted on
  /dev/sda1        3793824 2330412   1463412  62% /
  tmpfs             159952      48    159904   1% /dev/shm
  gvfs-fuse-daemon 3793824 2330412   1463412  62% /home/u/.gvfs


1.2.7. disk usage (du)

Показывает, сколько дискового пространства используется для хранения папок.

  Пример 1.
  
  # du -s /home/user
  8868  /home/user/

  Пример 2.

      #  du /etc/
      8  /etc/cron.d
      8  /etc/bash_completion.d
      4  /etc/alternatives
     28  /etc/yum.repos.d
     ..   ....
     92  /etc/ppp
    196  /etc/mail
  88424  /etc


1.3. кроме файлов, здесь есть хотя-бы что-то еще ?

1.3.1. Оболочка и переменные среды.

Небольшие количества информации можно временно хранить в оперативной памяти в виде переменных. Теперь и далее будем считать, что мы выбрали оболочку BASH, которая выбрана по умолчанию во многих Linux дистрибутивах.

  +----------------------------------------------------------+
  | дацзыбао 1. ЗНАЧЕНИЯ ПЕРЕМЕННЫХ BASH - ЭТО ВСЕГДА СТРОКИ |
  +----------------------------------------------------------+

  Пример 1. Создание переменных, присваивание им значений и 
            чтение.

  # MY_NUMBER=123
  # MY_NAME=user
  # echo $MY_NUMBER $MY_NAME
  123 user
  # unset $MY_NUMBER
  # echo $MY_NUMBER $MY_NAME
  user

-----------

1.3.2. Процессы (ps)

Знакомясь с Linux, операционная система видит меня как процесс - исполняемый файл, который ОС загрузила в ОЗУ и передала ему управление. В данном случае я - это оболочка Bash (/bin/bash). Для того, чтобы сама ОС не потеряла контроль над процессами используется разделение времени - каждому из процессов дается короткий период времени (1-100 мс), после чего ОС возвращает управление себе и переключает активную задачу. Этот механизм позволяет параллельно запустить сотни и тысячи процессов.

Познакомимся с нашими соседями.

  Пример 1. ps этот процесс запустил я сам.
  Он больше мой ребенок (bash's child), чем соседский.
  $ ps
  PID TTY          TIME CMD
  1887 pts/0    00:00:00 bash
  2028 pts/0    00:00:00 ps
 

  Пример 2.  Все процессы.

  $ ps aux
  USER  PID %CPU %MEM   VSZ   RSS TTY   STAT START TIME COMMAND
  root    1  0.0  0.2  1948   740 ?     Ss   15:49 0:01 /sbin/init
  root    2  0.0  0.0     0     0 ?     S<   15:49 0:00 [kthreadd]
  ...
  user 1846  1.3  6.9 85732 22340 ?     Sl   15:51 0:14 gnome-terminal
  user 1848  0.0  0.1  2776   632 ?     S    15:51 0:00 gnome-pty-helper
  user 1849  0.0  0.4  5716  1512 pts/0 Ss   15:51 0:00 bash
  user 1895  4.0  0.2  5512   940 pts/0 R+   16:10 0:00 ps aux

  USER    - каждый процесс имеет владельца
  PID     - ОС назначает каждому процессу уникальный номер
  %CPU    - сколько процессорного времени выделено процессу
  %MEM    - сколько оперативной памяти выделено процессу
  VSZ     - виртуальной памяти в килобайтах
  RSS     - резидентная (не выгружаемая) часть
  TTY     - используемый терминал
  STAT    - статус, смотри man ps
  START   - время запуска процесса
  TIME    - длительность выполнения процесса
  COMMAND - файл и аргументы, запущенные для создания процесса
  
  
1.3.3 Backslash (\)

Обратная косая - это очень популярный символ в UNIX-мире в разных программах роль которого различна. Оболочка SH использует "\" как символ продолжения строки.

  Пример 1.
  
  $ ls -la \
  > /boot
  total 5864
  drwxr-xr-x  4 root root    4096 2008-10-12 23:48 .
  drwxr-xr-x 21 root root    4096 2008-10-22 18:50 ..
  -rw-r--r--  1 root root   88852 2008-09-20 10:54 config-2.6.26.5-45.fc9.i686
  drwxr-xr-x  3 root root    4096 2008-05-08 04:41 efi
  drwxr-xr-x  2 root root    4096 2008-10-12 23:48 grub
  -rw-------  1 root root 2713893 2008-10-12 11:30 initrd-2.6.26.5-45.fc9.i686.img
  -rw-r--r--  1 root root  112076 2008-04-04 00:16 memtest86+-2.01
  -rw-r--r--  1 root root  916225 2008-09-20 10:54 System.map-2.6.26.5-45.fc9.i686
  -rwxr-xr-x  1 root root 2125408 2008-09-20 10:54 vmlinuz-2.6.26.5-45.fc9.i686


1.3.4 echo 

echo - это простая команда, которая печатает свои аргументы на экране 

  Пример 1. echo 
  
  $ echo hello unix 
  hello unix 
  -n говорит о том, что в конец строки символ новой строки 
     (\n - 0x0a) добавлять не надо. 
     
  Пример 2. echo -n 
  
  $ echo -n hello unix 
  hello unix$


1.3.5 Wormhole

Если все управляющие и видимые символы не помещаются в алфавит ограниченного размера, используются wormholes (в разное время русский эквивалент слова имел различное звучание, поэтому здесь применяется оригинал). Для этого один символ резервируется для того, чтобы войти в расширенный (extended) алфавит. Часто таким зарезервированным символом является "\" обратная косая черта (backslash). Старое значение зарезервированного символа переносится в расширенный алфавит. Тогда "\\" это видимая обратная косая черта (два движения: 1 - "\" провалиться в расширенный алфавит, 2 - "\" отобразить видимый символ backslash).

Добавим в расширение алфавита следующие символы: t, n, с 000 по 377 в восьмеричной системе:
   
   \t                                  табулятор  (tab)
   \n                                  новая строка (new line)
   \000, \001, .. \007, \010, .. \377  ASCII символ в 8-ном коде
   
  Пример 3. backslash, echo and wormhole
   
   $ echo -e "\074welcome to unix\076"
   <welcome to unix>   
   $ echo -e \074welcome to estonia\076
   074welcome to estonia076
   $ echo -e \\074welcome to my nightmare\\076
   <welcome to my nightmare>   
   $

   -e (extended) ключ разрешает использовать символы 
      расширенного алфавита, проникая в него через wormhole
      (backslash).  


1.3.6 STDIN STDOUT, STDERR. cat

Программы (любые) предназначены для обработки информации. Для этого программа:
   
  - Считывает информацию из одного или более файлов и
  - Сохраняет обработаную информацию в одном или нескольких файлах
   
Оболочка (shell) всегда держит открытыми три файла
   
  0 или STDIN  - стандартный ввод (вход)
  1 или STDOUT - стандартный вывод (выход)
  2 или STDERR - стандартная ошибка (ошибки)

Перенаправление потока информации в
    
  STDOUT с помощью  >, >>, 1> 1>>, |, 1| 

  STDERR с помощью  2>, 2>>, 2| 

Перенаправление потока информации из (читать из) STDIN

  STDIN  с помощью <, 0< 
         
     <  чтение из файла
     >  запись в файл
     >> добавление в файл
     |  соединить трубой (pipe)
     
  Пример 1. Читаем X --help используя фильтр "less" (постраничный показ, возможность поиска (/) и перелистывания (space, enter, Up, Down, PageUp, PageDown). Выпускает из себя кнопкой q (quit).
           
    X --help 2>&1 | less
    
    Синтаксис 2>&1 перенаправляет STDERR в STDOUT.
   
  Пример 2.
   
  $ echo one > report
  $ echo -n two 1>> report
  $ echo -e \\ntree >> report
  $ cat report
  One
  Two
  Tree
  
Программа cat выводит на STDOUT содержимое файлов, идущих списком аргументов этой команды.    
  
  Пример 3.

  $ cat -n raport
   
    1   one
    2   two
    3   tree
    
Если STDOUT нужно подставить на место имени файла, используется псевдоимя "-".
  
Мы можем сразу начать строить очень простой текстовый редактор для того, чтобы описать другу свою новую жизнь UNIX процессом.

   Пример 4.
  
   $ cat - > message0
   Здравствуй друг !
  
   Жизнь здесь интересная, но я все еще не умею практически 
   ничего. Я даже сомневаюсь, правда ли то, что написано в man:
   что написанное можно сохранить одновременно нажав кнопки 
   "Ctrl" и "D"
   
   до лучших времен ! 
   Ваш кот дочь Баша (сat bash's child process - 
                      дочерний процесс).
   $


2. Новая жизнь в виртуальном мире.   

2.1 Наведение порядка в домашней папке (mkdir, rm -rf).

  Пример 1. Создаем папки в домашнем каталоге

    $ cd ~
    $ mkdir school
    $ mkdir job
    $ mkdir relax
    $ cd relax
    $ mkdir audio
    $ mkdir video
    $ mkdir photo    
    $ cd ../school
    $ mkdir lesson1
    $ mkdir lesson1/a
    $ mkdir lesson1/b
    
  Пример 2. Стираем папку lesson1 и все что в ней лежит из каталога school.
    
    $ rm -rf /home/kasutaja/school/lesson1
    
    -r   recursive
    -f   force 


2.2 Запасная копия (backup) на устройство внешней flash-памяти.

Для того, чтобы смонтировать flash-брелок, нужно в каталоге /mnt создать папку, куда монтировать файловую систему внешнего носителя.
  
    $ su -
    # mkdir /mnt/usb
    # mount /dev/sdb1 /mnt/usb
    # exit
    
Новая команда mount монтирует устройство /dev/sdb1 в папку /mnt/usb
  
 +------------------------------------------------------------+
 | дацзыбао 2. КОМАНДЫ С ДВУМЯ АРГУМЕНТАМИ:                   |
 |             ПЕРВЫМ АРГУМЕНТОМ ЯВЛЯЕТСЯ ТО, ЧТО СУЩЕСТВУЕТ. |
 |             ВТОРЫМ АРГУМЕНТОМ ЯВЛЯЕТСЯ ТО, ЧТО СОЗДАЕТСЯ.  |
 +------------------------------------------------------------+
    
Теперь архивируем все содержимое архива /home/user на USB-flash.
  
  cd ~/..
  tar cv user | bzip2 > /mnt/usb/user-$(date +%Y%m%d).tar.bz2

Команда tar (tape archive) отправляет результат на STDOUT.
  
     c - создать
     v - рассказывать, что делаешь
    
   | соединяем выход tar со входом пакующего фильтра bzip2. bzip2 выдаст результат на STDOUT.
  
   > перенаправление в файл с именем 20121025.tar.bz2 (25 октября 2012 года). штамп времени добавляется к имени автоматически - $(date +%Y%m%d).

  Команда date +F вернет штамп времени (timestamp) F :
  
      %Y - номер года (от рождества Христова) - 4 позиции 
      %m - номер месяца (январь = 1)          - 2 позиции 
      %d - число месяца (первое = 1)          - 2 позиции
      
  Перед тем как вынуть flash из USB, ее следует размонтировать
  
    $ su -
    # umount /dev/sdb1
    # exit


2.3 sudo

    # su -
    # echo 'user   ALL=(ALL)    ALL' >> /etc/sudoers
    

2.4 mv (move), cp (copy) и patch. 

  для команд mv и cp справедливо правило двух аргументов (дацзыбао 2).
  
  Пример 1. Компилируем оригинал ядра (vanilla kernel)

   cd /usr/src
   wget -c http://kernel.org/ ... /linux-2.6.27.tar.bz2
   wget -c http://kernel.org/ ... /patch-2.6.27.4.bz2
   tar xf linux-2.6.27.tar.bz2
   mv linux-2.6.27 linux-2.6.27.4
   cd linux-2.6.27.4
   bzip2 -dc ../patch-2.6.27.4.bz2 | patch -p1
   cp /boot/config-2.6.26.6-79.fc9.i686 .config
   make oldconfig
   make
   make modules_install
   make install


2.5 install

  Пример 1. VirtualBox
  
  # wget -c http://download.me/VirtualBox.rpm
  # yum install qt qt-x11 SDL
  # rpm -Uvh VirtualBox.rpm
  # rm -f VirtualBox.rpm

  - Загружаем пакет (wget). 
  
  - yum  установит заказанную и подчиненнык программы используя распределенную базу пакетов - репозиторий. Важнейшие запросы к yum это: 

    yum search package_name
    yum install package0 package1 ... packageN
    yum remove package0 package1 ... packageN
    yum clean all
    
  - rpm  установит скачанные пакеты rpm. Важнейшие запросы к rpm это:

    rpm -Uvh packages(s).rpm   install/upgrade package file(s)
    rpm -e package             remove package
    rpm -qa '*spell*'          show all packages whose names 
                               containing the word spell
    rpm -q package             show version of package installed
    rpm -q -i package          show all package metadata
    rpm -q -f /path/file       what package does file belong
    rpm -q -l package          list where files were installed
    rpm -q -l -p package.rpm   list where files would be 
                               installed
    rpm -q --requires package  list files/packages that package 
                               needs
    rpm -q --whatrequires pack list packages that need package 
                               pack
  
  - rm  уничтожит скачанный пакет, который теперь установлен.

    
2.5 Последовательный терминал. 
    
  $ ln /dev/ttyS0 /dev/modem
  $ yum install minicom
  $ minicom
   
  Пример настройки: 
  
    Communication protocol (9600,8,N,1)
    Hardware flow control  OFF
    
    
3.0 Обработка текста. Регулярные выражения и фильтры.

               Never write it in 'C' if you can do it in 'awk';
               Never do it in 'awk' if 'sed' can handle it;
               Never use 'sed' when 'tr' can do the job;
               Never invoke 'tr' when 'cat' is sufficient;
               Avoid using 'cat' whenever possible.
                           
                           --Taylor's Laws of Programming 

  regexp    ^  $ . [A-Za-z] [0123] [^A] () |
  grep      (-i, -v, -r, -l) 'regexp'
  find
  sed ja ed
  cat (-n), wc (-l, -c, -w), less, more, head (-n 3), tail (-n)
  tr, sed, gawk '{ print $3,$1 }', sort, uniq (-u), paste

----------------------------------------------------------------

Основные команды UNIX

01. Файлы и папки
    
  pwd, cd ( . , .. , ~ , ~user), mkdir (-p)
  ls ( -l, -d, -a, -i, -1, --color)
  ln ( -s)
  cp, mv, rm ( -f, -r), touch
  cmp, diff, patch (-pN)
  find


Файловое дерево

  /          root directory
    /bin     programs
    /boot    kernel
       grub  bootloader
    /etc     configuration files
       X11   graphics
    /home    users home
    /lib     libraries 
    /mnt     mount here
    /root    root's home
    /sbin    system programs
    /tmp     temporary
    /proc    some kernel tables, switches, report (in RAM)
    /usr     level 2
       bin
       sbin
       lib
       local   level 3
           bin
           lib
           sbin
       src
  var        log files, cache, chrooted files, ...


02. Свойства и права пользования файлами и папками

  chown, chgrp, chmod (744, +x, +s)

  -rw-------  1 user  user      289 2008-09-21 17:27 .bash_history

  drwxr-xr-x  2 root  root       80 2008-10-12 14:00 bsg
  lrwxrwxrwx  1 root  root        3 2008-10-12 14:00 cdrom -> sr0
  brw-rw----  1 root  floppy 2,   0 2008-10-12 14:00 fd0
  srw-rw-rw-  1 root  root        0 2008-10-12 14:00 log
  crw-rw----  1 root  uucp   4,  64 2008-10-12 14:00 ttyS0

03. stdin, stdout, stderr

  >, >>, <, |, (0<, 1>, 2>), |&, >&, >>& (2>&1), tee

04. Архивирование

  tar (c v f x j z), bzip2 (-d), gzip (-d), cpio
  7za (p7zip), unrar

05. Файловые системы

  fdisk, mkfs.ext3, mkswap, fsck,
  dd ( if=/dev/zero if=/dev/random if=/dev/sda if=/dev/sdb1,
       of=/dev/null bs=512 count=63)
  df, du ( -s),
  mount (-o, -t, /etc/fstab), umount

  /etc/fstab
  /dev/sda1     /        ext3    defaults    1 1
  /dev/sda2     swap     swap    defaults    0 0

06. Текстовые редакторы

  vi, ed, nano

07. Написание скриптов

  #!/bin/bash,
  переменные окружения,
  "", '', ``
  test (-lt -le -eq -ge -gt),
  if .. ; then .. ; fi
  while .. ; do .. ; done
  for $x in .. ; do .. ; done
  seq, 
  expr (index length match substr)

08. Фильтры и логи

  grep (-i, -v, -r, -l -n -H) 'regexp' [filename]
  ( ^  $ . [A-Za-z] [0123] [^A] () | )

  cat (-n), wc (-l, -c, -w), less, more, head (-n 3), tail (-n)
  tr, sed, gawk '{ print $3,$1 }', sort, uniq (-u), paste

  /var/log/messages,
  /var/log/Xorg ...

09. Юзеры

  useradd, userdel, passwd, su (-)

  /etc/passwd
  root:x:0:0:root:/root:/bin/bash
  kasutaja:x:500:500::/home/kasutaja:/bin/bash

  /etc/group
  root:x:0:root
  kasutaja:x:500:

10. Процессы

  ps (-A), kill (-9), killall, top, nice, job, fg, bg

11. Загрузка

  dmesg, uname (-a, -r), /etc/issue

  init (0, 1, 2, 3, 4, 5, 6)
  ntsysv, rcconf

  /boot/grub/menu.lst
  /etc/inittab

12. Сеть

  ping, traceroute, ifconfig, route, nslookup, dig

  /etc/resolv.conf
  nameserver 193.40.160.3

13. Программирование

  gcc, gdb, cpp, make, strip

14. Инсталляция

  yum (install remove search), rpm (-q -a -i -e -v -h -U) rpm -Uvh
  zypper (install, remove, search)
  apt-get (install, remove, autoremove), apt-cache search, apt-src
  dpkg (-i, -r), dpkg-query

15. Разное

  crontab, mail
  
----------

Регулярные выражения

В 1940 году Уоррен Маккалок и Уолтер Питтс моделировали нейроны с помощью теории конечных автоматов (для описания нервной системы). В 1956 году, для описания этих моделей, Стив Клини создал математическую абстракцию, называемую регулярными множествами.

Регулярное выражение это способ задания набора строк. Так как набор может содержать бесконечно много членов, мы не можем просто пронумеровать (enumerate) их.
 
Есть четыре операции для создания регулярных выражений

  1. Замыкание Клини (репликация)   *
  2. Выбор из списка (alteration)   |
  3. Koнкатенация                   пусто
  4. Группирование   (grouping)     ()

Таблица ниже иллюстрирует названные операции на примерах.

  Операция           Регулярное выражение    Да     Нет
  ............................................................
  Репликация         ab * a                  aa     ab
  (Замыкание Клини)                          аба
                                             abba

  Логическое ИЛИ     aa | baab               aa     любaя другая
  (Чередование) Baab                                строка

  Koнкатенация       aabaab                  aabaab любaя другая
                                                    строка
  
  Группирование      a(a|b)aab               aaaab  любaя другая
                                             abaab  строка

  * Оператор имеет наивысший приоритет, затем |, затем 
    конкатенация.
  
Если мы хотим, чтобы cоздать набор строк: a, aba, ababa, abababa, и так далее, мы должны написать (ab)*a, чтобы указать, что шаблон ab должен быть реплицирован с набором a.

      Роберт Седжвик, Кевин Уэйн, Принстонский университет, 2004

----------

Полезные расширения:

  .  соответствует любому символу
  $  соответствует концу строки
  ^  соответствует началу строки
  [Ci-Cj] соответствует упорядоченному списку символов от Ci до 
  Cj (включая Ci, Cj)

  ?  предшествующий символ встречается 0 или 1 раз
  *  предшествующий символ встречается 0 или более раз
  +  предшествующий символ встречается 1 или более раз
  {n} предшествующий символ встречается точно n раз
  {n, m} предшествующий символ встречается по крайней мере n раз, но не более m раз

  \  backslash (http://ru.wiktionary.org/wiki/червоточина) переключение между обычным и расширенным алфавитом (метасимволы). Например \$ означает доллар, но не конец cтроки, а $ означает конец cтроки, но не доллар.
     
----------

Послесловие

Итак, мы познакомились с юниксом в объеме одного пункта из ста. Найти материал для дальнейшего изучения в требуемом объеме не составит труда. Много ценного материала изложено по-английски, все-таки родина UNIX (у них). Сегодня, при наличии роботов-переводчиков 

  http://translate.google.com
  http://www.bing.com/translator
  http://translate.ru

и других, легко начать с изучения упрощенного языка наподобие basic english, pidgin english, voa english (voice of america), globish etc.

----------

Приложение А.

  demo people

  username  userpassword          surname   firstname
  ...
  pupsik    kudaidemm6sp2ta4kom   sidorov   petr

  #!/bin/sh

  group=demo
  exec < demo_people
  while read user pass surname name
  do
      useradd $user -g demo -c $surname"_"$name
      echo $user":"$pass | chpasswd
      mkdir /home/$user/public_html
      chown $user:$group /home/$user
      chown $user:$group /home/$user/public_html
      chmod 755 /home/$user
      chmod 755 /home/$user/public_html
      cp index.php /home/$user/public_html/
      chmod 755 /home/$user/public_html/index.php
      chown $user:$group /home/$user/public_html/index.php
  done

----------------------------------------------------------------

Приложение Б.

Шведский социолог: через 20 лет Эстония станет богатой англоязычной страной
18.10.2012 в 09:59

  http://rus.postimees.ee/1010342/shvedskij-sociolog-cherez-20-let-jestonija-stanet-bogatoj-anglojazychnoj-stranoj/
       
Выступивший в Эстонии в рамках конференции "Шведская бизнес-награда – 2012" шведский музыкальный педагог, социолог и мыслитель Александер Бард считает, что в будущем страны Балтии станут англоязычныим, а через 20 лет они будут богатейшими в Европе.
 
Как сообщает ERR Uudised, в интервью программе "Terevisioon" на ETV он заявил, что готов биться об заклад, что в Эстонии именно так и будет, потому что за этим умозаключением стоит разумная теория: инвестиции в широкополосный интернет и образование и все, что с этим связано, – сегодня то же самое, что в XIX веке инвестиции в железные дороги, которые осуществили Северная Америка, Япония и Западная Европа, которые через 50 лет стали богатейшими в мире.

В отношении английского языка социолог сказал, что везде, особенно в малых странах, вроде Швеции и Эстонии, элита очень хорошо говорит на английском языке, у этих людей есть друзья и связи в других странах, и общение ведется на английском.

Бард отметил, что есть проблема с "отстающими", с теми, у кого мало друзей или только местный круг общения, – но в перспективе говорить на глобальном языке и на местном будет преимуществом, и в этом смысле лучше быть эстонцем, чем, скажем, англичанином.

Александер Бард является автором книги "Нетократия – новая властная элита и жизнь после капитализма", в которой проводится связь идей Ницше, Дарвина и постструктурализма с кибернетикой; кроме того он считает, что в эмиграции нет ничего плохого, потому что когда исчезают физические границы, уехавшие люди позже принесут знания и инвестиции обратно.

----------

Приложение В.

Китайский участник ролевой интернет-игры убил соотечественника за виртуальный меч
31.03.2005, 23:36:04

  http://lenta.ru/news/2005/03/31/sword/

Житель Шанхая убил своего соотечественника за "украденный" виртуальный меч, существующий лишь в онлайновой ролевой игре "Legend of Mir 3", сообщает агентство Reuters со ссылкой на китайскую газету China Daily.
 
Как известно, ролевые интернет-игры (MMORPG) получают все большую популярность, и относительно давно существует рынок виртуальных предметов, существующих только в рамках игр, которые могут продаваться "в оффлайне" за реальные деньги. В конце прошлого года американские ученые-экономисты подсчитали, что оборот глобального рынка несуществующих вещей составляет около 100 миллионов американских долларов. В декабре некий житель Австралии установил рекорд по сумме сделки подобного рода, купив за 26,5 тысяч долларов остров, существующий только в игре Project Entropia. Приобретение может принести ему прибыль, так как он может зарабатывать деньги, взимая их с других игроков, поселившихся на его острове, а игровая валюта может конвертироваться в реальные денежные единицы.
 
В рамках игры "Legend of Mir 3" участники зарабатывают игровые активы, которые позволяют им получить больше игровых возможностей. Одним из таких активов является виртуальный меч, который в феврале был получен в ходе игры одним из участников - 41-летним Цю Ченвэем - и впоследствии одолжен его другу - Чжу Цаоюаню. Однако тот вскоре продал меч "в реальной жизни" за 7200 юаней (около 870 долларов США), что и вызвало недовольство хозяина оружия. Он пришел к Чжу Цаоюаню, чтобы разобраться и сильно ударил его, что привело к смерти.

Впоследствии Цю Ченвэй добровольно сдался полиции и признал свою вину. Ему было предъявлено обвинение в умышленном нанесении телесных повреждений, но об окончательном вердикте точно неизвестно, так как китайское правосудие решает, какие именно законы могут быть применимы в данной нештатной ситуации.

----------------------------------------------------------------

Приложение Г.
   
Ветви Unix

  1. Unix V1 (1970.01.01, Bell laboratories AT&T)
  2. Berkley Unix (BSD, Networking kernel + Tools)
  3. Linux Kernel + GNU
  4. MacOSX (BSD "Darwin" + modified NextStep GUI)
  5. Sun Solaris (Processes, Threads, SubThreads)

Дистрибутивы Ubuntu и Fedora Linux

  Fedora 17 (Beefy Miracle)
  Fedora 16 (Verne)
  Fedora 15 (Lovelock)
  Fedora 14 (Laughlin)
  Fedora 13 (Goddard)
  Fedora 12 (Constantine)
  Fedora 11 (Leonidas)
  Fedora 10 (Cambridge)
  Fedora 9 (Sulphur)
  Fedora 8 (Werewolf)
  Fedora 7 (Moonshine)
  Fedora Core 6 (Zod)
  Fedora Core 5 (Bordeaux)
  Fedora Core 4 (Stentz)
  Fedora Core 3 (Heidelberg)
  Fedora Core 2 (Tettnang)
  Fedora Core 1 (Yarrow)

  Ubuntu 4.10 (Warty Warthog)
  Ubuntu 5.04 (Hoary Hedgehog)
  Ubuntu 5.10 (Breezy Badger)
  Ubuntu 6.06 LTS (Dapper Drake)
  Ubuntu 6.10 (Edgy Eft)
  Ubuntu 7.04 (Feisty Fawn)
  Ubuntu 7.10 (Gutsy Gibbon)
  Ubuntu 8.04 LTS (Hardy Heron)
  Ubuntu 8.10 (Intrepid Ibex)
  Ubuntu 9.04 (Jaunty Jackalope)
  Ubuntu 9.10 (Karmic Koala)
  Ubuntu 10.04 LTS (Lucid Lynx)
  Ubuntu 10.10 (Maverick Meerkat)
  Ubuntu 11.04 (Natty Narwhal)
  Ubuntu 11.10 (Oneiric Ocelot)
  Ubuntu 12.04 LTS (Precise Pangolin)
  Ubuntu 12.10 (Quantal Quetzal)
  Ubuntu 13.04 (Raring Ringtail)

----------------------------------------------------------------

Приложение Д.

Bourne Shell scripts

Language Dazibao:
  
  - All variables are string variables.
  - Read variable with $ prefix, write without.
  - Use build-in variables $? (exit code), $#, $0..$9
  - Understand strong - '', weak - "" and redirecting - `` 
    quotation.
  - Use expr function for arithmetics and string manipulation.
  - Use command test for logical operations and comparison. 
    Result is in $?.

1. Comments

   #!/bin/bash
   #
   # first row is telling to the system which shell should be
   # implemented with this script

2. Constant data in code

  Strings     'this is $strong quoting'  # no substitution
              "this is $weak quoting"    # values substituted
              `expr 2 + 3`               # 5 result redirected
             $(expr 2 + 3)               # 5, with XML flavour

3. Variable data in code

  All primary types of data 
      - boolean,
      - bit set,
      - finite integer, 
      - floating point number

  - are stored as formatted strings (in human readable form).
  
  - Variables does not require declaration. 
  
  - Newer versions of bash support one-dimensional arrays, aka (a[3]=Abcd)
    
  - Structures and Containers are not available.
    
      % VAR = "My variable"  # create / write
      % echo $VAR            # read
      % unset $VAR           # free memory allocated to $VAR

    Special variables

      $?       return code of the last command

      $#       number of command line arguments
      $*       whole string of arguments as one string
      $0       script filename
      $1 .. $n command line arguments

  4. Expressions

    Expressions are evaluated using expr utility
    Numeric expressions with integers: (+ - * / %)

      +    plus
      -    minus
      *    multiplication
      /    division
      %    modulo (returns the remainder of an integer division)

      % expr 18 + 4

String manipulations: (index match length substr)

  # index:  position in string of first character in substring 
  #         that matches. 
  # substr: print substring, start & length specified      
  # length: length of string                                           
  # 'match' operations similarly to 'grep'                             

  a=1234zipper43231                                                    

  # index: position in string of first character in substring 
  #        that matches.
                                         
  b=`expr index $a 23`
                                                   
  # echo numerical position of first 2 in $a is $b.                     
  # substr: print substring, start & length specified
        
  b=`expr substr $a 2 6`
  
  # echo substring of $a, starting at 2 and 6 chars long is $b
  # length: length of string
  
  b=`expr length $a`                                                   
  echo length of $a is $b.                                             
                                                                         
  # 'match' operations similarly to 'grep'
                               
  b=`expr match $a [0-9]*`
                                               
  # echo number of digits at the beginning of $a is $b.
  
  b=`expr match $a '\([0-9]*\)'`                                       
  # echo the digits at the beginning of $a are $b.                       

Strings concatination:
          
      % a="Uno"; b="Duo"; c=$a$b; echo $c   # UnoDuo
      % d="Just${c}Between"; echo $d        # JustUnoDuoBetween


5. Flow control

  Test tool
  ---------

  Use "test" named tool to evaluate expression to boolean.
  Result is returned in exit code: 0 - true, 1 - false and 
  is stored in $? special variable.

  Logical operations with exit codes

    !      logical NOT
    &&     logical AND
    ||     logical OR

    cp file1 $var || exit 1

    if [ -e file1 ] && [ -e file2 ]
    then
        echo "both files exists"
    fi

  String comparison

    -z     string is "null", that is, has zero length
    -n     string is not "null".
    =      is equal to ($a = $b)
    !=     is not equal to ($a != $b)
    \<     is less than, in ASCII alphabetical order ($a \< $b). Note that the "<" needs to be escaped.
    \>     is greater than, in ASCII alphabetical order ($a \> $b). Note that the ">" needs to be escaped.

  Filesystem

    -e    file exists

    -f    file is a regular file
    -s    file is not zero size
    -d    file is a directory
    -b    file is a block device (floppy, cdrom, etc.)
    -c    file is a character device (keyboard, sound card..)
    -p    file is a pipe
    -L    file is a symbolic link
    -S    file is a socket
       
    -r    file is readable (has read permission)
    -w    file has write permission
    -x    file has execute permission
       
    -g    group-id flag set on file
    -u    user-id flag set on file
    -k    "sticky bit" set (if user does not own a directory that has the sticky bit set, she cannot delete files in it, not even files she owns)
       
    -O    you are owner of file
    -G    group-id of file same as yours
       
    -t n  file descriptor n is open. This usually refers to 
          stdin, stdout, and stderr (file descriptors 0 - 2).
       
    f1 -nt f2    file f1 is newer than f2
    f1 -ot f2    file f1 is older than f2

    f1 -ef f2    files f1 and f2 are links to the same file
       
  Integer comparison

    -eq    is equal to ($a -eq $b)
    -ne    is not equal to ($a -ne $b)
    -gt    is greater than ($a -gt $b)
    -ge    is greater than or equal to ($a -ge $b)
    -lt    is less than ($a -lt $b)
    -le    is less than or equal to ($a -le $b)

  Logical expressions

    (expression)   override normal precedence of the operators
    ! expression   logical not
    -a             logical and
    -o             logical or

Operators
---------

  exit N   - exit script with exit code N

  if test expression
  then
    ...
  fi

  while test expression        until test experssion
  do                           do
    ...                          ...
  done                         done

  break    - use this operator to exit do - done loop
  continue - use this operator to resume next iteration

  for vVar in 1 2 4 8          
  do                           
    echo $vVar                 
  done

  Note 1: Use 
              for vVar in *; do ... ;done

          to iterate in directory of files

  Note 2: Use seq tool to generate lists
          seq 5     # (stop)             1 2 3 4 5
          seq 3 5   # (start stop)       3 4 5
          seq 3 2 7 # (start step stop)  3 5 7

          Several operators on the same row should be 
          separated by ;

          for vVar in Alpha Beta Gamma; do
            echo $vVar
          done

  case $vVar in
    "$condition1" )
      command...
    ;;
 
    "$condition2" )
      command...
    ;;
  esac

  Example

    #!/bin/bash                                                             
    case $1
      [a-z]   ) echo "Lowercase letter";;                            
      [A-Z]   ) echo "Uppercase letter";;                            
      [0-9]   ) echo "Digit";;                                       
      *       ) echo "Punctuation, whitespace, or other";;           
    esac                                                             
    # Allows ranges of characters in [square brackets].              

6. Visibility and encapsulation

   - Write each function in separate file.

   - If only script ascript uses function foo, ascript_foo name is recommended for this function. Otherwise anamespace_foo name is good for functions used in more than one script.
    
   - Also ugly and useless function implementation was introduced in late versions of Bourne Shell (after 1979).

       foo () {                                                                   
         # Checks if any params.                                                   
         if [ -z $1 ]                                                              
         then                                                                      
           echo "No parameters passed to function."                                
           return 0                                                                
         else                                                                      
           echo "Param #1 is $1."                                                  
           return 1
         fi                                                                        
       }

       foo
       foo abc                                                                           

----------

How to insert data

  - from command prompt

    % read a # now write the value for just created a variable
    % echo $a
    % echo # wait for key is pressed

  - inside script source

    cat > /etc/resolv.conf <".

  - exec

    #!/bin/sh

    group=pa05b
    exec < pa05b_people
    while read user pass surename name
    do
        useradd $user -g 1009 -c $surename"_"$name
        echo $user":"$pass | chpasswd
        mkdir /home/$user/public_html
        chown $user:$group /home/$user
        chown $user:$group /home/$user/public_html
        chmod 755 /home/$user
        chmod 755 /home/$user/public_html
        cp index.php /home/$user/public_html/
        chown $user:$group /home/$user/public_html/index.php
    done

----------

Приложение Е.

Binary tools recommended for portable Unix scripts:

  echo        TRUE         cp          touch
  cat         FALSE        mv          tar  
  tr                       ln          cmp  
  sed         expr         rm          diff 
  awk         test         mkdir       egrep
              seq          rmdir       grep 
                           ls          sort 
                           pwd         sleep     
     
----------

ПрилоЖение Ж. Настройка ядра Linux.

cp vmlinuz.config /usr/src/linux-2.6.14/.config

  make oldconfig
  make menuconfig

    Ethernet (10 or 100Mbit)
      [*] AMD PCnet32 PCI support

    Graphics support  --->
      [*] Support for frame buffer devices
      [*]   VESA VGA graphics support
          Console display driver support  --->
          [*]   Video mode selection support
          <*> Framebuffer Console support

    File systems
      [*] reiserfs
      [*] minix
      [*] DOS/FAT/NT
          [*] MSDOS
          [*] VFAT
          [*] NTFS
              [*] NTFS Write support

      Pseudo filesystems
         [*] Virtual memory filesystem (CONFIG_TMPFS=yes)

    Devices
      Input Devices
         [*] Mouse Interface
         [*] Provide legacy /dev/psaux support
         ...
         [*] Mouse --->

  make

  cp arch/.../bzImage /boot/linux-2.6.14.2

  vi lilo.conf

    # global settings

    boot=/dev/hda
    prompt
    timeout=50

  # colour depth  | 640x480 800x600  1024x768 1280x1024
  # --------------+------------------------------------
  # 256     (8bit)|  769      771       773      775
  # 32767  (15bit)|  784      787       790      793
  # 65535  (16bit)|  785      788       791      794
  # 16.7M  (24bit)|  786      789       792      795

    vga=789

    # per-image settings

    image=/boot/linux-2.6.14
        label=linux
        root=/dev/hda1
        read-only

4. Create fb devices

     mknod /dev/fb0 c 29 0
     ln -s /dev/fb0 /dev/fb0current

  fb devices

    http://www.charmed.com/txt/framebuffer.txt
    http://www.cs.wisc.edu/~johnbent/thinkpad/

Building package from sources, install, uninstall

  ./configure
  make
  make install

  make clean
  make mrproper

  make uninstall
  cd ..
  rm –rf <package_name>

----------

Приложение З.

Linux packaging info

  http://www.pixelbeat.org/docs/packaging.html

install/upgrade package file(s)

  dpkg -Gi package(s).deb   
  rpm -Uvh packages(s).rpm

remove package

  dpkg -r package   
  rpm -e package
    
show all packages (names only)

  dpkg-query --showformat='${Package}\n'

show all packages whose names contain the word spell

  dpkg -l '*spell*' 
  rpm -qa '*spell*'
  
show version of package installed

  dpkg -l package   
  rpm -q package    

show all package metadata

  dpkg -s package   
  rpm -q -i package

what package does file belong

  dpkg -S /path/file    
  rpm -q -f /path/file

list where files were installed

  dpkg -L package   
  rpm -q -l package

list where files would be installed

  dpkg -c package.deb   
  rpm -q -l -p package.rpm

list files/packages that package needs

  dpkg -s package | grep ^Depends:  
  rpm -q --requires package 

list packages that need package (see also whatrequires)

  dpkg --purge --dry-run package    
  rpm -q --whatrequires package 


  leaves (debian)
  #!/bin/bash
  # discover leafs on the package three

  for i in `dpkg-query --showformat='${Package}\n' --show`
  do 
      dpkg --purge --dry-run $i 2> /dev/null 1| grep "^Would remove or purge"
  done
