Содержание


Инструменты ОС Linux для разработчиков приложений для ОС Windows. Часть 3. Ключевые системные файлы и каталоги

Comments

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

Каталог устройств /dev

Как уже отмечалось, в UNIX всё (или почти всё) отображается в путевое имя в файловой системе и представляется в виде файла. Так, аппаратные устройства отображаются в виде имён в каталог /dev. Здесь представлены все доступные системе логические устройства (некоторые из них соответствуют реальным физическим устройствам, другие нет). Каждое именованное устройство в Linux однозначно характеризуется двумя номерами (байтовыми: 0...255): старшим номером (major), отвечающим за отдельный класс устройств, и младшим номером (minor), определяющим конкретное устройство внутри своего класса. Задать пару номеров (major, minor) в Linux — это значит однозначно определить конкретное устройство, а имя вида /dev/* является только синонимом этой пары для удобства восприятия человеком. Первоначально, за каждым конкретным типом устройства, которое могло бы присутствовать в системе, резервировалась фиксированная пара (major, minor). Но это приводило к исчерпанию диапазонов номеров, и в настоящее время, с разработкой подсистем /sys и /udev, номера большинства устройств присваиваются динамически во время загрузки.

Примечание: Порядок присвоения номеров (major, minor) для устройств, которым они присваиваются статически, строго регламентирован, а перечень устройств и соответствующих им номеров поддерживается в постоянно обновляемом файле devices.txt в каталоге Documentation исходных кодов ядра Linux.

Система текстовых консолей – это одна из старейших подсистем устройств Linux, практически не менявшаяся с момента своего появления:

$ ls -l /dev/tty*
crw--w---- 1 root root    4,  0 Июл 31 10:42 /dev/tty0
crw--w---- 1 root root    4,  1 Июл 31 10:42 /dev/tty1
...
crw--w---- 1 root tty     4, 63 Авг 31 16:04 /dev/tty63
...
crw-rw---- 1 root dialout 4, 64 Авг 31 16:04 /dev/ttyS0
...
crw-rw---- 1 root dialout 4, 67 Авг 31 16:04 /dev/ttyS3

Выше показано, что в системе Linux может присутствовать (зарезервированы имена и номера) до 63 текстовых консолей, консоль /dev/tty0 используется для служебных целей. Также имеются и 4 устройства последовательных каналов RS-232 (или RS-485) с именами вида /dev/ttyS*. Представление последовательных каналов в виде терминалов (или наоборот) служит примером статического распределения (major, minor). Численные значения (64, 4) здесь соответствуют максимально возможному числу зарезервированных устройств, независимо от их реального наличия. Последовательные линии часто используются во встраиваемых системах, и, напротив, в крупных специальных серверах. Определить (и изменить) параметры настройки последовательной линии, а также проверить её наличие в системе, можно командой stty.

Примечание. В текстовые консоли /dev/ttyN (обычно их число 6 или 8, но это можно изменить c помощью конфигурации) можно временно переключиться из графического окружения Linux одновременным нажатием клавиш <Ctrl><Alt><Fn>. Это ещё одно доказательство того, что Linux/UNIX — это текстовая система, а её графическое окружение X11 является надстройкой пользовательского уровня.

Современные подсистемы устройств распределяют номера (major, minor) динамически. Каждое именованное устройство в Linux принадлежит к символьным (потокового, байтового ввода/вывода) или блочным устройствам (устройства прямого доступа). Это отображается 1-м ведущим символом (c или b) в выводе команды ls -l. Блочные и символьные устройства могут иметь одинаковые старшие номера (major), они исчисляются из разных пространств нумерации устройств, например:

$ ls -l /dev/ | grep 1,
crw-rw-rw-  1 root root        1,   7 Авг 31 16:04 full
crw-rw----  1 root root        1,  11 Авг 31 16:04 kmsg
brw-rw----  1 root disk        1,   1 Авг 31 16:04 ram1
brw-rw----  1 root disk        1,  10 Авг 31 16:04 ram10
...

Но в каждом из этих подмножеств не может быть двух устройств с полностью идентичным набором номеров (major, minor).

Одним из важнейших классов являются устройства хранения — накопители прямого доступа (блочные устройства), например, дисковые накопители на контроллере SATA:

$ ls -l /dev/sd*
brw-rw---T 1 root disk 8, 0 Окт 18 11:15 /dev/sda
brw-rw---T 1 root disk 8, 1 Окт 18 11:16 /dev/sda1
...

Примечание: Имя устройства, следующее после /dev (sd* в частности) определяется драйвером (модулем ядра), который поддерживает это устройство. Для EIDE дисков это будет /dev/hd*. Для USB флеш-накопителей это тоже будет /dev/sd*, так как sd* — это имена для устройств, поддерживаемых драйвером SCSI-устройств, который кроме SATA и USB флеш-накопителей поддерживает и работу твёрдотельных SSD-дисков. Но накопители на SD-карте будут представляться уже по-другому, так как поддерживаются другим модулем-драйвером.

А вот как может отображаться CD/DVD-привод, потому что независимо от драйвера и фактического имени в Linux для этого устройства принято делать ссылку /dev/cdrom:

$ ls -l /dev/cdrom /dev/sr*
lrwxrwxrwx  1 root root      3 Окт 18 11:15 /dev/cdrom -> sr0
brw-rw---T+ 1 root cdrom 11, 0 Окт 18 11:15 /dev/sr0

Номер в имени дискового устройства после /dev/sd* (/dev/sda2, /dev/sda3 и т.д.) представляет раздел (partition) этого диска. Так можно посмотреть геометрию диска:

$ sudo fdisk -l /dev/sda

Disk /dev/sda: 60.0 GB, 60022480896 bytes
255 heads, 63 sectors/track, 7297 cylinders, total 117231408 sectors
...
Disk identifier: 0xd961d961

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    81922047    40960000   83  Linux
/dev/sda2   *    81922048   113172479    15625216   83  Linux
/dev/sda3       113172480   117229567     2028544   82  Linux swap / Solaris

В показанном примере для работы с геометрией диска использовалась утилита fdisk. Это далеко не единственная подобная утилита, также можно упомянуть parted, gparted, gdisk.

До самого последнего времени (на протяжении более 30 лет) существовал так называемый MBR (Master Boot Record) стандарт разбиения диска. Он допускал не более 4-х первичных (primary) разделов, но позже были введены расширенные (extended) разделы, один расширенный раздел может содержать ещё до 4-х логических (logical).

Таким образом, считается, что MBR-диск может содержать до 4-х первичных разделов, или до 3-х первичных и 4-х логических в расширенном разделе, итого 7. Кроме ограничений, накладываемых утилитами разметки диска, максимальное число разделов на диске может ограничиваться в коде конкретного модуля ядра Linux, реализующего драйвер для этого типа устройств. Было создано несколько сторонних программных проектов, реализующих большее число разделов диска, но все они выходят за пределы MBR-стандарта и несовместимы между собой.

Начиная с 2013г. производители начали массово переходить на новый стандарт разбивки диска на разделы — GPT (GUID Partititon Table), который является составной частью новой системы загрузки EFI/UEFI, замещающей BIOS. У GPT много отличий, связанных с обеспечением надёжности и др., но для нашего обзора существенными являются следующие особенности:

  1. поддержка дисков очень больших размеров, на которых могут создаваться разделы столь же больших размеров;
  2. допускается создание только первичных разделов, устраняется громоздкость, вызванная введением расширенных и логических разделов;
  3. может быть создано до 128 первичных разделов.

Многие современные утилиты для разметки дисков MBR-стандарта, например, fdisk, не могут работать с дисками с GPT-разметкой. Но для GPT-дисков доступно много других инструментов: новая утилита gdisk, и, с некоторыми малозначительными ограничениями, утилиты parted и gparted. Ниже представлен пример GPT-разметки USB флеш-накопителя на несколько небольших разделов.

# parted /dev/sdb
GNU Parted 3.0
Используется /dev/sdb
Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд.
(parted) print
Модель: Ut163 USB2FlashStorage (scsi)
Диск /dev/sdb: 1011MB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt
Disk Flags: 

Номер Начало Конец  Размер Файловая система Имя                  Флаги
1     1049kB 53,5MB 52,4MB fat16            EFI System           загрузочный...
10    53,5MB 578MB  524MB  ntfs             Microsoft basic data
20     578MB 1011MB 433MB  ext4             Linux filesystem

Столь подробное описание способов разбиения дисковых устройств связано с тем, что когда данные изменения будут применены повсеместно, это приведёт к изменению почти всей IT-инфраструктуры. Главным же выводом является то, что инструмент для работы с разметкой диска должен соответствовать стандарту, используемому на диске: MBR или GPT. При недостаточно тщательном подходе к этому вопросу можно потерять всё содержимое диска без возможности восстановления.

Конфигурации файлы в системе /etc

В большинстве своём конфигурационные файлы POSIX-систем – это обычные текстовые файлы, благодаря чему с ними можно работать с помощью любого текстового редактора.

Выше уже упоминался /etc/fstab - файл описания устройств, постоянно смонтированных в системе.

В файле /etc/exports хранится список локальных каталогов файловой системы, разделяемых через сетевую файловую систему NFS и параметры этого разделения.

Файл /etc/hosts.conf используется для установки порядка разрешения сетевых имён: сначала осуществляется поиск в локальном файле /etc/hosts, и только затем при неудаче происходит обращение к DNS:

$ cat /etc/host.conf
order hosts,bind

Сам локальный файл /etc/hosts представляет собой построчный список IP-адресов и их доменных имён:

$ cat /etc/hosts
127.0.0.1       localhost.localdomain   localhost    home
192.168.1.9     notebook   notebook.localdomain
...

В системе обязательно должен быть определён петлевой адрес IP (127.0.0.1 или вообще любой 127.*.*.*), так как графическая подсистема Linux X11 является сетевой подсистемой, при отсутствии доступности петлевого интерфейса графическая система (при некоторых настройках) может оказаться совершенно неработоспособной.

В файле /etc/services хранятся символьные имена всех сетевых сервисов (протоколов), и используемые их транспортными протоколами (TCP и UDP) порты:

Файлы /etc/passwd и /etc/shadow содержат списки пользователей и учётные данные пользователей. Эти файлы редко используются напрямую, но могут послужить источником информации о существующих пользователях. Точно так же, файл /etc/group содержит информацию о группах пользователей и о принадлежности пользователей к различным группам.

Часто бывает так, что по мере развития проекта и усложнения его конфигурации его конфигурационный файл /etc/XYZ.conf превращается в каталог /etc/XYZ.d, а все конфигурационные файлы, входящие в этот каталог, последовательно (в алфавитном порядке их имён) считываются и включаются в конфигурацию проекта. Из-за этой особенности часто возникают несоответствия между документацией (описывающей файл /etc/XYZ.conf) и реальным положением дел (каталог /etc/XYZ.d).

Также в /etc хранится конфигурация пакетного менеджера, используемого данным дистрибутивом, и описание используемых им сетевых репозиториев. Ниже показан пример для дистрибутивов основанных на .rpm формате пакетов (RedHat, Fedora, CentOS, ...):

$ ls /etc/yum*
/etc/yum.conf  /etc/yumex.conf  /etc/yumex.profiles.conf
/etc/yum:
pluginconf.d  yum-updatesd.conf
/etc/yum.repos.d:
adobe-linux-i386.repo  CentOS-Media.repo  epel-testing.repo  livna.repo
...

Для дистрибутивов с пакетной системой .deb (Debian, Ubuntu, …) конфигурацию пакетного менеджера можно найти уже в каталоге /etc/apt.

В каталоге /etc находится и конфигурация суперсервера xinetd, который является незаменимым инструментом для разработки и тестирования в сетевых проектах:

$ ls /etc/xinet*
/etc/xinetd.conf
/etc/xinetd.d:
chargen-dgram   daytime-stream  echo-stream   klogin       rsync
...

Суперсервер xinetd пришёл на смену более ранней реализации inetd, которая и сегодня используется в некоторых POSIX-системах и встраиваемых Linux-системах. Конфигурация inetd хранится в файле /etc/inetd.conf. Но, начиная с 2013г, в состав многих дистрибутивов стали включать новый сервис systemd, способный обеспечить, кроме всего прочего, и некоторую ограниченную функциональность, традиционно реализуемую суперсерверами.

Обмен информацией между ядром и пользовательскими приложениями

Интерфейс к путевым именам в /proc (файловая система procfs) и его более современный аналог /sys (файловая система sysfs) служат каналами для обмена диагностической и управляющей информацией между ядром, его модулям и приложениями пространства пользователя. Этот способ взаимодействия с системой предназначен для замены устаревшего и небезопасного механизма вызовов ioctl() для устройств.

Каталог /proc содержит, в первую очередь, множество подкаталогов вида /proc/#, где число # - это PID для каждого исполняющегося процесса в системе. В этих каталогах содержится системная runtime информация для всех выполняющихся процессов пользовательского адресного пространства.

Другие файловые имена в каталоге /proc содержат диагностическую информацию о разных аспектах работы системы и её аппаратного обеспечения (эта информация доступна, в большинстве, только для чтения).

Например, в каталоге /proc/cpuinfo можно получить информацию об используемом процессоре:

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 8
model name      : Celeron (Coppermine)
...

Пользуясь этой информацией можно динамически определить число процессоров (ядер) на оборудовании, на котором в данный момент запущено приложение:

$ cat /proc/cpuinfo | grep 'model name' | wc -l
4

Там же находится и информация об устройствах системы, дополняющая сведения из каталога /dev:

$ cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
...
Block devices:
  1 ramdisk
  2 fd
  3 ide0
...

В файле interrupts хранится информация о линиях прерываний и счётчиках обслуженных прерываний по каждому процессору, которая незаменима при разработке драйверов:

$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  0:         59          0          0          0   IO-APIC-edge      timer
  1:       2669       5453          0          0   IO-APIC-edge      i8042
  4:          2          0          0          0   IO-APIC-edge    
  7:          0          0          0          0   IO-APIC-edge      parport0
  8:          1          0          0          0   IO-APIC-edge      rtc0
  9:          1          0          0          0   IO-APIC-fasteoi   acpi
 ... 
 27:         91          0       7441          0   PCI-MSI-edge      eth0
NMI:          0          0          0          0   Non-maskable interrupts
LOC:     283252     294363     216711     205866   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
 ... 
MCP:         12         12         12         12   Machine check polls

В файле dma хранится информация о каналах DMA.

Подробные сведения о сляб-аллокаторе (динамическом распределителе памяти) можно найти в файле slabinfo.

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

$ cat /proc/modules
mga 62145 3 - Live 0xd0b63000
drm 65493 4 mga, Live 0xd0b52000
cisco_ipsec 601788 0 - Live 0xd0c01000 (PU)
ne2k_pci 14625 0 - Live 0xd0ae0000
...
scsi_mod 134605 4 sg,usb_storage,libata,sd_mod, Live 0xd0870000
ext3 123593 1 - Live 0xd0895000

В файле kallsyms находится список всех символьных имён (точек входа) загруженного ядра Linux, также необходимый при разработке модулей ядра и драйверов. В этом файле может быть несколько десятков тысяч строк, поэтому при работе с ним целесообразно использовать фильтры, отбирающие только нужную информацию:

$ cat /proc/kallsyms | grep T | head -n10
c0400000 T startup_32
c0400000 T _text
c0401000 T wakeup_pmode_return
c04010c0 T do_suspend_lowlevel
c04010e0 T _stext
...

Существует непонятное заблуждение, с которым не раз встречался автор, что файловая система /proc — предназначена только для чтения (диагностики), а /sys — и для чтения и для записи. Это принципиально неверно! В файловой системе /proc присутствует множество псевдоимён, отображающих определённые конфигурационные параметры системы, которые можно изменять, "на лету" меняя конфигурацию системы.

$ cat /proc/sys/vm/swappiness
60
# echo 10 > /proc/sys/vm/swappiness
$ cat /proc/sys/vm/swappiness
10

Показанным способом можно изменить процент свободной RAM (с 60% до 10%), с которого система начинает виртуализировать страницы физической памяти в swap-пространство на диске. Таким способом иногда можно значительно повысить производительность рабочей станции (но не сервера).

Особенно интересен в этом смысле каталог /proc/sys, в котором хранится большое количество конфигурационных параметров системы. Например, в каталоге /proc/sys/net содержатся все параметры, определяющие в ядре работу сетевой подсистемы, и большинство этих параметров доступны и по чтению и по записи, что позволяет конфигурировать сетевую подсистему "на лету". Эти параметры собраны в каталоги по функциональной принадлежности:

$ ls -l /proc/sys/net
dr-xr-xr-x 0 root root 0 Сен 27 23:32 bridge
dr-xr-xr-x 0 root root 0 Сен 27 23:32 core
dr-xr-xr-x 0 root root 0 Сен 27 23:32 ipv4
dr-xr-xr-x 0 root root 0 Сен 27 12:55 ipv6
dr-xr-xr-x 0 root root 0 Сен 27 23:32 netfilter
-rw-r--r-- 1 root root 0 Сен 27 23:32 nf_conntrack_max
dr-xr-xr-x 0 root root 0 Сен 27 23:32 unix

С помощью этих параметров, например, можно разрешить (или запретить) сетевой форвардинг (транзитную передачу пакетов между интерфейсами) для протокола IPv4:

$ echo 1 > proc/sys/net/ipv4/ip_forward
$ echo 0 > proc/sys/net/ipv4/ip_forward

Заключение

В упомянутых выше каталогах сосредоточено управление практически всеми параметрами ОС, и их настолько много, что для описания этих возможностей существуют отдельные руководства (см. раздел "Ресурсы"). Детальное назначение сотен параметров в /proc — это отдельная тема для изучения, но углубление в неё увело бы нас очень далеко от первоначальной цели. Разработчики модулей ядра могут добавлять свои собственные произвольные имена в /proc для диагностики или управления внутренними состояниями своих модулей, но сейчас для этой цели чаще используется система /sys.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=967892
ArticleTitle=Инструменты ОС Linux для разработчиков приложений для ОС Windows. Часть 3. Ключевые системные файлы и каталоги
publish-date=04082014