Структура и значение директорий в Linux

Введение в файловую систему

Операционная система (далее - ОС) Linux поддерживает множество файловых систем , в настоящее время наиболее широко используются: ext2, ext3,ext4, reiserfs . Так же, современные ОС Linux совместимы с файловыми системами (ФС далее), используемыми ОС Windows, такими как NTFS и FAT32 , но использование данных ФС в Linux крайне не желательно по причине того, что данные ФС разрабатывались под ОС Windows и поддержка Windows-разделов ядром Linux реализована с помощью сторонних утилит/драйверов/модулей, что накладывает некоторые ограничения (например, согласно проекту Linux-NTFS на момент написания статьи на разделах с NTFS поддерживается практически только чтение (запись - лишь в существующие файлы без изменения их размера), так же ОС Linux не имеет возможности разграничивать права доступа к файлам на разделах NTFS. Данная ситуация со временем может поменяться.

Базовые понятия

Начну с общей структуры файловой системы . ФС Linux/UNIX физически представляет собой пространство раздела диска разбитое на блоки фиксированного размера, кратные размеру сектора - 1024, 2048, 4096 или 8120 байт. Размер блока указывается при создании файловой системы.

Управлением обмена данными между ядром/приложениями и собственно байтами на диске занимается 2 базовых технологии, называемые виртуальная файловая система (VFS) и драйверы файловых систем . Виртуальная файловая система - это часть ядра linux, которая является неким абстрактным слоем (интерфейсам взаимодействия, если хотите) между ядром и конкретной реализацией файловой системы (ext2, fat32...). Данная технология позволяет ядру и приложениям взаимодействовать с файловой системой не учитывая подробностей работы конкретной файловой системы и управлять файловыми операциями с помощью типовых команд - прозрачно. Часто, VFS называют виртуальный коммутатор файловых систем. Виртуальная файловая система так же осуществляет стыковку блочных устройств с имеющимися файловыми системами.

Список поддерживаемых Вашим ядром Linux файловых систем можно увидеть в файле /proc/filesystems .

Структура каталогов и другие базовые понятия

Структуру каталогов , в общем случае можно представить в виде следующей схемы:

Данная схема отображает то, что у одного объекта файловой системы (файла) может быть несколько путей. Грубо говоря, несколько файлов в структуре каталогов Linux могут быть физически одним файлом на диске. Или же другими словами, 1 физический файл на диске может иметь несколько имен (путей). Это достигается тем, что в файловой системе каждый файл идентифицируется уникальным номером , называемым Inode (инод = Индексный дескриптор ).

Отсюда можно сделать вывод, что структура файловой системы отчасти иерархична. Или лучше сказать - "перекрестно-иерархическая", потому что дерево иерархии за счет того, что один объект может иметь несколько путей, может пересекаться.

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

/- |-/etc-|-/etc/X11-|-/etc/X11/xinit.d | | |-... | |-files | |-... |-/opt |-/home <- |-/user1-|-/user1/Desktop # примонтированный раздел ext3, | | |-/user1/Documents # содержащий свое дерево каталогов | | |-... # (/home - точка монтирования) | |-/user2 | |-.... |-/usr |-/var

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

Примечание. Вообще говоря, привязываться к блочному устройству в данном случае не обязательно. Устройство, которое монтируется может быть не только блочным. Может быть, например, сетевым (если монтируется NFS или SMB\CIFS).

Посмотреть сколько файл имеет ссылок и инод файла можно командой:

$ ls -li 193 drwxr-xr-x 1 mc-sim root 368 Mar 30 2008 bin 1 drwxr-xr-x 1 mc-sim root 0 Jan 1 1970 dev 197 lrwxrwxrwx 1 mc-sim root 7 Mar 30 2008 etc -> tmp/etc ....

в приведенном примере первый столбец (значения 193,1,197) есть инод , а третий столбец (значения 1) есть количество ссылок на файл (читаем: путей файла ).

Инод , как уже говорилось, уникален в пределах определенной файловой системы и содержит следующую информацию :

  • о владельце объекта ФС
  • последнем времени доступа
  • размере объекта ФС
  • указании файл это или каталог
  • права доступа
Структура и описание каталогов Linux
. ссылка на текущий каталог. Данный элемент есть в каждом каталоге файловой структуры.
.. ссылка на родительский каталог. Данный элемент есть в каждом каталоге файловой структуры. (в корне - / данный элемент указывает на саму корневую систему)
/ корневой каталог ФС, сюда "завязаны" все остальные подкаталоги первого уровня
/bin/ Бинарные программы, основные программы для работы в системе: командные оболочки, файловые утилиты и.т.д.
/boot/ статичные файлы загрузчика (образ ядра, файлы GRUB, LILO)
|-- /grub/
|-- /lilo/ Каталог конфигурационных файлов
| config-kern_ver файл текущей конфигурации ядра
| initrd.img-kern_ver загрузочный образ инициализации initrd
| vmlinuz-kern_ver образ ядра Linux
/dev/ каталог, содержащий файлы устройств.
В Linux вообще всё рассматривается, как файл, даже различные устройства, такие как принтеры, жёсткие диски, сканеры и т.д. Для получения доступа к определённому устройству, необходимо чтобы существовал специальный файл. Аналогично устроено большинство UNIX-подобных операционных систем
|-- /pts/ фиктивная файловая система, представляющая собой файловую структуру, которая отражает псевдотерминалы пользователей вошедших в систему
| |-- 0 устройство псевдотерминала pts/0
| |-- 1 устройство псевдотерминала pts/1
| --- n устройство псевдотерминала pts/n
|-- null т.н. "черная дыра" или "урна для битов". Вся информация, отправляемая на данное устройства - пропадает/уничтожается.
--- zero "генератор нулей"
/etc/ Системные конфигурационные файлы, стартовые сценарии, конфигурационные файлы графической системы и различных приложений. Из данного каталога хотелось бы выделить следующие файлы:
|-- /default/ содержит системные Файлы конфигураций в дистрибутивах Debian (аналог /etc/sysconfig/ в RedHat)
|-- /logrotate.d/ директория конфигурационных файлов демона автоматической обработки логов;
| |-- apache
| |-- squid конфигурация логирования apache
| |-- syslog конфигурация логирования системных логов
| --- ...
|-- /pam.d/ каталог содержит файлы конфигурации PAM (указывают методы аутентификации в приложениях, использующих PAM)
|-- /ppp/ директория содержит конфигурации PPP-соединений:
| |-- options содержит общую для всех PPP-соединений конфигурацию;
| |-- options.* конфигурация конкретно взятого соединения (например модемное options.ttyS1)
| |-- ip-up скрипт выполняемый при/для соединения (демоном pppd);
| --- ip-down скрипт выполняемый при/для разъединении (демоном pppd).
|-- /rc.d/ директория системы (содержит сценарии инициализации)
| |-- /init.d/ содержит скрипты, для управления системными демонами (сервисами);
| --- /rcX.d/ директории уровней запуска X, содержат ссылки на скрипты в init.d;
|-- /samba/ содержит файлы конфигурации samba:
| |-- smb.conf главный конфигурационный файл SAMBA;
| |-- smbusers описывает соответствие SAMBA пользователей к системным пользователям;
| --- smbpasswd содержит хеши пользователей SAMBA, пароли устанавливаются утилитой smbpasswd.
|-- /ssh/ Каталог конфигурации демона sshd
| |-- ssh_config Конфигурационный файл ssh клиента
| --- sshd_config Конфигурационный файл ssh - сервера
|-- /sysconfig/ содержит системные Файлы конфигураций в дистрибутивах RedHat (аналог /etc/default/ в Debian)
| |-- keyboard описание текущей раскладки клавиатуры;
| |-- desktop установки графической среды (KDE,GNOME..);
| |-- network файл конфигурации сетевой подсистемы
| --- i18n конфигурация общесистемной локали (локаль отдельных пользователей может содержаться в {home}/i18n);
|-- /security/ содержит Файлы описывающие безопасность системы:
| |-- console.perms правила изменения прав доступа к устройствам, при аутентификации;
| |-- limits.conf конфигурация лимитов пользователей.
| --- network конфигурация сети;
|-- /skel/ шаблон директории пользователя (в момент создания пользователя содержимое директории пользователя копируется отсюда), своеобразный аналог каталога C:\Documents and settings\Default User\ в Windows.
|-- /xinetd.d/ директория содержит файлы конфигураций отдельных сервисов для суперсервера xinetd;
|-- /X11/ /fs/config содержит перечень каталогов со шрифтами для X;
| |-- XF86Config Файл конфигурации X (XFree86);
| --- xorg.conf Файл конфигурации X (XOrg);
|-- at.allow Список пользователей, разрешающий (allow) или запрещающий (deny) выполнение утилиты at
|-- at.deny
|-- cron.allow Список пользователей, разрешающий (allow) или запрещающий (deny) выполнение
|-- cron.deny
|-- anacrontab конфигурация задач выполняемых anacron;
|-- crontab конфигурация задач выполняемых cron;
|-- ethers Файл соответствия аппаратных MAC адресов сетевым IP адресам в сети, в случае несоответствия доступ для хоста будет закрыт;
|-- export конфигурация NFS-ресурсов доступных извне;
|-- filesystems список ФС, поддерживаемых ядром (отсюда берется ФС, если она не указана в /etc/fstab)
|-- fstab список ФС, монтирующихся автоматически при загрузке
|-- group база данных
|-- gshadow файл паролей групп пользователей
|-- hostname текущее имя машины;
|-- hosts перечень хостов и соответствующих им IP-адресов;
|-- host.allow список хостов которым вход разрешен;
|-- host.deny список хостов которым вход запрещен (для libc ver 5);
|-- host.conf указывает где и в каком порядке искать имена хостов (для libc ver 6);
|-- inittab ;
|-- inputrc конфигурация ресурсов ввода с клавиатуры;
|-- issue сообщение, выводимое при локальном подключении к системе
|-- issue.net сообщение, выводимое при удаленном подключении к системе
|-- ld.so.conf файл конфигурации, содержащий список каталогов, в которых , кроме указанных путей, компоновщик ищет в каталогах /lib и /usr/lib
|-- ld.so.cache кэш библиотечных файлов, для более быстрого поиска библиотек (своеобразный индекс)
|-- login.defs описывает поведение login и su;
|-- logrotate.conf конфигурация демона
|-- lilo.conf конфигурация boot-загрузчика LILO;
|-- man.conf конфигурация системы страниц помощи, команда man;
|-- motd сообщение, выводимое всем пользователям после ввода пароля и перед запуском интерпретатора, т.н. "сообщение дня"
|-- mtab Список текущих примонтированных ФС. Обычно, этот файл должен создаваться, как только монтируется новая файловая система.
|-- netgroup файл определяет сетевые группы, используемые для проверки прав доступа при выполнении удаленного входа.
|-- nologin наличие этого файла запрещает пользователям входить в систему с выдачей сообщения в файле;
|-- nsswitch.conf конфигурация последовательности поиска имен по различным источникам;
|-- passwd
|-- printcap Файл конфигурации принтеров;
|-- profile сценарий-профиль для интерпретатора BASH (выполняется после регистрации в системе и используется для всех пользователей системы);
|-- protocols файл описывает номера протоколов, названия и описания.
|-- resolv.conf конфигурация резолвера имён, содержит список DNS-серверов;
|-- rpc файл описывает службы RPC (соответствие имя сервера RPC, номер программы RPC и псевдонимы)
|-- services содержит сопоставления номеров портов/сокетов именам служб
|-- shadow
|-- sysctl.conf содержит команды для автоматической инициализации sysctl-параметров ядра;
|-- syslog.conf конфигурация демона системного логера (syslogd);
|-- sudoers указание на то какие пользователи и какие программы могут быть запущены с привилегиями root используя sudo.
--- xinetd.conf конфигурация суперсервера Internet (централизованное управление сокетами/портами);
/home/ {имя_юзера} каталог, содержащий подкаталоги пользователей (настройки интерфейса, личные файлы)
|-- .bashrc профиль конкретного пользователя для BASH (запускается при запуске bash или запуске копии bash);
|-- .cshrc профиль конкретного пользователя для TCSH;
|-- .bash_profile профиль конкретного пользователя для BASH (запускается при каждом входе в систему).
|-- .inputrc конфигурация ресурсы ввода с клавиатуры конкретного пользователя.
|-- .Xauthority файл авторизации для запуска X-приложений удаленно, файлы на удаленных машинах должны соответствовать;
|-- .xinitrc сценарий загрузки X сервера конкретного пользователя;
--- .plan
.project
.forward
данные файлы используются утилитой finger для вывода информации о пользователе
/lib/ Системные библиотеки, необходимые для программ и модули ядра. (В Windows библиотеки представляют собой dll модули)
/lost+found В lost+found скидываются файлы, на которых не было ссылок ни в одной директории, хотя их inod не были помечены как свободные.
/media/ Каталог для монтирования съемных носителей (CD, Flash)
|-- /cdrom/
/mnt/ В каталоге содержаться временные точки монтирования для устройств
/opt/ Дополнительные пакеты программ. Если программа установленная сюда больше не нужна, то достаточно удалить ее каталог без процедуры денсталляции. Сюда могут устанавливается программы не являющиеся частью дистрибутива. (например /opt/openoffice.org).
/proc/ Виртуальная ФС, хранящаяся в памяти компьютера при загруженной ОС. В данном каталоге расположены самые свежие сведения обо всех процессах, запущенных на компьютере. Содержимое каждого файла определяется в реальном времени. среди данного каталога, хотелось бы особо выделить следующие файлы и каталоги:
|-- /net/
| -- arp текущая arp-таблица
|-- /sys/kernel/
| |-- cap-bound управление дополнительными пра, как сделано в последней строке для дискеты.tr сценарий-профиль для интерпретатора BASH (выполняетсtd/tdtda name="proc"я после регистрации в системе и используется для всех пользователей системы);вами (root) (0 – root права аннулируются);
| |-- hostname текущее имя Компьютера
| |-- domainname Имя домена компьютера
| |-- osrelease версия ядра системы;
| |-- ostype тип ОС (Linux, *BSD, ...);
| --- version дата сборки ядра.
|-- cpuinfo Текущая информация о процессоре
|-- cmdline список параметров, переданных ядру при загрузке
|-- devices системные устройства
|-- dma Задействованные в данный момент DMA каналы
|-- interrupts Счетчики количества прерываний IRQ в архитектуре i386.
|-- ioports порты ввода/вывода
|-- filesystems поддерживаемые ФС
|-- loadvg информация о загруженности системы
|-- kcore содержимое физической памяти в текущий момент
|-- kmsg сообщения, выдаваемые ядром (копия syslog)
|-- mdstat отображение статистики программных RAID массивов
|-- meminfo информация о памяти
|-- modules загруженные модули ядра
|-- mounts смонтированные ФС
|-- partitions информация о разделах дисков
|-- pci Полный список всех PCI-устройств, найденных во время инициализации ядра, а также их конфигурация.
|-- swaps информация о всех своп-разделах, подключенных к системе
|-- uptime время работоспособности
|-- version версия ядра
|-- /цифровые/ каталоги, содержащие в названии наборы цифр, соответствуют GID -номеру процесса и содержат в себе информацию о работающем процессе, GIDу которого соответствует.
| |-- /fd/* содержит указатели на все, открытые процессом файлы
| |-- cmdline полную командную строку запуска процесса до тех пор, пока процесс не будет "выгружен" или не станет "зомби"
| |-- cwd символьная ссылка на текущий рабочий каталог процесса
| |-- environ содержит окружение процесса
| |-- exe содержит мягкую ссылку на бинарник процесса
| |-- limits содержит информацию о лимитах процесса (например, лимит открытых файлов, приоритет процесса и т.п.)
| |-- root мягкая ссылка на каталог пользователя root для процесса
| --- status Информация о процессе, представленная в довольно удобном для просмотра виде. Она содержит, в частности, следующие строки:
  • Имя исполняемого файла процесса в скобках;
  • Статус процесса;
  • Идентификатор процесса
  • Идентификатор родительского процесса
  • Идентификатор группы процессов процесса
  • и др.
/root/ домашний каталог пользователя root, данный каталог должен быть в корневой ФС, чтобы администратор мог войти в нее.
/sbin/ В данном каталоге содержаться основные системные бинарники, команды для системного администрирования, а также программы, выполняемые в ходе загрузки ОС. Здесь находятся элементы, запускаемые в фоновом режиме, в каком то смысле данный каталог является аналогом папки c:\Windows\system\ и c:\Windows\system32\.
--- shutdown утилита остановки системы
/srv/ данные предоставляемых сервисов от ОС
/sys/ это директория, к которой примонтирована виртуальная файловая система sysfs, которая добавляет в пространство пользователя информацию ядра Linux о присутствующих в системе устройствах и драйверах. (В версии ядра ниже 2.6 не использовалась)
|-- /block/ каталог содержит подкаталоги всех блочных устройств, присутствующих в данный момент в системе.
|-- /bus/ В этом каталоге находится список шин, определенных в ядре Linux (eisa, pci и т.д.).
--- /class/ Каталог содержит список группированных устройств по классам (printer, scsi-devices и т.д.).
/tmp/ Временные файлы. Данный каталог аналогичен c:\Windows\temp. Обычно Linux очищает этот каталог во время загрузки.
/usr/ В данном каталоге хранятся все установленные пакеты программ, документация, исходный код ядра и система X Window. Все пользователи кроме суперпользователя root имеют доступ только для чтения. Может быть смонтирована по сети и может быть общей для нескольких машин.
|-- /bin/ Директория дополнительных программ для всех учетных записей.
|-- /include/ Заголовочные файлы С++.
|-- /lib/ Системные библиотеки для программ, расположенных в каталоге/usr
| /local/ По стандарту /usr должен быть общим для нескольких компьютеров и смонтирован по сети, а /usr/local должен содержать установленные пакеты программы только на локальной машине (к примеру, /usr - бюджет семьи, а /usr/local - личный кошелек каждого). Но чаще всего директория /usr/local используется для установки программ, которые не предназначены для конкретного дистрибутива (к примеру для пакетного дистрибутива Ubuntu в /usr находятся "родные" установленные пакеты, а /usr/local находятся собранные пакеты из исходников).
| |-- /bin/
| |-- /lib/
| |-- ...
|-- /sbin/ Дополнительные системные программы.
|-- /share/ Общие данные установленных программ.
| |-- /icons/ В каталоге находятся все иконки системы.
| --- /doc/ Директория, в которой обычно находится справочная документация по установленным программам.
|-- /src/ Каталог содержит исходные коды (например, здесь располагаются исходные коды ядра).
|-- /X11R6/bin/ Х ссылка на текущий X сервер;
|-- magic.mime файлы, хранящие "магическое число". Данное число описывает тип файла для утилиты file .
--- magic
/var Здесь находятся часто меняющиеся данные (журналы операционной системы, системные log-файлы, cache-файлы и т. д.)
|-- /cache В этом месте хранятся все кэшированные данные различных программ.
|-- /lib Постоянные данные, изменяемые программами в процессе работы (например, базы данных, метаданные пакетного менеджера и др.).
| --- /rpm/ база данных пакетного менеджера RPM
|-- /lock Здесь лежат lock-файлы, указывающие на занятость некоторого ресурса.
|-- /log/ в данном каталоге лежат все лог файлы системы
| |-- wtmp (бинарный формат) содержит удачные попытки входа и выхода в систему
| |-- utmp (бинарный формат) содержит текущих вошедших пользователей в систему
| |-- lastlog (бинарный формат) содержит, когда каждый пользователь последний раз входил
| -- btmp (бинарный формат) содержит НЕ удачные попытки входа/выхода в систему
|-- /spool Задачи, ожидающие обработки (например, очереди печати, непрочитанные или не отправленные письма, задачи cron и т. д.).
--- /www В этом месте размещаются Web-страницы для сервера Apache.

Вот, в кратце, о назначении каталогов Linux. В последующем данная таблица будет наполняться по мере моего изучения ОС LINUX. Хочу отметить, что у некоторых дистрибутивов структура каталогов может несколько различаться, добавляться другие каталоги. Но в общем случае структура имеет вид, указанный выше.

На сегодня все. В следующей статье будет сделана шпаргалка по основным командам Linux.

В "ОС" Linux вся файловая система имеет организованную, конкретную структуру. Начинающие пользователи, только пересевшие с Windows на , как правило, испытывают определенные трудности, в связи с отсутствием четкого представления о принадлежности каждой директории. Весь изложенный ниже материал, должен восполнить этот пробел.

Cтруктура каталогов Linux .

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

Краткое описание.

/ корневой раздел

Корневой раздел.

В данной директории находится основной состав команд "ОС", к ним относятся команды оболочки и файловой системы: ls, cp и пр...

Это, хранилище образов ядер, а также, загрузчиков: Grub или Lilo и пр...

Здесь обитают файлы, относящиеся к определенным устройствам, подключенных к "ОС". Дело в том, что в операционной системе Linux , любое устройство ассоциируется с конкретным файлом, т.е. будь-то принтер, сканер, жесткий диск и пр., все должно иметь свой собственный файл, что бы получить необходимый доступ к тому или иному устройству.

Это, место хранения файлов конфигурации "ОС", например: параметры сети, пользователи, группы и такие приложения, как Apache, Samba и тд. и тп.

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

/home/ username

Это тоже, домашняя папка, но только пользователя "username". Здесь сохраняются конфигурационные файлы настроек приложений и личная "инфа". Если пользователей много, то каждый имеет свой личный каталог для таких файлов. Есть еще папка суперпользователя "root", находящаяся в корне файловой системы. Такое разграничение директорий, от системных файлов, в разы увеличивает надежность и значительно облегчает процесс резервирования данных.

Сюда сбрасываются файлы, не имеющие ссылок из всех других директорий, не смотря на то, что их "inod" не имел метки "незадействованного". К примеру, вы удаляете файл, как в этот момент происходит обрыв электропитания. В следствие этого, в системе образуется потерявшийся "inod", который имеет пути к файлу, но файл-то отсутствует. Далее, в ext2 (нежурналируемая), "fsck" находит "inod", создает ссылку в lost+found, после чего, можно взглянуть на файл и все нормализовать. В ext3 (журналируемая), "fsck" анализирует журнал и определяет незавершенность операции, производя после этого "откат". Таким образом в журналируемых "ФС" затерявшихся inod(ов) имеется намного меньше.

В этом пространстве сосредоточены системные библиотеки, обеспечивающие работоспособность приложений, находящихся в /bin, /sbin и "ОС" глобально.

Предназначена для авто-монтирования устройств: USB, CD-ROM и т.д. При задействовании любого устройства, оно автоматом подключается в соответствующий каталог данной директории.

Эта директория фактически тоже, что и предыдущая /media, с той лишь разницей, что используетcя ручной тип подключения, а именно, когда выполняется команда "mount".

В этой площадке приживаются установленные приложения с большим размером или дополнительными пакетами, к примеру: /opt/libreoffice.org

Сюда примонтирована "procfs", виртуальная "ФС", с наличием множественной информации, которую можно получить. Допустим, нужно узнать какие модули ядра загружены, это будет файл - /proc/modules или же, получить сведения о процессоре - /proc/cpuinfo

Это домашний супер-пользовательский каталог. Данная директория идентична директории просто пользователя и находится в корне файловой системы. Если вдруг возникли проблемы с доступом к /home, то залогинившись с правами суперпользователя,
всегда можно решить данную проблему.

В системе имеются специальные программы для различных настроек и администрирования, им ведь тоже, где-то надо "жить".

Специфические параметры системы, в большинстве случаев пустует.

Эта директория получила применение начиная с ядра v_2.6 и в нее примонтируется "sysfs", с информацией о ядре, устройствах и драйверах.

Здесь находятся директории блочных устр-ств, которые имеются в системе в реальное время.

Перечень шин ядра: eisa, pci и тд. и тп.

Перечень группированных устр-ств по классификации: printer, scsi-devices и тд. и тп.

Это собрат папки "Temp" в Windows, для хранения временных файлов. Чтение и запись, доступны всем пользователям.

Место установленных пакетов программ, документации, кода ядра, X Window. Полностью доступна для "root", остальным запрещено, кроме чтения. К директории можно применить сетевое монтирование и статус общей для ряда компьютеров.

/usr/bin bin2

Местоположение дополнительных приложений для всех учетных записей.

Место обитания "развлекалок", одним словом, игры.

Заголовочные файлы С++.

/usr/lib lib2

Системные библиотеки для приложений в /usr.

В идеале /usr должен иметь статус "общий" и быть смонтирован по сети - /usr/local должен вмещать в себя пакеты приложений на локальном аппарате. Например: /usr - семейный бюджет, /usr/local - личные доходы.

В пакетной Ubuntu, как правило в /usr располагаются "родственные" пакеты, свои, а в /usr/local собранные из исходников, не имеющие отношения к какому-либо дистрибутиву конкретно.

Системные приложения дополнительного плана.

Несмотря на то, что основным назначением файловой системы является упорядочение хранимых ресурсов, программистам не очень хотелось бы “изобретать велосипед” для управления объектами других типов. В Linux объектами файловой системы являются: процессы, устройства, структуры данных ядра и параметры настройки, каналы межзадачного взаимодействия, папки, и, конечно, обычные файлы. Такое устройство файловой системы имеет как преимущества, так и недостатки. К преимуществам относится единый программный интерфейс, легкость доступа из интерпретатора команд. К недостаткам относится реализация файловой системы по методу Франкенштейна.

Файловая система состоит из четырех основных компонентов:

  1. Пространство имен – методы именования объектов и организации в виде единой иерархии
  2. API – набор системных вызовов для перемещения между объектами и управления ими
  3. Методы безопасности – схема защиты, сокрытия и совместного использования объектов
  4. Реализация – программный код, который связывает логические модели с дисковой подсистемой

Файловая система – это единая иерархическая структура, которая начинается с каталога / и разветвляется, охватывая произвольное число каталогов.

Каталог верхнего уровня называется корневым . Это моноиерархическая система отличается от используемой в Windows, где применяется понятие пространства имен, основанное на принципе деления диска на разделы.

Цепочка имен каталогов, через которые необходимо пройти для доступа к заданному файлу, вместе с именем этого файла образуют путь к файлу. Путь может быть абсолютным (например, /temp/foo ) или относительным (например, book4/filesystem ). Последние интерпретируются начиная с текущего каталога. Стоит отметить, что текущий каталог есть у каждого процесса (большинство процессов никогда не изменяют свои рабочие каталоги, и поэтому просто наследуют текущий каталог процесса, который их запустил).

Существует ограничение на длину имени файла – не более 255 символов. В имя нельзя включать символ косой черты и нулевые символы. Также есть ограничение на длину пути, который передается ядру в качестве аргумента системного вызова – 4095 байт.

Монтирование и демонтирование файловой системы

Файловое дерево формируется из отдельных частей, которые носят название файловых систем. Каждая файловая система имеет корневой каталог и список его подкаталогов и файлов. Большинство файловых систем представляет собой разделы жесткого диска или логические тома, но, как было сказано ранее, файловая система может принять облик всего, что подчиняется определенным функциональным признакам – сетевых файловых систем, компонентов ядра, дисков, устройств и т.д.

В большинстве случаев файловые системы присоединяются к файловому дереву с помощью команды mount . Эта команда связывает каталог существующего файлового дерева, называемый точкой монтирования, корневым каталогом новой файловой системы. На время монтирования доступ к прежнему содержимому точки монтирования становится невозможным. Например, команда $ sudo mount /dev/sda4 /users монтирует на устройстве /dev/sda4 файловую систему /users . По окончании монтирования можно с помощью команды ls /users просмотреть содержимое файловой системы. Список смонтированных пользователями файловых систем хранится в файле /etc/fstab . Демонтируются файловые системы с помощью команды umount . Занятую файловую систему демонтировать невозможно.

Организация файловой системы

Корневая файловая система содержит корневой каталог и минимальный набор файлов и подкаталогов. Файл ядра находится в недрах корневой файловой системы, но не имеет стандартного имени или точного местоположения.

Частью корневой файловой системы являются также каталог /etc для критических системных файлов и файлов конфигурации, каталоги /sbin и /bin - для важных ути­лит и иногда каталог /tmp - для временных файлов. Каталог /dev - это обычно ре­альный каталог, который включен в корневую файловую систему, но он (частично или полностью) может перекрываться другими файловыми системами, если ваша система виртуализировала поддержку своих устройств.

Одни системы хранят совместно используемые библиотечные файлы и прочие важ­ные программы (например, препроцессор языка С) в каталоге /lib . Другие переместили эти элементы в каталог /usr/lib , оставив для каталога /lib роль символьной ссылки.

Огромное значение имеют также каталоги /usr и /var . В первом хранится большин­ство стандартных программ и другие полезные компоненты, в частности интерактивная документация и библиотеки. Совсем не обязательно, чтобы каталог /usr был отдельной файловой системой, однако для удобства администрирования его, как правило, монти­руют именно так. Для того чтобы система могла загрузиться в многопользовательском режиме, необходимы оба каталога - /usr и /var . В каталоге /var содержатся буферные каталоги, журнальные файлы, учетная инфор­мация и прочие компоненты, специфичные для каждого компьютера. Поскольку при возникновении проблем журнальные файлы быстро разрастаются, рекомендуется помещать каталог /var в отдельную файловую систему. Домашние каталоги пользователей чаще всего хранятся в отдельной файловой си­стеме, которая обычно монтируется в корневом каталоге. Отдельные файловые системы можно использовать и для хранения больших информационных массивов, например библиотек исходных кодов программ и баз данных.

В таблице приведены стандартные каталоги и их содержимое

Каталог ОС Содержимое
/bin Все Команды операционной системы ядра
/boot LS Ядро и файлы для его загрузки
/dev Все Файлы устройств: дисков, принтеров, псевдотерминалов и т.д.
/etc Все Важные файлы запуска и конфигурации системы
/home Все Стандартные домашние каталоги пользователей
/kernel S Компоненты ядра
/lib Все Библиотеки, совместно используемые библиотеки и компоненты компилятора языка C
/media LS Точки монтирования файловых системы на съемных носителях
/mnt LSA Временные точки монтирования
/opt Все Программные пакеты необязательных приложения (которые пока не находят широкого применения)
/proc LSA Информация о всех выполняющихся процессах
/root LS Домашний каталог суперпользователя (часто просто /)
/sbin Все Команды, необходимые для обеспечения минимальной работоспособности системы
/stand H Автономные утилиты, средства диагностики и форматирования дисков
/tmp Все Временные файлы, которые могут удаляться при перезагрузке
/usr Все Иерархия дополнительных файлов и программ
/usb/bin Все Содержимое
/usr/include Все Файлы заголовков, предназначенные для компиляции C-программ
/usr/lib Все Библиотеки и вспомогательные файлы для стандартных программ
/usr/lib64 L 64-разрядные библиотеки для 64-разрядных дистрибутивов Linux
/usr/local Все Локальные программы (программы, создаваемые или устанавливаемые локальными пользователями)
/usr/sbin Все Менее важные файлы системного администрирования
/usr/share Все Элементы, общие для различных систем
/usr/share/man Все Страницы интерактивной документации
/usr/src LSA Исходные коды нелокальных программных пакетов (не находит широкого применения)
/usr/tmp Все Дополнительный каталог для временных файлов, которые могут сохраняться при перезагрузке
/var Все Системные данные и конфигурационные файлы
/var/adm Все Разное: журнальные файлы, записи об инсталляции системы, административные компоненты
/var/log LSA Системные журнальные файлы
/var/spool Все Буферные каталоги для принтеров, электронной почты и т.д.
/var/tmp Все Каталог для временного хранения файлов

Примечание: L = Linux, S = Solaris, H = HP-UX, A = AIX

Типы файлов

В большинстве реализаций файловых систем определены семь типов файлов:

  • Обычные файлы
  • Каталоги
  • Файлы байт-ориентированных (символьных) устройств
  • Файлы блочно-ориентированных (блочных) устройств
  • Локальные сокеты
  • Именованные каналы (реализующие принцип обслуживания FIFO – первым поступил первым обслужен)
  • Символьные ссылки

Определить тип существующего файла можно с помощью команды ls -ld . Первый символ в строке вывода обозначает тип объекта. Пример:

$ ls -ld /usr/include

где d – означает каталог

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

Обычные файлы – это просто последовательность байтов. Файловые системы не налагают ограничения на его структуру. Текстовые документы, файлы данных, программные файлы, библиотеки функций и многое другое – все это хранится в обычных файлах. К их содержимому возможен как последовательный, так и прямой доступ.

Каталог хранит именованные ссылки и другие файлы. Он создается командой mkdir и удаляется (при условии, что он пуст) командой rmdir . Непустые каталоги можно удалять командой rm -r . Специальные ссылки ‘.’ и ‘..’ обозначают сам каталог и его родительский каталог соответственно. Такие ссылки нельзя удалить. Поскольку корневой каталог находится на вершине иерархии, ссылка ‘..’ эквивалентна ссылке ‘.’

Имя файла в действительности хранится в родительском каталоге, а не в самом файле. На файл можно ссылаться из нескольких каталогов одновременно и даже из нескольких элементов одного и того же каталога, причем у всех ссылок могут быть разные имена. Это создает иллюзию того, что файл одновременно присутствует в разных каталогах. Эти дополнительные жесткие (фиксированные) ссылки можно считать синонимами для исходных файлов, и с точки зрения файловой системы все ссылки на файл эквивалентны. Файловая система подсчитывает количество ссылок на каждый файл и при удалении файла не освобождает блоки данных до тех пор, пока не будет удалена последняя ссылка на него. Ссылки не могут указывать на файл, находящийся в другой файловой системе.

Жесткие ссылки создаются командой ln и удаляются командой rm . Синтаксис ко­манды ln легко запомнить, поскольку она является “зеркальным отражением” команды cp. Команда cp oldfile newfile создает копию файла oldfile с именем newfile, а команда ln newfile oldfile преобразует имя newfile в дополнительную ссылку на файл oldfile.

Файлы устройств позволяют программам получать доступ к аппаратным средства и периферийному оборудованию системы. Ядро включает (или загружает) специальные программы (драйверы), которые во всех деталях “знают”, как взаимодействовать с каж­дым из имеющихся устройств, поэтому само ядро может оставаться относительно аб­страктным и независимым от оборудования.

Драйверы устройств образуют стандартный коммуникационный интерфейс, кото­рый воспринимается пользователем как совокупность обычных файлов. Получив за­прос к файлу символьного или блочного устройства, файловая система передает этот запрос соответствующему драйверу. Важно отличать файлы устройств от драйверов этих устройств. Файлы сами по себе не являются драйверами.

Их можно рассматривать как шлюзы, через которые драйвер принимает запросы. Файлы символьных устройств позволяют связанным с ними драйверам выполнять соб­ственную буферизацию ввода-вывода. Файлы блочных устройств обрабатываются драй­верами, которые осуществляют ввод-вывод большими порциями, а буферизацию вы­полняет ядро. В прошлом некоторые типы аппаратных средств могли быть представлены файлами любого типа, но в современных системах такая конфигурация встречается редко.

Файлы устройств характеризуются двумя номерами: старшим и младшим. Старший номер устройства позволяет ядру определить, к какому драйверу относится файл, а младший номер, как правило, идентифицирует конкретное физическое устройство. На­пример, старший номер устройства 4 в Linux соответствует драйверу последовательного порта. Таким образом, первый последовательный порт (/ dev/tty0) будет иметь стар­ший номер 4 и младший номер 0.

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

В далеком прошлом /dev играл роль общего каталога, а файлы устройств, которые в нем хранились, создавались с помощью команды mknod и удалялись командой rm . Стандартизировать работу по созданию файлов устройств помогал сценарий с именем MAKEDEV

К сожалению, эта “сырая” система плохо справлялась с безбрежным морем драйве­ров и типов устройств, которые появились в последние десятилетия. Кроме того, она способствовала возникновению разного рода потенциальных конфигурационных несты­ковок: например, файлы устройств ссылались на несуществующие устройства, устрой­ства оказывались недоступными, поскольку они не имели файлов устройств, и т.д.

В наши дни в большинстве систем реализована некоторая форма автоматического управления файлами устройств, которая позволяет системе играть более активную роль в конфигурировании собственных файлов устройств. Например, в Solaris каталоги /dev и /devices полностью виртуализированы. В дистрибутивах Linux каталог /dev является стандартным, но управлением файлами внутри него занимается демон udevd. (Демон udevd создает и удаляет файлы устройств в ответ на изменения в оборудовании, о кото­рых сообщает ядро.)

Установленные посредством сокетов соединения позволяют процессам взаимодей­ствовать, не подвергаясь влиянию других процессов. В системе UNIX поддерживается несколько видов сокетов, использование которых, как правило, предполагает наличие сети. Локальные сокеты доступны только на локальном компьютере, и обращение к ним осуществляется через специальные объекты файловой системы, а не через сетевые пор­ты. Иногда такие сокеты называют UNIX-сокетами.

Несмотря на то что другие процессы распознают файлы сокетов как элементы ка­талога, только процессы, между которыми установлено соответствующее соединение, могут осуществлять над файлом сокета операции чтения и записи. В качестве примеров стандартных средств, использующих локальные сокеты, можно назвать системы X Win­dow и Syslog.

Локальные сокеты создаются с помощью системного вызова socket . Когда с обеих сторон соединение закрыто, сокет можно удалить командой rm или с помощью систем­ного вызова unlink .

Подобно локальным сокетам, именованные каналы обеспечивают взаимодействие двух процессов, выполняемых на одном компьютере. Такие каналы еще называют фай­лами FIFO (First In, First Out - “первым поступил, первым обслужен”). Они создаются командой mknod и удаляются командой rm .

Как и в случае локальных сокетов, реальные экземпляры именованных каналов весь­ма немногочисленны и нечасто встречаются. Они редко требуют административного вмешательства.

Именованные каналы и локальные сокеты имеют практически одинаковое назначе­ние, а их обоюдное существование сложилось исторически. Если бы системы UNIX и Linux разрабатывались в наши дни, то об этих средствах взаимодействия вопрос бы не стоял; сейчас их заменили бы сетевые сокеты.

Работа с файлами в Linux

Прежде всего рассмотрим основные команды для работы с файлами и папками. Для создания файла используется команда touch , для создания директории команда mkdir .

user@ubuntu$ touch [имя файла] – создание файла

user@ubuntu$ mkdir [имя директории] – создание директории

Удаление файлов производится с помощью команды rm. Для директорий используется та же команда, только с ключом -r (рекурсивный).

user@ubuntu$ rm [имя файла] – удаление файла

user@ubuntu$ rm -r [имя директории] – удаление директории

Посмотреть в какой директории находимся можно командной pwd . Содержимое директории просматривается командой ls, которую удобно вызывать с ключом -l для просмотра расширенной информации о каждом файле. Переход на каталог осуществляется командой cd .

user@ubuntu$ pwd – текущая директория

user@ubuntu$ ls -l [путь директории] – содержимое директории

user@ubuntu$ cd [путь директории] – перейти к директории

Операции копирования и перемещения осуществляются командами cp и mv соответственно. В Linux нет специальной команды для переименования файла, вместо этого используется mv.

user@ubuntu$ cp [копируемый файл] [директория] – копирование файла

user@ubuntu$ mv [перемещаемый файл] [директория] – перемещение файла

user@ubuntu$ mv [текущее имя файла] [новое имя файла] – переименовать файл

В этом примере мы создаем директорию test/, переходим в нее командой cd. В этой директории создаем два файла file и file2. Выводим содержимое каталога командой ls -l. Копируем файл file и присваиваем ему имя file3. Переименовываем файл file в new_file командой mv . В конце удаляем все файлы в каталог командой rm *. * – обозначает любое количество символов. Переходим на каталог выше командой cd .. и удаляем каталог /test.

Права доступа в Linux

Права доступа к файлу или каталогу можно задать с помощью команды chmod . Такое право есть лишь у владельца файла и пользователя root. В Linux каждому файлу соответствует набор прав доступа, представленный в виде 8-и битов режима. Они определяют, какие пользователи имеют права читать, редактировать и исполнять файл.

Первым аргументом команды chmod является спецификация прав доступа. Второй и последующий аргументы - это имена файлов, права доступа к которым подлежат измене­нию. При использовании восьмеричной формы записи первая цифра относится к владель­цу, вторая - к группе, а третья - к другим пользователям. Если необходимо задать биты setuid/setgid или дополнительный бит, следует указывать не три, а четыре восьмерич­ные цифры: первая цифра в этом случае будет соответствовать трем специальным битам.

В таблице показано восемь возможных комбинаций для каждого трехбитового набо­ра, где символы r, w и х обозначают право чтения, записи и выполнения соответственно.

Например, команда chmod 711 myprog предоставляет владельцу все права, а осталь­ным пользователям - только право выполнения 9 .

При использовании мнемонического синтаксиса вы объединяете множество испол­нителей (u - пользователь, g - группа или о - другой) с оператором (+ добавить, – удалить и = присвоить) и набором прав доступа. Более подробное описание мне­монического синтаксиса можно найти на man-странице команды chmod, но синтаксис всегда лучше изучать на примерах.

Часто происходит такие ситуации, когда при запуске файла он ругается на недостаток прав. Решить такую проблему можно командой sudo chmod a+x file . Команда означает, что для файла file устанавливаются права на исполнение для всех пользователей.

При наличии опции -R команда chmod будет рекурсивно обновлять права доступа ко всем файлам указанного каталога и его подкаталогов. Здесь удобнее всего придержи­ваться мнемонического синтаксиса, чтобы менялись только те биты, которые заданы явно. Например, команда
chmod -R g+w mydir добавляет групповое право записи к каталогу mydir и его содержимому, не затрагивая остальные права.

___________________________

Здравствуйте, уважаемые посетители, читатели, други и недруги, постоянные клиенты и прочие личности сайта.

Мы продолжаем цикл статей, посвященных Linux-системам. Сегодня мы поговорим о таких важных (может быть, и не совсем простых) понятиях, как:

  • Файловая система Linux ;
  • Основные каталоги корневой файловой системы;
  • Консольные команды для работы с файлами и каталогами.

Итак, начнем.

Корневая файловая система Linux

Сложно представить операционную систему (даже такую как Linux ) без файловой системы. На ней лежит всесистемный порядок. Файловая система строго следит за организацией, хранением, а также именованием данных. Например, когда программа обращается к файлу, она ничего не знает о том, где расположена информация о данном файле, на каком физическом носителе она записана. Единственное, что знает программа, это имя файла, к которому она обращается, его размер и другие параметры, которыми искомый файл отличается от множества других файлов (дату и время создания файла, имя владельца файла, права и метод доступа к файлу и т.д.). Все эти данные она получает от файловой системы. Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жёстком диске или съемном устройстве). Все собранные в одном месте каталоги (по-другому папки), подкаталоги, а так же файлы и есть данные файловой системы. Причем один из этих каталогов в Linux -системах является самым наиважнейшим, а именно «верхушкой» (по-другому - «корнем») файловой системы - в нём содержатся все остальные каталоги и файлы.

Для того, чтобы Вы понимали, о чем идет речь, я открыл каталоги файловой системы Linux через файловый менеджер Midnight Commander (MC). Верхушку файловой системы (корневой каталог) указал красной стрелкой - и вот именно к ней монтируются все другие файловые системы. Далее мы попытаемся более доступно описать все, что в данный момент Вы видите на рисунке (по тексту мы будем останавливаться на тех или иных понятиях, чтобы было понятно, о чем идет речь, и Вы, поглядев на рисунок, смогли сориентироваться).

Если жёсткий диск разбит на разделы, то на каждом из них возникают отдельные файловые системы с собственным корнем и с собственной структурой каталогов. Любая операционная система поддерживает несколько файловых систем, например, Windows FAT , FAT32 , NTFS и др. Linux не исключение. Однако важно различать файловые системы, которые могут использоваться в качестве корневой файловой системы и файловые системы, которые просто поддерживают операционную систему, но не используются для установки Linux или Windows (к таким можно отнести, например, ISO9660 (эта модель обеспечивает совместимость носителей под разными операционными системами), UDF (а это особенный формат файловой системы, предназначенный для хранения файлов на оптических носителях) и др). Мы не будем рассматривать файловые системы Windows , не будем останавливаться на файловых системах, не использующихся для установки операционных систем, а просто сделаем краткий обзор и познакомимся с некоторыми наиболее известными корневыми файловыми системами Linux .

  • ext - Extended File System (расширенная файловая система) первая файловая система, разработанная специально для операционных систем на ядре Linux .
  • ext2 - Second Extended File System (дословно: «вторая расширенная файловая система») - стандартная, но уже устаревшая файловая система Linux . По скорости и производительности работы она может служить эталоном в тестах производительности файловых систем. Единственный ее минус - она не является журналируемой файловой системой (журналируемая файловая система это система, в которой ведется запись журнала и которая хранит список изменений, что в свою очередь, помогает сохранить целостность файловой системы при сбоях) . Этот недостаток был устранён в следующей файловой системе ext3.
  • ext3 - Third Extended File System (третья версия расширенной файловой системы) усовершенствованная версия файловой системы ext2 с поддержкой ведения журнала, что, несомненно, повышает ее надежность.
  • ext4 - Fourth Extended File System (четвёртая версия расширенной файловой системы) - новейшая файловая система Linux . Начиная с ядра Linux 2.6.28 (вышедшем 25.12.2008 г.) файловая система уже считается стабильной и используется по умолчанию во многих дистрибутивах Linux .
  • Файловая система ext4 рассматривается как переходный шаг на пути к файловой системе следующего поколения Btrfs , которая уже сейчас претендует на звание основной файловой системы Linux в будущем.

Внимание! Есть еще несколько файловых систем, например, ReiserFS , JFS , XFS и т.д., но использовать их в домашних условиях не целесообразно, потому как ReiserFS чувствительна к сбоям и ее нужно регулярно дефрагментировать, JFS плохо работает с большими файлами (например, с видео) , лучше использовать эту файловую систему под сервер баз данных, а XFS хорошо использовать на графических станциях для обработки видео.

Еще раз повторимся (повторение - мать учения) :). При установке Linux на выбранном Вами разделе жесткого диска создается корневая файловая система, и для Linux именно она является самой важной. Именно к ней будут монтироваться все остальные файловые системы на других устройствах. Корневая файловая система тоже монтируется, но только не к другой файловой системе, а к «самой Linux », причём точкой монтирования служит корневой каталог. Поэтому при загрузке системы прежде всего монтируется корневая файловая система, а при завершении она размонтируется в последнюю очередь (о самом понятии монтирования и размонтирования мы поговорим в следующих статьях - это отдельная и тоже немаловажная тема) . Корневая файловая система содержит набор стандартных каталогов и утилит, без которых невозможна работа Linux . В Linux корневой каталог обозначается так - “/ ” (слеш). Полные имена (по-другому - пути) всех остальных каталогов получаются из “/ ”, к которому дописываются справа имена последовательно вложенных друг в друга каталогов. Имена каталогов в пути также разделяются символом “/”. Например, запись /home обозначает каталог “home ” в корневом каталоге (“/”) , а /home /Sonikelf - каталог “Sonikelf ” в каталоге “home ”, который, в свою очередь, находится в корневом каталоге. Перечисленные таким образом каталоги, завершающиеся именем файла, и составляют полный путь к файлу .

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

Основные каталоги корневой файловой системы
В разных дистрибутивах Linux каталоги тоже могут быть разные: в некоторых будут дополнительные файлы/каталоги конфигурации, а некоторые файлы конфигурации, вполне возможно, будут называться как-то по-другому. Я приведу названия каталогов, которые входят в дистрибутив Fedora . Итак, поехали:

/ - корневой каталог

  • /bin - содержит стандартные утилиты Linux . Или, скажем так, - этот каталог содержит основные исполняемые файлы (в Windows такие файлы имеют расширение.exe) , доступные всем пользователям, а также содержит символьные ссылки на исполняемые файлы. Символьная ссылка это специальный файл в файловой системе, внутри которого есть только одна-две строки с указанием полного пути, который должен быть открыт при попытке обратиться к данной ссылке (файлу).
  • /boot - содержит конфигурационные файлы загрузчика GRUB , образы ядра (по умолчанию хранятся последние три), файлы Initrd. Чтобы было понятно, что это за такие мифические файлы Initrd , немного внесем ясность. Когда начинается начальная загрузка системы, сначала монтируется временный виртуальный диск, который содержит временную корневую файловую систему, с помощью которой, в свою очередь, осуществляется запуск ядра Linux . Файл Initrd - образ этой временной корневой системы, который хранится на загрузочном устройстве.
  • /dev - содержит файлы устройств. В Linux устройством называется оборудование, которое подключается к системе в процессе загрузки ядра или в процессе работы системы. Эти устройства представляют методы для ввода или вывода информации. Например, жесткий диск - устройство для ввода (запись) и вывода (чтение) , мышь - устройство ввода. Каждое движение или нажатие на кнопки мыши отправляет символ на устройство /dev /mouse , клавиатура - тоже устройство ввода. Большинство устройств в Linux представляют из себя файлы в особой файловой системе (исключение составляют сетевые карты) . И вот эти файлы хранятся в каталоге /dev , куда к ним обращается система для выполнения задач, связанных с вводом/выводом.
  • /etc - содержит конфигурационные файлы операционной системы и всех сетевых служб. Данный каталог можно сравнить с реестром Windows , но в Windows общесистемные настройки хранятся в одном большом бинарном файле, а в Linux - в разных конфигурационных файлах, которые можно редактировать обычным текстовым редактором.
  • /home - название каталога говорит само за себя. Здесь содержатся домашние каталоги всех пользователей, которые зарегистрированы в системе. В домашних каталогах пользователей хранятся пользовательские файлы, а также пользовательские настройки различных программ. Как мы уже упоминали в предыдущей статье, и поэтому каждый пользователь имеет свой уникальный и неповторимый каталог для своих личных, персональных файлов. Этот каталог называется Домашним каталогом пользователя и обозначается, как мы уже говорили немного ранее, /home/Имя_Пользователя. Такое разделение пользовательских каталогов и файлов операционной системы упрощает сохранение данных и повышает надежность самой операционной системы.
  • /lib - здесь находятся различные библиотеки и модули ядра. В процессе установки различных программ в Linux (в том числе и драйверов) устанавливаются (о них мы уже говорили) для корректной работы программы. Вот эти зависимости в большинстве случаев и есть библиотеки - набор собранных особым образом файлов, которые подключаются во время установки к устанавливаемой программе.
  • /lost+found - этот каталог нужен для хранения испорченных файлов при проблемах с файловой системой, которые были восстановлены после, например, некорректного размонтирования файловой системы. Это очень ценный каталог, удалить его не получится (он всё равно снова появится).
  • /misc - может содержать все что угодно.
  • /mnt и /media - обычно в этих каталогах содержатся точки монтирования. В современных дистрибутивах Linux этот процесс обычно происходит автоматически. При этом в каталогах /mnt или /media создается подкаталог, имя которого совпадает с именем монтируемого тома.
  • /opt - здесь обычно размещаются установленные программы, имеющие большой дисковый объем, или вспомогательные пакеты, например, у меня в этом каталоге всего две программы - это Adobe Reader и Google Chrome
  • /proc - это не совсем обычный каталог, это каталог псевдофайловой системы procfs, которая используется для предоставления информации о процессах (по-другому это виртуальная файловая система, которая обеспечивает связь с ядром и монтируется в каталогу /proc) . Да-да, в системе Linux присутствует виртуальный файловый объект, именуемый каталогом /proc. Он существует только во время работы системы в оперативной памяти компьютера. Каталог представляет интерес и с точки зрения безопасности. Многие из утилит, выводящие информацию о системе (например, команда ps) , берут свои исходные данные именно из этого каталога.
  • /root - каталог пользователя (кто это такой, мы упоминали в одной из предыдущих статей).
  • /run - это совершенно новый каталог, который появился совсем недавно. И создан он (по задумке разработчиков) для хранения данных, которые были запущены приложениями, требующимися в процессе работы (это могут быть и службы, запускаемые самой системой, и программы, которые Вы запускаете сами).
    Сюда входят:
    • Идентификаторы процессов PID (каждый запущенный в среде Linux процесс имеет свой уникальный идентификатор - по-другому это адрес (в числовом виде) процесса, с которым будут взаимодействовать другие запущенные процессы во время работы);
    • Информация о межпроцессорном взаимодействии (проще говоря, это обмен данными между запущенными процессами) ;
    • Заблокированные файлы (если в процессе работы приложение или не запускается, или работает нестабильно? это может означать, что некоторые файлы этого приложения заблокированы другими процессами и происходит это тогда, когда сразу несколько приложений пытаются использовать один общий ресурс); - ну и другие данные, необходимые во время работы.
  • /sbin - набор утилит для системного администрирования, содержит исполняемые файлы, необходимые для загрузки системы и ее восстановления в различных щекотливых ситуациях. Запускать эти утилиты имеет право только root.
  • /tmp - каталог, в котором хранятся временные файлы. Linux , в отличие от Windows , следит за чистотой и регулярно очищает этот каталог.
  • /usr - содержит пользовательские программы, документацию, исходные коды программ и ядра. По размеру это один из самых больших каталогов файловой системы. В этот каталог устанавливаются практически все программы. И его (этот каталог) с большой натяжкой можно сравнить с каталогом Program Files в Windows .
  • /var - содержит файлы, которые подвергаются наиболее частому изменению. Например, кэши различных программ; файлы блокировки для недопустимости одновременного использования одной программы несколькими пользователями; файлы системных журналов; временные файлы (при выключении компьютера содержимое очищается); информация о различных программах; общая информация о состоянии системы с момента последней загрузки, входа в систему и т.д.; очередь печати, факсов, а также входящие почтовые ящики пользователей и т.д.

Вывод. Файловая система в Linux это неразделимое целое, начинающееся с корневого каталога (так называемой "верхушки"), а внутри каталога могут находиться целые диски или их разделы (с другими файловыми системами), которые можно легко примонтировать (присоединить) и также легко отмонтировать (отсоединить) от единственного, единого, неразделимого, целого дерева. Специально выделил эти слова, чтобы было понятно отличие от файловой системы Windows . Если кто не в курсе, в Windows каждый логический диск это корневой каталог. Например, если есть три логических диска - C, D, F , значит будет три корневых каталога.

Необходимые команды, которые нужно знать для работы с файлами и каталогами

Сейчас, когда в Linux есть неплохой графический интерфейс, консолью пользуются все реже и реже (что лично меня приводит в уныние). В любом случае знание простого базиса, а именно, простых и полезных команд, необходим любому пользователю (например, у Вас произошел сбой X- сервера (грубо говоря, это так называемый графический интерфейс в Linux - это не совсем точное определение, но в данный момент, мы не будет углубляться в дебри терминологии) или Вам понадобилось установить программу из исходного кода, или еще что-то). Без консоли (или терминала) Вам не обойтись. А чтобы эффективно работать в консоли, нужно знать команды Linux. Вообще команд очень много, поэтому охватить их все будет просто нереально (по крайней мере, в рамках данной статьи), поэтому мы ограничимся пока что командами для работы с файлами и каталогами.

Примечание:
Обращаю Ваше внимание, что все имена файлов и названия команд нужно вводить в правильном регистре, т.е. имена в Linux «чувствительны к регистру». Например, команда cd - совсем не то же самое, что команда Cd или CD . То же относится к именам файлов и каталогов.

Команда cd - используется для движения по дереву каталогов. Если Вы введете эту команду без аргументов (т.е. просто напишите cd - смотрите первую строку на рисунке), то попадете в свой домашний каталог, а чтобы попасть в любой другой каталог, необходимо указать путь к нему. По умолчанию Вы всегда изначально находитесь в своем домашнем каталоге (/home). В первой строке указан относительный путь, во второй - полный. Если Вам нужно передвинуться в какой-либо другой каталог, то введите cd , обязательно пробел и тот каталог, куда Вам нужно перейти, например cd /usr . На четвертой строке рисунка в квадратных скобках указано, что мы перешли в каталог usr. Можно сразу указать весь путь, например, cd /usr/games . Вы попадете в каталог games, который находится в каталоге usr, который, в свою очередь, находится в корневом каталоге системы. Чтобы вернуться обратно в свою домашнюю директорию, достаточно указать относительный путь cd ~.

Теперь, когда Вы, немного потренировавшись, уже умеете переходить из каталога в каталог, самое время узнать, как просмотреть содержимое каталога. И в этом нам поможет команда ls . С ее помощью Вы можете вывести на экран список файлов и каталогов текущего каталога. У команды ls много опций. Сама по себе команда ls (без ключа) не покажет все файлы в каталоге. Некоторые файлы являются скрытыми и их можно увидеть, только задав дополнительный ключ (опцию) команде ls . Если набрать ls -a , то нашему взору представится список всех файлов каталога (откроются даже скрытые).

Не обязательно находиться в том каталоге, содержимое которого Вы хотите узнать с помощью команды ls. Например, чтобы увидеть, что имеется в каталоге /etc , находясь при этом в вашем домашнем каталоге, введите:

ls -al /etc

Здесь мы указали два ключа - это показывать скрытые файлы (a) и вывести информацию (l). Обратите внимание, мы можем сразу указывать несколько ключей, чтобы получить всю информацию о каталоге или файле.

Приведу наиболее часто употребляемые ключи команды ls:

-a (all) - выведет список всех файлов каталога, в том числе и скрытые файлы;

-l (long) - выведет информацию о содержимом каталога, включая права доступа (первая графа), владельца (вторая графа), группу (третья графа), размер (четвертая графа), время создания (пятая графа), является ли файл символьной ссылкой на другой файл и на какой именно (шестая графа);

-r (reverse) - выведет список содержимого каталога в обратном порядке;

-S (size) - отсортирует файлы по размеру.

Следующая полезная и нужная команда - pwd . Перемещаясь по различным каталогам, можно оказаться в довольно щекотливой ситуации, когда Вы не знаете или не помните имя текущего каталога - иначе говоря, Вы заблудились в файловой системе:). Ведь по умолчанию в Linux приглашение командной строки отображает только имя текущего каталога, а не полный путь к нему. Вот в этом случае команда pwd окажет вам неоценимую услугу

Посмотрите на первую строку. В квадратных скобках указано, что я нахожусь в каталоге services. А вот где он находится, в каких или какой директории совершенно непонятно. Введя вышеназванную команду, мне открылся полный путь к этому каталогу (вторая строка). С этой командой Вы точно не заблудитесь в файловой системе Linux .

Команда mkdir - создание нового каталога. В домашнем каталоге пользователя - /home , как и в любом другом, можно создавать неограниченное число подкаталогов, в них - свои подкаталоги и т.д. Другими словами, Вам принадлежит "поддерево" файловой системы, корнем которого является домашний каталог пользователя.
Чтобы организовать такое поддерево, потребуется создать каталоги внутри домашнего. Вот для этого и используется утилита mkdir . Она используется с одним обязательным параметром: именем создаваемого каталога. По умолчанию каталог будет создан в текущем каталоге.

Давайте создадим каталог globus (первая строка на рисунке). Введем команду mkdir globus . Чтобы удостовериться, что каталог создан, введем команду ls с ключом -F (для каждого имени каталога добавлять суффикс "/"). Каталог создан.

Следующая . С помощью этой команды можно перемещать файлы и каталоги. У mv два обязательных параметра: первый - должен быть указан перемещаемый файл или каталог, второй - должен быть указан файл или каталог назначения (конечный пункт). Имена файлов и каталогов могут быть заданы в любом допустимом виде: при помощи полного или относительного пути. Кроме того, mv позволяет перемещать не только один файл или каталог, а сразу несколько (перечисление файлов/каталогов осуществляется через пробел).

Давайте немного потренируемся: создайте в домашнем каталоге два каталога - Globus и Dos и создайте файл - dokument . А теперь приступим к практике:

1) Переименуем один файл в другой. Чтобы переименовать, например, файл dokument в dokument.old , введите:

mv dokument dokument.old

2) А теперь переместим один каталог в другой. Чтобы переместить каталог Globus Dos , введите:

mv Globus Dos

Если каталог Dos уже существует (как в нашем случае), mv поместит Globus внутрь Dos . А если каталога Dos Вы не создали, то mv ПЕРЕИМЕНУЕТ (перезапишет) Globus в Dos

3) Чтобы переместить файл или каталог, который не находится в текущем каталоге, укажите в качестве опции его полное имя и путь.

Например, чтобы переместить файл /usr/tmp/dokument в текущий рабочий каталог, введите:

mv /usr/tmp/dokument txt.txt

Файл dokument был изначально в /usr/tmp/ , мы его переместили в домашний каталог переименовав в txt.txt

4) А теперь чтобы переместить файл txt.txt из текущего рабочего каталога в каталог /usr/tmp , наберите:

mv txt.txt /usr/tmp

Файлов в каталоге tmp может быть много, поэтому картинку для удобства разделил и уменьшил. Вторая строка означает, что чтобы удостоверится в перемещении нашего файла, мы должны перейти в этот каталог, что и сделали с помощью команды cd . А с помощью команды ls мы открыли для просмотра каталог tmp и убедились, что перемещение произошло успешно.

Следующая полезная и нужная команда - cp.
Она создает копию файла. Утилита cp тоже требует присутствия двух обязательных параметров: первый - то, что мы хотим скопировать (файл или каталог), второй - куда мы хотим это скопировать (пункт назначения). Например, надо скопировать файл dokument в каталог Globus - введите команду

cp dokument Globus

и в каталоге Globus появится файл dokument (это будет копия файла dokument , который находится в нашем домашнем каталоге)

С помощью команды cp можно копировать не только по одному файлу или каталогу - можно путем перечисления всего того, что Вы хотите скопировать, указать это команде cp . Например, нам надо скопировать два файла dokument и dokument.old в каталог Dos , ничего нет проще - перечислите все файлы или каталоги через пробел:

cp dokument dokument.old Dos

Можно не только копировать, но и удалять файлы и каталоги, и в этом нам помогут команды rm (удаляет файлы)..

.. И rmdir (удаляет каталоги). rmdir согласится удалить каталог только в том случае, если он пуст, т.е. в нём нет никаких файлов и подкаталогов.

Удалить каталог вместе со всем его содержимым можно командой rm с ключом «-r ». Команда rm -r имя каталога(ов) - очень удобный способ потерять в одночасье все файлы: она рекурсивно (этот термин обозначает примерно то же, что у Windows запустить uninstaller ) обходит весь каталог, удаляя всё, что попадётся - файлы, подкаталоги и т.д., а ключ «-f » (force) делает её работу ещё более неотвратимой, так как подавляет запросы вида «удалить защищённый от записи файл», так что rm работает безмолвно и безостановочно. Будьте внимательны при использовании этой команды.

Команда cat - позволяет вывести на экран содержимое любого файла, однако в таком виде эта команда практически не используется. Если файл слишком большой, то его содержимое пролистается на экране, а Вы увидите только последние строки файла. С помощью этой команды можно комбинировать и объединять копии файлов, а также создавать новые файлы. Если набрать просто в командной строке cat и нажать Enter , то можно вводить (и соответственно видеть) текст на экране. Повторное нажатие клавиши Enter удвоит строку и позволит начать следующую. Когда текст набран, следует одновременно нажать клавиши Ctrl и d .

Так происходит потому, что первую строку вводите Вы сами, а вторую копирует команда cat на экран. Если переадресовать (т.е. записать) вывод в файл txt , то никакого удвоения не произойдет, зато в рабочем каталоге появится новый файл с набранным текстом, который спокойно можно просмотреть через эту команду:

cat > txt

Эта команда сможет прочесть и открыть любой файл, не только текстовый, но толку от того, что вы откроете, например, графический файл, не будет никакого. На экран выведется бестолковый набор символов.

Некоторые опции, которые можно использовать с этой командой:

  • -A показывает все невидимые символы;
  • -E показывает символы конца строки;
  • -e показывает непечатаемые символы плюс символ конца строки;
  • -b нумерует непустые строки;
  • -n нумерует все строки.

Давайте попробуем объединить два файла в один с помощью команды cat :
У нас есть два файла - dokument и txt , мы объединим их в один galina , введя команду

cat dokument txt >galina

Вот и все - наши два файла объединены в один с сохранением и первого, и второго файлов в одном общем файле:)

Если файл слишком большой, то для просмотра на экране надо воспользоваться командами more и less .

  • more выводит содержимое файла на экран постранично, размером как раз на целый экран. Для того, чтобы увидеть следующую страницу, надо нажать на клавишу пробела. Выйти из режима просмотра можно с помощью клавиши Q.
  • less содержит все функции и команды управления выводом, имеющиеся в more и дополнительные, например, для перемещения по тексту Вы можете использовать клавиши Стрелка вверх , Стрелка вниз , PgUp , PgDown .
  • Команда locate - выполняет поиск файла. С помощью этой команды Вы можете увидеть все файлы или каталоги, названия которых содержат искомый образец. Например, для поиска файла, содержащего в названии слово dokument.old, введите в командной строке

locate dokument.old

Команда locate нашла все файлы dokument.old . В системе их оказалось три. Можно задать и более расширенный поиск, например, если вместо dokument.old Вы укажите "кусочек" названия, например "doku ". Будут найдены ВСЕ файлы, где встречается это буквосочетание.

Есть еще одна аналогичная команда для поиска файлов - это find . У этой команды много опций, но чаще всего используется опция -name - она задает поиск всех файлов и каталогов, содержащих в названии заданное вами сочетание букв.

Еще одна полезная команда - which . Она показывает положение исполняемых файлов. Команда полезна при создании кнопки запуска какого-либо приложения.

Чтобы создать кнопку запуска, Вы должны знать команду запуска приложения, для которого захотите создать кнопку запуска на рабочем столе. На данном рисунке видно, что команда запуска ls - это /usr/bin/ls

Команда clear (а также сочетание клавиш Ctrl+L ) - очищает окно терминала. Это бывает полезным, когда Вы передвигаетесь по каталогам, файлам, поскольку окно терминала заполняется кучей команд или просто какой-нибудь информацией. При этом приглашение командной строки будет смещено вниз – что не всегда удобно. Чтобы не выходить из командной строки и снова заходить в нее, нужно воспользоваться командой clear .

Ну и напоследок хочу отметить еще две полезных и очень нужных команды.

Первая это history . Само название команды говорит само за себя. Это история команд, которую Вы вводили в окне терминала. Для новичков или даже продвинутых пользователей довольно утомительно запоминать, как пишется та или иная команда (я говорю не об однословных командах, а о командах, содержащих в себе 2-3-4 слова, например, system-config-authentication). Эта команда выведет на экран список ранее введенных команд (список этих команд можно ещё посмотреть в файле.bash_history . Он находится в вашей домашней папке пользователя). Просто наберите: !"номер команды в history ", например !847 .

И закончим мы знакомство, пожалуй, с самой важной командой в Linux . Это команда man - сокращенно от "manual " (руководство). Ею можно вызвать страницы документации о предназначении и об использовании команд в системе. Введя man , пробел и название любой команды, Вы увидите страницу документации по выбранной команде, например, введите man clear

Выход из справки - q

Как и любая другая справочная система, система man имеет собственную man -страницу. Введите man man и получите подробнейшую документацию по самой команде man .

Послесловие.

Как-то так. Как и всегда ждем от Вас комментариев, дополнений и всего такого прочего.

На этом мы закончим нашу очередную лекцию:). Будут и следующие, надеюсь, что интересные и захватывающие. Если есть, что дополнить (добавить), милости прошу, добавляйте в своих комментариях.

P.S. За существование данной статьи спасибо члену команды Pantera

Любая операционная система поддерживает несколько файловых систем, например, Windows поддерживает такие известные всем файловые системы, как FAT , FAT32 , NTFS и др. Linux не исключение.

Изучаем Linux, 101

Управление файлами и директориями

Изучение основ работы с файлами и директориями Linux

Серия контента:

Краткий обзор

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

  • Просматривать содержимое директорий.
  • Копировать, перемещать и удалять файлы и директории.
  • Рекурсивно управлять несколькими файлами и директориями.
  • Использовать метасимволы для управления файлами.
  • Использовать команду find для поиска и выполнения действий с файлами на основе их типа, размера или метки времени.
  • Сжимать и распаковывать файлы при помощи команд gzip и bzip2 .
  • Архивировать файлы при помощи команд tar , cpio и dd .
Об этой серии

Эта серия статей поможет вам освоить задачи администрирования операционной системы Linux. Вы также можете использовать материал этих статей для подготовки к .

Чтобы посмотреть описания статей этой серии и получить ссылки на них, обратитесь к нашему . Этот перечень постоянно дополняется новыми статьями по мере их готовности и содержит самые последние (по состоянию на апрель 2009 года) цели экзаменов сертификации LPIC-1. Если какая-либо статья отсутствует в перечне, можно найти ее более раннюю версию, соответствующую предыдущим целям LPIC-1 (до апреля 2009 года), обратившись к нашим .

Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 103.3 темы 103. Цель имеет вес 4.

Необходимые условия

Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать базовыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все встречающиеся команды. Иногда различные версии программ выводят результаты по-разному, поэтому содержимое листингов и рисунков может отличаться от того, что вы увидите на вашем компьютере.

Просмотр директорий

Как связаться с Яном

Ян – один из наших наиболее популярных и плодовитых авторов. Ознакомьтесь со (EN), опубликованными на сайте developerWorks. Вы можете найти контактные данные в и связаться с ним, а также с другими авторами и участниками ресурса My developerWorks.

В Linux и UNIX® все файлы хранятся в виде дерева файловой системы с корневой директорией /. К этому дереву можно добавлять или удалять дополнительные ветви, монтируя или демонтируя их соответственно. Эти операции рассматривается в другой статье этой серии – "Монтирование и демонтаж файловых систем " (см. ).

Просмотр содержимого директории

При изучении команд в этой статье мы будем использовать файлы, которые были созданы в предыдущей статье этой серии " ". Если вы выполняли все упражнения данной статьи, то в вашей домашней директории должна присутствовать директория lpi103-2. Если такой директории у вас нет, то можете использовать любую другую директорию.

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

Если вы знаете имя файла или директории относительно текущей рабочей директории, то вы можете просто объединить абсолютное имя рабочей директории, символ / и относительное имя. Например, директория lpi103-2 из предыдущей статьи была создана в моей домашней директории, /home/ian, поэтому ее полный, или абсолютный путь – это /home/ian/lpi103-2.

Имя текущей рабочей директории можно узнать при помощи команды pwd . Также это имя обычно содержится в переменной окружения PWD. В листинге 1 приведен пример использования команды pwd , а также показаны три различных способа использования команды ls для вывода списка файлов этой директории.

Листинг 1. Просмотр содержимого директории
$ pwd /home/ian/lpi103-2 $ echo "$PWD" /home/ian/lpi103-2 $ ls sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab $ ls "$PWD" sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab $ ls /home/ian/lpi103-2 sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab

Как вы видите, для просмотра содержимого директории команде ls можно передать как ее относительное, так и абсолютное имя.

Вывод детальной информации

Файлы и директории располагаются на устройстве хранения в виде набора блоков . Информация о файле (такая, как владелец файла, время последнего обращения к файлу, размер файла, права на чтение или запись, является ли элемент файлом или директорией) хранится в индексном дескрипторе inode . Номер inode, известный также как порядковый номер файла , является уникальным в пределах отдельной файловой системы. Для вывода некоторых сведений, хранящихся в inode, можно использовать опцию -l (или --format=long).

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

В листинге 2 приведен пример использования опций -l и -a для подробного вывода содержимого директории (включая элементы. и..).

Листинг 2. Подробный просмотр содержимого директории
$ ls -al total 52 drwxrwxr-x. 2 ian ian 4096 2009-08-11 21:21 . drwx------. 35 ian ian 4096 2009-08-12 10:55 .. -rw-rw-r--. 1 ian ian 8 2009-08-11 21:17 sedtab -rw-rw-r--. 1 ian ian 24 2009-08-11 14:02 text1 -rw-rw-r--. 1 ian ian 25 2009-08-11 14:27 text2 -rw-rw-r--. 1 ian ian 63 2009-08-11 15:41 text3 -rw-rw-r--. 1 ian ian 26 2009-08-11 15:42 text4 -rw-rw-r--. 1 ian ian 24 2009-08-11 18:47 text5 -rw-rw-r--. 1 ian ian 98 2009-08-11 21:21 text6 -rw-rw-r--. 1 ian ian 15 2009-08-11 14:41 xaa -rw-rw-r--. 1 ian ian 9 2009-08-11 14:41 xab -rw-rw-r--. 1 ian ian 17 2009-08-11 14:41 yaa -rw-rw-r--. 1 ian ian 8 2009-08-11 14:41 yab

В первой строке листинга 2 мы видим общее количество дисковых блоков (52), занимаемых выведенными на экран файлами. Остальные строки содержат информацию о содержимом директории.

  • Первое поле (в нашем случае, drwxrwxr-x или -rw-rw-r--) говорит нам о том, является ли запись директорией (d) или обычным файлом (-). Также вы можете встретить символические ссылки (|) или другие обозначения некоторых специальных файлов (например, файлы в файловой системе /dev). Более подробно о символических ссылках рассказывается в другой статье этой серии "" (см. ). После поля с типом следует три набора разрешений (таких как rwx или r--): для владельца файла, для членов группы владельца и для всех остальных пользователей. Три значения определяют, имеет ли владелец, группа или все пользователи, соответственно, разрешения на чтение (r), запись (w) или выполнение (x). Другие атрибуты, такие как setuid, будут рассмотрены в другой статье этой серии "Управление разрешениями и правами владения файлов " (см. ).
  • Следующее поле содержит номер, который говорит нам о количестве жестких ссылок на файл. Как уже говорилось, индексный дескриптор inode содержит информацию о файле. Запись о хранящемся в директории файле содержит жесткую ссылку (или указатель) на inode этого файла, следовательно, каждая запись должна иметь, по крайней мере, одну жесткую ссылку. Записи директорий имеют одну дополнительную ссылку для записи., и по одной ссылке для каждой поддиректории. Таким образом, из листинга 2 видно, что моя домашняя директория, обозначенная как.., имеет несколько поддиректорий, поскольку содержит 35 жестких ссылок.
  • Следующие два поля содержат имя владельца файла и имя основной группы, в которую он входит. В некоторых дистрибутивах Linux (например, Red Hat или Fedora) по умолчанию для каждого пользователя создается отдельная группа. В других системах все пользователи могут входить в одну или несколько групп.
  • Следующее поле содержит размер файла в байтах.
  • Предпоследнее поле содержит время модификации файла.
  • И, наконец, последнее поле содержит имя файла или директории.

Опция -i команды ls отобразит номера индексных дескрипторов inode. Мы вернемся к рассмотрению индексных дескрипторов далее в этой статье, а также в статье "Работа с жесткими и символическими ссылками " (см. ).

Информация о нескольких файлах

Вы можете передать команде ls несколько параметров, каждый из которых будет являться либо именем файла, либо именем директории. Если параметр является именем директории, то вместо информации об этой директории команда ls покажет ее содержимое. В нашем случае предположим, что мы хотим получить информацию о самой директории lpi103-2. Команда ls -l ../lpi103-2 выдаст нам ту же информацию, что и в предыдущем примере. В листинге 3 показано, как использовать опцию -d для вывода информации о записи директории, а не ее содержимого; также показано, как вывести записи для нескольких файлов или директорий.

Листинг 3. Использование ls –d
$ ls -ld ../lpi103-2 sedtab xaa drwxrwxr-x. 2 ian ian 4096 2009-08-12 15:31 ../lpi103-2 -rw-rw-r--. 1 ian ian 8 2009-08-11 21:17 sedtab -rw-rw-r--. 1 ian ian 15 2009-08-11 14:41 xaa

Заметьте, что время модификации директории lpi103-2 отличается от времени, которое мы видим в предыдущем листинге. Кроме того, так же, как и в предыдущем листинге, это время отличается от времени модификации любого файла в этой директории. Дело в том, что во время работы над этой статьей я создал несколько дополнительных примеров, после чего удалил их; именно об этом и говорят временные метки директории. Подробнее о временных метках файлов мы поговорим чуть позже в разделе .

Сортировка вывода

По умолчанию команда ls выводит имена файлов в алфавитном порядке. Для сортировки вывода существует ряд опций. Например, команда ls -t отсортирует файлы по времени их модификации (от самых новых до самых старых), а команда ls -lS сформирует подробный список файлов, отсортированных по размеру (от самых больших до самых маленьких). Если добавить опцию -r , то сортировка будет выполнена в обратном порядке. Например, используйте команду ls -lrt для вывода подробного списка файлов, отсортированных по дате модификации в обратном порядке. Об остальных возможностях сортировки файлов и директорий вы можете узнать из man-страницы.

Копирование, перемещение и удаление файлов

Итак, мы уже знаем, как создавать файлы, но что делать, если мы хотим скопировать или переименовать их, переместить их в другое место файловой системы или даже удалить. Для этого предназначены три короткие команды:

cp используется для копирования одного или нескольких файлов или директорий. Вы должны указать одно или несколько имен источников и одно конечное имя. Имя источника или конечное имя может включать в себя путь. Если конечным именем является имя существующей директории, то все источники будут скопированы в нее. Если директория с конечным именем не существует, то (единственный) источник должен также являться директорией; источник и его содержимое будет скопировано во вновь созданную директорию с указанным именем. Если конечным именем является имя файла, то (единственный) источник должен также являться файлом; копия источника будет создана в виде файла с указанным конечным именем, и если файл с таким именем уже существует в системе, то он будет замещен новым файлом. Обратите внимание на то, что, в отличие от операционных систем DOS и Windows, в Linux текущая директория не является по умолчанию конечной директорией. mv используется для перемещения или переименования одного или нескольких файлов или директорий. В общем случае правила использования имен совпадают с правилами для команды cp ; вы можете переименовать отдельный файл или переместить несколько файлов в новую директорию. Поскольку имена – это всего лишь записи в директориях, указывающие на дескриптор inode, то вас не должен удивлять тот факт, что номер inode не меняется до тех пор , пока файл не перемещается в другую файловую систему (в этом случае операция перемещения больше похожа на операцию копирования с последующим удалением исходного файла). rm используется для удаления одного или нескольких файлов. О том, как удалять директории, я расскажу чуть позже.
Куда подевалась команда?

Если вы работали в операционной системе DOS или Windows®, то вам может показаться странным, что для переименования файла используется команда mv . В Linux есть команда rename , но ее синтаксис отличается от синтаксиса одноименной команды в DOS или Windows. Для получения дополнительной информации об этой команде обратитесь к man-странице.

В листинге 4 приведены примеры использования команд cp и mv для создания нескольких резервных копий наших текстовых файлов. Также мы использовали команду ls -i , чтобы показать номера индексных дескрипторов некоторых файлов.

  1. Сначала мы создали копию нашего файла text1 и назвали ее text1.bkp.
  2. Затем мы решили создать с помощь команды mkdir поддиректорию backup для хранения резервных копий.
  3. Мы создали вторую резервную копию файла text1 (на этот раз в поддиректории backup) и показали, что все три файла имеют различные дескрипторы inode.
  4. Мы переместили наш файл text1.bkp в поддиректорию backup и переименовали его в соответствии с именем второй резервной копии. Хотя это можно было сделать с помощью одной команды, для наглядности мы использовали две.
  5. Мы снова проверяем дескрипторы inode и убеждаемся в том, что файл text1.bkp c inode 934193 больше не находится в нашей директории lpi103-2, а данный номер inode теперь принадлежит файлу text1.bkp.1 в директории backup.
Листинг 4. Копирование и перемещение файлов
$ cp text1 text1.bkp $ mkdir backup $ cp text1 backup/text1.bkp.2 $ ls -i text1 text1.bkp backup 933892 text1 934193 text1.bkp backup: 934195 text1.bkp.2 $ mv text1.bkp backup $ mv backup/text1.bkp backup/text1.bkp.1 $ ls -i text1 text1.bkp backup ls: cannot access text1.bkp: No such file or directory 933892 text1 backup: 934193 text1.bkp.1 934195 text1.bkp.2

Обычно команда cp перезаписывает конечный файл, если он существует и может быть перезаписан. С другой стороны, команда mv не перемещает и не переименовывает файл, если существует другой файл с таким же именем. Имеется несколько полезных опций для управления поведением команд cp и mv .

-f или --force указывает команде cp попытаться удалить существующий файл назначения, даже если он не доступен для перезаписи. -i или --interactive запрашивает подтверждение при попытке заместить существующий файл. -b или --backup создает резервные копии всех замещаемых файлов.

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

В листинге 6 приведен пример создания резервных копий с последующим удалением исходных файлов.

Листинг 5. Создание резервных копий и удаление файлов
$ cp text2 backup $ cp --backup=t text2 backup $ ls backup text1.bkp.1 text1.bkp.2 text2 text2.~1~ $ rm backup/text2 backup/text2.~1~ $ ls backup text1.bkp.1 text1.bkp.2

Заметьте, что команда rm позволяет использовать опции -i (interactive – интерактивный) и -f (force – принудительный). Если файл удален с помощью rm , файловая система больше не имеет к нему доступа. В некоторых системах для пользователя root по умолчанию определен псевдоним alias rm="rm -i" , позволяющий предотвратить случайное удаление файлов. Эту возможность могут использовать и обычные пользователи, которые боятся случайно удалить что-нибудь.

Перед тем, как закончить рассмотрение этой темы, следует заметить, что для новых файлов команда cp по умолчанию создает новую метку времени. Владельцем (и группой) нового файла становится пользователь (и его группа), который осуществляет копирование. Для сохранения выбранных атрибутов можно использовать опцию -p . Заметьте, что пользователь root может оказаться единственным пользователем, который может сохранять права владения. Дополнительную информацию вы можете найти на man-странице.

Создание и удаление директорий

Вы уже знаете, как создавать директории с помощью команды mkdir . Теперь пойдем дальше и рассмотрим аналог mkdir для удаления директорий – программу rmdir .

Команда mkdir

Предположим, что мы находимся в нашей директории lpi103-2 и хотим создать поддиректории dir1 и dir2. Так же, как и уже рассмотренные команды, команда mkdir может обрабатывать запросы на создание сразу нескольких директорий, как показано в листинге 6.

Листинг 6. Создание нескольких директорий
$ mkdir dir1 dir2

Обратите внимание на отсутствие какого-либо вывода в случае успешного выполнения команды. Чтобы убедиться в том, что код завершения действительно равен 0, вы можете использовать команду echo $? .

Если вы хотите создать вложенную поддиректорию, например, d1/d2/d3, то выполнение команды завершится с ошибкой, поскольку директорий d1 и d2 не существует. К счастью, у команды mkdir есть опция -p , позволяющая создавать любое количество родительских директорий, как показано в листинге 7.

Листинг 7. Создание родительских директорий
$ mkdir d1/d2/d3 mkdir: cannot create directory `d1/d2/d3": No such file or directory $ echo $? 1 $ mkdir -p d1/d2/d3 $ echo $? 0

Команда rmdir

Команда rmdir предназначена для удаления директорий. Если указана опция -p , то удаляются также все родительские директории. Поскольку опции для принудительного удаления не существует, то с помощью rmdir можно удалять только пустые директории. Мы рассмотрим другой способ удаления директорий в разделе . Когда вы познакомитесь с этим способом, возможно, уже не будете часто использовать команду rmdir в командной строке, однако, знать о ней не помешает.

Чтобы продемонстрировать удаление директории, мы скопировали наш файл text1 в директорию d1/d2, которая теперь не пуста. Затем мы выполнили команду rmdir для удаления всех директорий, которые только что были созданы с помощью mkdir . Как вы видите, директории d1 и d2 не были удалены, поскольку директория d2 содержит файлы. Все остальные директории были удалены. Как только мы удалим копию файла text1 из директории d2, мы сможем удалить директории d1и d2 с помощью единственной команды rmdir -p .

Листинг 8. Удаление директорий
$ cp text1 d1/d2 $ rmdir -p d1/d2/d3 dir1 dir2 rmdir: failed to remove directory `d1/d2": Directory not empty $ ls . d1/d2 .: backup sedtab text2 text4 text6 xab yab d1 text1 text3 text5 xaa yaa d1/d2: text1 $ rm d1/d2/text1 $ rmdir -p d1/d2

Обработка нескольких файлов и директорий

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

Рекурсивные действия

Рекурсивный вывод содержимого директорий

У команды ls имеется опция -R (обратите внимание на верхний регистр "R") для вывода содержимого директории и всех ее поддиректорий. Рекурсивная опция применяется только к именам директорий; она не найдет в дереве каталогов, например, все файлы с именем "text1". Вы можете использовать и другие известные вам опции совместно с опцией -R . В листинге 9 показан рекурсивный вывод содержимого нашей директории lpi103-2, включая номера дескрипторов inode.

Листинг 9. Рекурсивный вывод содержимого директории
$ ls -iR .: 934194 backup 933892 text1 933898 text3 933900 text5 933894 xaa 933896 yaa 933901 sedtab 933893 text2 933899 text4 933902 text6 933895 xab 933897 yab ./backup: 934193 text1.bkp.1 934195 text1.bkp.2

Рекурсивное копирование

Вы можете использовать опцию -r (или -R или --recursive) команды cp для просмотра исходных директорий и рекурсивного копирования их содержимого. Для предотвращения бесконечной рекурсии сама исходная директория не может быть скопирована. В листинге 10 показано, как полностью скопировать содержимое нашей директории lpi103-2 в поддиректорию copy1. Для просмотра результирующего дерева каталогов мы используем команду ls -R .

Листинг 10. Рекурсивное копирование
$ cp -pR . copy1 cp: cannot copy a directory, `.", into itself, `copy1" $ ls -R .: backup copy1 sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab ./backup: text1.bkp.1 text1.bkp.2 ./copy1: text2 text3 text5 xaa yaa yab

Рекурсивное удаление

Ранее мы упоминали, что команда rmdir удаляет только пустые директории. Мы можем использовать опцию -r (или -R или --recursive) команды rm для удаления и файлов и директорий, как показано в листинге 11. В листинге 11 мы удаляем только что созданную директорию copy1 вместе с ее содержимым, включая поддиректорию backup и все файлы в ней.

Листинг 11. Рекурсивное удаление
$ rm -r copy1 $ ls -R .: backup sedtab text1 text2 text3 text4 text5 text6 xaa xab yaa yab ./backup: text1.bkp.1 text1.bkp.2

Если имеются файлы, не доступные вам для записи, то может потребоваться опция -f для принудительного удаления. Это часто используется пользователем root во время очистки системы, однако имейте в виду, что при неосторожном использовании этой опции вы можете потерять важные данные.

Метасимволы и подстановка имен файлов

Часто возникает необходимость выполнить простую операцию над множеством объектов файловой системы, не оперируя целым деревом каталогов, как мы только что делали при выполнении рекурсивных действий. Например, вам может потребоваться узнать время модификации всех текстовых файлов, которые были созданы в директории lpi103-2, не выводя список отдельных файлов. Хотя это достаточно просто сделать для нашей небольшой директории, для больших файловых систем все оказывается намного сложнее.

Для решения этой проблемы используйте поддержку метасимволов, встроенную в интерпретатор bash. Эта поддержка также называется подстановкой имен ("globbing" – название, произошедшее от имени программы /etc/glob) и позволяет вам определять множество файлов с помощью шаблонов подстановки.

? соответствует любому одиночному символу. * соответствует любой строке, включая пустую строку. [ представляет класс символов . Класс символов – это непустая строка, оканчивающаяся символом "]". Соответствие означает совпадение с любым отдельным символом, заключенным в квадратные скобки. Существует несколько специальных соглашений:
  • Символы "*" и "?" означают сами себя. Если вы используете их в именах файлов, необходимо уделять внимание правильному использованию кавычек и escape-последовательностей.
  • Поскольку строка не должна быть пустой и оканчивается символом "]", вы должны помещать символ "]" первым в строке, если хотите найти для него соответствие.
  • Символ "-", помещенный между двумя другими символами, означает диапазон, включающий в себя эти два символа, а также все символы между ними в соответствии со схемой упорядочения. Например, конструкция соответствует любой шестнадцатеричной цифре в нижнем или верхнем регистре. Если вы хотите найти соответствие для символа "-", помещайте его либо первым, либо последним в диапазоне.
  • Символ "!", помещенный в первой позиции диапазона, означает, что диапазону будут соответствовать любые символы, за исключением указанных в нем. Например, конструкция [!0-9] соответствует любому символу за исключением цифр от 0 до 9. Символ "!", помещенный в любой другой позиции диапазона, соответствует самому себе. Помните, что символ "!" также используется в истории командного интерпретатора, поэтому будьте внимательны и аккуратно используйте его.

Примечание. Шаблоны подстановки и регулярные выражения имеют определенные сходства, однако это не одно и то же. Обратите на это особое внимание!

Подстановка применяется отдельно к каждому компоненту имени пути. Вы не можете задать соответствие символу "/" или включить его в диапазон. Вы можете использовать его в любом месте для указания нескольких файлов или имен директорий, например, в командах ls , cp , mv или rm . В листинге 12 мы сначала создаем несколько файлов со странными именами, а затем используем команды ls и rm совместно с шаблонами подстановки.

Листинг 12. Примеры шаблонов подстановки
$ echo odd1>"text[*?!1]" $ echo odd2>"text" $ ls backup text1 text2 text3 text5 xaa yaa sedtab text[*?!1] text text4 text6 xab yab $ ls text text2 text3 text4 $ ls text[!2-4] text1 text5 text6 $ ls text** text2 text text3 text4 $ ls text*[!2-4]* # Surprise! text1 text[*?!1] text text5 text6 $ ls text*[!2-4] # Another surprise! text1 text[*?!1] text text5 text6 $ echo text*>text10 $ ls *\!* text[*?!1] text $ ls ** text1 text[*?!1] text10 text2 text text3 text4 text5 text6 xaa xab $ ls ** text[*?!1] text yaa yab $ ls tex?[* text[*?!1] text $ rm tex?[* $ ls *b* sedtab xab yab backup: text1.bkp.1 text1.bkp.2 $ ls backup/*2 backup/text1.bkp.2 $ ls -d .* . ..

Примечания:

  1. Образование дополнения совместно с символом "*" может привести к некоторым сюрпризам. Шаблон "*[!2-4]" соответствует самой длинной части имени, после которой не следуют цифры 2, 3 или 4, что соответствует как имени text[*?!1], так и имени text.
  2. Так же, как и в предыдущих примерах команды ls , если удовлетворяющее шаблону имя является именем директории, и опция -d не указана, то будет выведен список содержимого этой директории (как в случае с шаблоном "*b*" из нашего примера).
  3. Если имя файла начинается с точки (.), то этот символ должен быть указан явно. Заметьте, что только последняя команда ls отобразила две специальных записи (. и..).

Помните, что любой групповой символ обрабатывается командным интерпретатором, что может привести к непредсказуемым результатам. Более того, если вы зададите шаблон подстановки, которому не соответствует ни один объект файловой системы, то в соответствии со стандартом POSIX требуется, чтобы команде была передана исходная строка шаблона. Некоторые более ранние версии передавали команде пустой список, поэтому вам могут встретиться старые сценарии, которые ведут себя необычно. Проиллюстрируем сказанное в листинге 13.

Листинг 13. Сюрпризы при использовании шаблонов подстановки
$ echo text* text1 text10 text2 text3 text4 text5 text6 $ echo "text*" text* $ echo text[[\!?]z?? text[[!?]z??

Для получения дополнительной информации о подстановке имен обратитесь к man-странице man 7 glob . Необходимо указать номер раздела, поскольку информация о подстановке содержится также в разделе 3. Лучший способ научиться работать с шаблонами подстановки – это практика, поэтому пробуйте использовать метасимволы каждый раз, когда вам представится эта возможность. Чтобы избежать непоправимых действий, не забывайте проверять ваши шаблоны подстановки с помощью ls , а уже потом применять к ним такие команды, как cp , mv или, тем более, rm .

Использование touch

В этом разделе мы рассмотрим команду touch , которая может обновлять время доступа к файлу или время его модификации, а также создавать пустые файлы. Вы увидите, как использовать эту информацию для поиска файлов и директорий. В наших примерах мы продолжим использовать директорию lpi103-2. Также мы рассмотрим различные способы задания временных меток.

Команда touch

Команда touch , запущенная без каких-либо опций, принимает в качестве параметров один или несколько имен файлов и обновляет время их модификации – значение, которое обычно отображается при подробном выводе содержимого директорий. В листинге 14 мы используем хорошо знакомую нам команду echo для создания небольшого файла с именем f1, а затем выводим содержимое директории в подробном виде для отображения времени модификации (или mtime ). В данном случае временем модификации будет являться время создания файла. Затем мы используем команду sleep , чтобы подождать 60 секунд, и запускаем команду ls снова. Заметьте, что временная метка файла изменилась на одну минуту.

Листинг 14. Обновление времени последнего изменения при помощи touch
$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1 -rw-rw-r--. 1 ian ian 4 2009-08-14 18:24 f1 -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1

Если вы укажете имя несуществующего файла, то команда touch создаст пустой файл с этим именем (если не используется опция -c или --no-create). В листинге 15 приведены примеры обеих команд. Обратите внимание на то, что был создан только файл f2.

Листинг 15. Создание пустых файлов при помощи touch
$ touch f2; touch -c f3; ls -l f* -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2

С помощью опции -d или -t команды touch можно также устанавливать дату и время модификации файлов (также известное как mtime ) соответственно. Опция -d понимает много различных форматов даты и времени, тогда как опция -t требует, чтобы время было указано в формате MMDDhhmm (год и секунды являются необязательными параметрами). В листинге 16 приведено несколько примеров.

Листинг 16. Установка mtime при помощи touch
$ touch -t 200908121510.59 f3 $ touch -d 11am f4 $ touch -d "last fortnight" f5 $ touch -d "yesterday 6am" f6 $ touch -d "2 days ago 12:00" f7 $ touch -d "tomorrow 02:00" f8 $ touch -d "5 Nov" f9 $ ls -lrt f* -rw-rw-r--. 1 ian ian 0 2009-07-31 18:31 f5 -rw-rw-r--. 1 ian ian 0 2009-08-12 12:00 f7 -rw-rw-r--. 1 ian ian 0 2009-08-12 15:10 f3 -rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 f6 -rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 f4 -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2 -rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 f8 -rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 f9

Если вы затрудняетесь составить выражение для нужной даты, то вы можете определиться с помощью команды date . Эта команда также имеет опцию -d и может понимать те же самые форматы даты, что и команда touch .

Вы можете использовать опцию -r (или --reference) совместно с именем ссылочного файла , чтобы указать программе touch (или date) на то, что она должна установить дату в соответствии с временной меткой существующего файла. В листинге 17 приведено несколько примеров.

Листинг 17. Временные метки ссылочных файлов
$ date Fri Aug 14 18:33:48 EDT 2009 $ date -r f1 Fri Aug 14 18:25:50 EDT 2009 $ touch -r f1 f1a $ ls -l f1* -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a

Система Linux записывает как время модификации файла, так и время доступа к файлу (mtime и atime соответственно). Обе временные метки имеют одинаковое значение в момент создания файла и вместе сбрасываются при его изменении. Если было выполнено обращение к файлу, то обновляется время доступа, даже если файл не был модифицирован. В нашем последнем примере работы с командой touch мы рассмотрим время доступа . Опция -a (или --time=atime , --time=access или --time=use) указывает на то, что время доступа необходимо обновить. В листинге 18 мы используем команду cat для обращения к файлу f1 и вывода его содержимого. Затем мы используем команды ls -l и ls -lu для вывода времени модификации и времени доступа, соответственно, для файлов f1 и f1a, который мы создали, используя файл f1 в качестве ссылочного файла. В заключение, с помощью touch -a мы меняем время доступа файла f1 на время доступа файла f1a и проверяем результат.

Листинг 18. Время доступа и время модификации
$ ls -lu f1* -rw-rw-r--. 1 ian ian 4 2009-08-14 18:39 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a $ ls -l f1* -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a $ touch -a -r f1a f1 $ ls -lu f1* -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a

Более полную информацию о различных спецификациях времени и даты вы можете получить на man- или info-страницах команд touch и date .

Поиск файлов

Теперь, когда наша тема о файлах и директориях была исчерпана молотом рекурсии и подстановок, давайте рассмотрим команду find , которая больше похожа на хирургический скальпель. Команда find используется для поиска файлов в дереве каталогов на основе их имени, даты или размера. В этот раз мы снова будем использовать нашу директорию lpi103-2.

Команда find

Команда find выполняет поиск файлов или директорий, используя полное имя или его часть; поиск может выполняться и по другим критериям, таким как размер, тип, владелец, дата создания или последнего обращения. Наиболее распространенным является поиск по имени или по его части. В листинге 19 приведено несколько примеров поиска файлов: сначала мы ищем в директории lpi103-2 все файлы, в названии которых содержится символ "1" или "k", а затем выполняем поиск путей, о котором подробно поясняется в примечаниях.

Листинг 19. Поиск файлов по имени
$ find . -name "**" ./f1a ./f1 ./text10 ./backup ./backup/text1.bkp.1 ./backup/text1.bkp.2 ./text1 $ find . -ipath "*ACK*1" ./backup/text1.bkp.1 $ find . -ipath "*ACK*/*1" [

Примечания:

В первом примере листинга 19 мы нашли как файлы, так и директорию (./backup). Чтобы ограничить поиск, используйте параметр -type совместно с указанием типа (значение, состоящее из одного символа): "f" – обычные файлы, "d" – директории, "l" – символические ссылки. О других типах вы можете узнать на man-странице команды find . В листинге 20 представлены результаты поиска директорий (параметр -type d) с указанием имени (*, что в данном случае означает все директории).

Листинг 20. Поиск файлов по типу
$ find . -type d . ./backup $ find . -type d -name "*" . ./backup

Обратите внимание на то, что параметр -type d без указания имени выводит директории, имена которых начинаются с точки (в нашем случае только текущая директория); этот же результат достигается при использовании группового символа "*".

Можно также выполнять поиск файлов по их размеру; можно искать файлы определенного размера (n), а также файлы, размер которых больше (+n) или меньше (-n) заданного значения. Задавая начальные и конечные значения, можно искать файлы, размер которых попадает в заданный диапазон. По умолчанию опция -size команды find использует единицу измерения "b" – блоки, размером в 512 байтов. Другими единицами измерения могут быть "c" (байты) или "k" (килобайты). В листинге 21 мы сначала находим все файлы с нулевым размером, а затем все файлы, размером в 24 или 25 байтов. Обратите внимание на то, что если указать вместо опции -size 0 опцию -empty , то также будут найдены все файлы с нулевым размером.

Листинг 21. Поиск файлов по размеру
$ find . -size 0 ./f1a ./f6 ./f8 ./f2 ./f3 ./f7 ./f4 ./f9 ./f5 $ find . -size -26c -size +23c -print ./text2 ./text5 ./backup/text1.bkp.1 ./backup/text1.bkp.2 ./text1

Во втором примере листинга 21 мы используем опцию -print , являющуюся примером действия , которое может быть выполнено над результатами поиска. В интерпретаторе bash это действие выполняется по умолчанию, если не указаны другие действия. В некоторых системах и командных интерпретаторах действие должно быть обязательно указано, в противном случае вы не увидите никаких результатов на экране.

Другими действиями являются -ls (вывод информации о файле, аналогичный выводу команды ls -lids) и -exec (выполнение команды для каждого файла). Действие -exec должно оканчиваться точкой с запятой, чтобы интерпретатор не воспринимал его как обычный набор команд. Также поставьте {} в любом месте команды, в котором должен использоваться возвращаемый файл. Не забывайте, что командный интерпретатор обрабатывает фигурные скобки, поэтому их необходимо указывать в виде escape-последовательностей (или заключать в кавычки). В листинге 22 показан пример использования опций -ls и -exec для вывода информации о файлах. Обратите внимание на то, что во втором примере не выводится информация об индексных дескрипторах inode.

Листинг 22. Поиск и выполнение действий над файлами
$ find . -size -26c -size +23c -ls 933893 4 -rw-rw-r-- 1 ian ian 25 Aug 11 14:27 ./text2 933900 4 -rw-rw-r-- 1 ian ian 24 Aug 11 18:47 ./text5 934193 4 -rw-rw-r-- 1 ian ian 24 Aug 12 15:36 ./backup/text1.bkp.1 934195 4 -rw-rw-r-- 1 ian ian 24 Aug 12 15:36 ./backup/text1.bkp.2 933892 4 -rw-rw-r-- 1 ian ian 24 Aug 11 14:02 ./text1 $ find . -size -26c -size +23c -exec ls -l "{}" \; -rw-rw-r--. 1 ian ian 25 2009-08-11 14:27 ./text2 -rw-rw-r--. 1 ian ian 24 2009-08-11 18:47 ./text5 -rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.1 -rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.2 -rw-rw-r--. 1 ian ian 24 2009-08-11 14:02 ./text1

Опцию -exec можно использовать для различных задач, и ее возможности ограничены лишь вашим воображением. Например, команда

Find . -empty -exec rm "{}" \;

Удаляет из дерева каталогов все пустые файлы, а команда

Find . -name "*.htm" -exec mv "{}" "{}l" \;

Переименовывает все файлы с расширением.htm на файлы с расширением.html.

В нашем последнем примере команды find мы выполняем поиск файлов на основе определенных временных меток (с которыми работает команда touch). Листинг 23 содержит три примера.

  1. При использовании опции -mtime -2 команда find ищет все файлы, которые были изменены за последние два дня. В данном случае день – это 24 часа начиная с текущего момента. Заметьте, что если бы вам требовалось найти файлы на основе времени доступа, а не времени модификации, то можно использовать для этого опцию -atime .
  2. Добавление опции -daystart означает, что мы хотим выполнять отсчет в календарных днях, начиная с полуночи. Таким образом, в этом примере отсутствует файл f3.
  3. В последнем примере мы демонстрируем использование временного диапазона, заданного в минутах, а не в днях, для поиска файлов, которые были изменены от часа (60 минут) до десяти часов (600 минут) назад.
Листинг 23. Поиск файлов по временным меткам
$ date Sat Aug 15 00:27:36 EDT 2009 $ find . -mtime -2 -type f -exec ls -l "{}" \; -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1 -rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 ./f6 -rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2 -rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10 -rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4 -rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9 $ find . -daystart -mtime -2 -type f -exec ls -l "{}" \; -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1 -rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2 -rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10 -rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4 -rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9 $ find . -mmin -600 -mmin +60 -type f -exec ls -l "{}" \; -rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a -rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1 -rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2 -rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10

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

Определение типа файла

Часто файлы имеют расширения (такие как gif, jpeg или html), которые позволяют понять, что может находиться внутри файла. В Linux такие расширения не являются обязательными и, как правило, не используются для определения типов файлов. Если вы знаете тип файла, вы можете выбрать подходящую программу для работы с ним. Команда file позволяет получить некоторую информацию о типе данных, хранящихся в одном или нескольких файлах. В листинге 24 приведено несколько примеров использования команды file .

Листинг 24. Определение содержимого файла
$ file backup text1 f2 ../p-ishields.jpg /bin/echo backup: directory text1: ASCII text f2: empty ../p-ishields.jpg: JPEG image data, JFIF standard 1.02 /bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Команда file пытается проанализировать каждый файл с помощью трех различных проверок. Проверки файловой системы используют результаты команды stat для определения того, чем является файл, например, он может являться пустым файлом или директорией. Так называемые magic проверки выполняют поиск в файлах определенного содержимого, позволяющего идентифицировать их. Эти идентификационные сигнатуры также известны как magic numbers . И наконец, языковые проверки проверяют содержимое текстовых файлов и пытаются определить их тип (XML-файл, исходный код на C или C++, файл troff или любой другой файл с исходным кодом какого-либо языкового процессора). Если не указана опция -k или --keep-going , то выводится информация о первом найденном типе файла, а дальнейшие проверки прекращаются.

Команда file имеет много опций, о которых вы можете узнать из man-страниц. В листинге 25 показано, как использовать опцию -i (или --mime) для вывода типа файла в виде MIME строки.

Листинг 25. Определение содержимого файла в виде MIME
$ file -i backup text1 f2 ../p-ishields.jpg /bin/echo backup: application/x-directory; charset=binary text1: text/plain; charset=us-ascii f2: application/x-empty; charset=binary ../p-ishields.jpg: image/jpeg; charset=binary /bin/echo: application/x-executable; charset=binary

Команда file также работает и с файлами, содержащими сигнатуры magic number. Дополнительную информацию вы можете найти на man-страницах.

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

Сжатие файлов

При создании резервных копий файлов, а также при их архивировании или передаче обычно применяется сжатие. Две популярных программы для сжатия файлов в Linux – это gzip и bzip2 . Команда gzip использует алгоритм Лемпеля-Зива, а команда bzip2 – блочно-сортирующий алгоритм Барроуза-Уилера.

Программы gzip и gunzip

Обычно наибольшая степень сжатия достигается при обработке текстовых файлов. Многие графические форматы уже являются сжатыми, поэтому для них (а, возможно, и для других двоичных файлов) сжатие может оказаться малоэффективным. Чтобы продемонстрировать результаты сжатия достаточно объемного текстового файла, давайте скопируем файл /etc/services в нашу директорию и сожмем его с помощью gzip, как показано в листинге 26. Мы используем опцию -p команды cp для сохранения метки времени файла /etc/services. Обратите внимание на то, что сжатый файл имеет расширение.gz и ту же самую метку времени.

Листинг 26. Сжатие с помощью gzip
$ cp -p /etc/services . $ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services $ gzip services $ ls -l serv* -rw-r--r--. 1 ian ian 124460 2009-04-10 04:42 services.gz

Файлы, сжатые с помощью gzip, распаковываются той же самой программой, запущенной с опцией -d , или командой gunzip (второй способ более распространен). В листинге 27 продемонстрирован первый способ. Обратите внимание на то, что имя и временная метка распакованного файла совпадают с исходным файлом.

Листинг 27. Распаковка с помощью gzip
$ gzip -d services.gz $ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services

Команды bzip2 и bunzip2

Как видно из листинга 28, работа команды bzip2 аналогична работе команды gzip .

Листинг 28. Сжатие с помощью bzip2
$ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services $ bzip2 services $ ls -l serv* -rw-r--r--. 1 ian ian 113444 2009-04-10 04:42 services.bz2 $ bunzip2 services.bz2 $ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services

Различия между gzip и bzip2

Хотя программы bzip2 и gzip имеют много одинаковых опций, они не идентичны. Вы могли заметить, что в обоих примерах распакованный файл имел те же имя и метку времени, что и исходный файл. Тем не менее, в результате переименования файла или выполнения над ним команды touch это поведение может измениться. У команды gzip имеется опция -N или --name , которая позволяет сохранять имя и временную метку, однако такой опции нет у команды bzip2 . Также у команды gzip имеется опция -l для вывода информации о сжатом файле, включая имя, которое он получит после распаковки. В листинге 29 показаны некоторые различия между этими командами.

Листинг 29. Некоторые различия между gzip и bzip2
$ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services $ gzip -N services $ touch services.gz $ mv services.gz services-x.gz $ ls -l serv* -rw-r--r--. 1 ian ian 124460 2009-09-23 14:08 services-x.gz $ gzip -l services-x.gz compressed uncompressed ratio uncompressed_name 124460 630983 80.3% services-x $ gzip -lN services-x.gz compressed uncompressed ratio uncompressed_name 124460 630983 80.3% services $ gunzip -N services-x.gz $ ls -l serv* -rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services $ $ bzip2 services $ mv services.bz2 services-x.bz2 $ touch services-x.bz2 $ ls -l serv* -rw-r--r--. 1 ian ian 113444 2009-09-23 14:10 services-x.bz2 $ bunzip2 services-x.bz2 $ ls -l serv* -rw-rw-r--. 1 ian ian 630983 2009-09-23 14:10 services-x $ rm services-x # Don"t need this any more

И gzip , и bzip2 получают входные данные с устройства stdin. У обеих команд имеется опция -c для направления вывода на устройство stdout.

С командой bzip2 связаны две другие команды.

  1. Команда bzcat распаковывает файлы на устройство stdout и эквивалентна команде bzip2 -dc .
  2. Команда bzip2recover пытается восстановить данные из поврежденных файлов bzip2.

Дополнительную информацию о командах gzip и bzip2 вы можете найти на соответствующих man-страницах.

Другие инструменты для сжатия

В системах Linux и UNIX все еще часто встречаются две более старых программы – compress и uncompress .

Кроме того, для операционной системы Linux в рамках проекта Info-ZIP разработаны утилиты zip и unzip . В этих программах используются кроссплатформенные функции сжатия, работающие на различном оборудовании под управлением различных операционных систем. Имейте в виду, что в различных операционных системах могут использоваться различные файловые атрибуты и возможности файловых систем. Если вы загрузите сжатый установочный zip-файл, распакуете его в операционной системе Windows, а затем запишете на компакт- или DVD-диск для последующей установки в Linux, то при установке с этого диска могут возникнуть проблемы; например, в ОС Windows отсутствует поддержка символических ссылок, которые могут оказаться частью несжатого исходного набора файлов.

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

Архивирование файлов

Для создания резервных копий групп файлов или даже целых разделов, а также для архивирования и передачи файлов на другой компьютер или другому пользователю широко применяются команды tar , cpio и dd . Вопросы резервного копирования подробно рассматриваются в экзамене LPI 201 на администратора среднего уровня (LPIC-2).

Существует три основных подхода к резервному копированию.

  1. Дифференциальное или кумулятивное архивирование – резервирование всех данных, которые изменились с момента создания последнего полного архива. Для восстановления данных необходимо иметь последний полный архив и самый последний дифференциальный архив.
  2. Инкрементное архивирование – резервирование только тех изменений, которые наступили с момента создания последнего инкрементного архива. Для восстановления данных необходимо иметь последний полный архив и все инкрементные архивы (по порядку), созданные после создания полного архива.
  3. Полное архивирование – резервирование всех данных целиком (обычно это файловая система, директория или группа файлов). Поскольку в этом случае время создания архива оказывается максимальным, то этот подход используется совместно с двумя другими.

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

Команда tar

Команда tar (исходное название Tape ARchive ) создает архивный файл (другое его название tarfile или tarball ) из нескольких файлов или директорий, а также извлекает файлы из созданных архивов. Если вы передали на вход команде tar имя директории, то в архив автоматически будут включены все находящиеся в ней файлы и поддиректории; благодаря этому tar очень удобно использовать для архивирования целых веток дерева каталогов.

Вывод может быть направлен в файл, на устройство архивирования (например, ленточный накопитель или другой сменный накопитель) или на стандартное устройство вывода stdout. Конечное местоположение указывается с помощью опции -f . Другими наиболее часто используемыми опциями являются -c (создать архив), -x (распаковать архив), -v (вывод подробного списка, содержащего имена обрабатываемых файлов), -z (использовать сжатие gzip) и -j (использовать сжатие bzip2). Большинство опций команды tar можно указывать кратко, используя одиночный дефис, и подробно, используя двойной дефис. Краткая форма показана в нашем примере. Информацию о дополнительных опциях и о подробной форме их записи вы можете найти на man-страницах.

В листинге 30 показано, как создать резервную копию нашей директории lpi103-2 с помощью tar .

Листинг 30. Создание резервной копии директории lpi103-2 с помощью tar
$ tar -cvf ../lpitar1.tar . ./ ./text3 ./yab ... ./f5

Обычно архивные файлы сжимаются для экономии дискового пространства или времени передачи архива. GNU-версия программы tar позволяет одновременно выполнять обе операции при помощи опции -z (сжатие с помощью gzip) или -b (сжатие с помощью bzip2). В листинге 31 приведен пример использования опции -z , а также показаны различия в размерах двух архивных файлов.

Листинг 31. Сжатие tar архива с помощью gzip
$ tar -zcvf ../lpitar2.tar ~/lpi103-2/ tar: Removing leading `/" from member names /home/ian/lpi103-2/ /home/ian/lpi103-2/text3 /home/ian/lpi103-2/yab ... /home/ian/lpi103-2/f5 $ ls -l ../lpitar* -rw-rw-r--. 1 ian ian 30720 2009-09-24 15:38 ../lpitar1.tar -rw-rw-r--. 1 ian ian 881 2009-09-24 15:39 ../lpitar2.tar

В листинге 31 используется еще одна важная функция tar . Мы указали абсолютный путь для нашей директории и видим, что в первой строке вывода tar сообщает о том, что из имен файлов удаляется вводный символ косой черты (/). Это позволяет восстанавливать файлы в любые другие местоположения для их проверки и играет особо важную роль при восстановлении системных файлов. Если же вам все-таки необходимо сохранить абсолютные пути, используйте для этого опцию -p . Избегайте совместного использования абсолютных и относительных путей при создании архива, поскольку при восстановлении из архива все пути станут относительными.

Команда tar может добавлять файлы к существующему архиву; для этого используется опция -r или --append . В результате в архив могут быть добавлены несколько копий одного и того же файла. В этом случае при извлечении из архива будет восстановлен тот файл, который был добавлен последним . Чтобы восстановить определенную копию файла, используйте опцию --occurrence . Если архив хранится не на ленте, а в обычной файловой системе, то можно использовать опцию -u или --update для его обновления. В этом случае операция обновления похожа на операцию добавления файлов за исключением того, что временные метки файлов в архиве сравниваются с временными метками добавляемых файлов, и добавляются только те файлы, которые были изменены с момента создания архива. Как уже упоминалось, это не работает при использовании архивов на ленте.

Команда tar может сравнивать архивы с текущей файловой системой и извлекать файлы из архивов. Для сравнения используется опция -d , --compare или --diff . В результате сравнения будут показаны все файлы с отличающимся содержимым, а также все файлы с отличающимися временными метками. По умолчанию выводятся только различающиеся файлы (если они есть). Для подробного вывода используйте рассмотренную ранее опцию -v . Опция -C или --directory указывает команде tar выполнять операцию, начиная с указанной директории, а не с текущей.

В листинге 32 приведено несколько примеров. С помощью команды touch мы изменили временную метку файла f1, а затем выполнили сравнение, прежде чем извлечь файл f1 из одного из наших архивов. Чтобы продемонстрировать возможности tar , мы использовали различные опции.

Листинг 32. Сравнение и восстановление с помощью tar
$ touch f1 $ tar --diff --file ../lpitar1.tar . ./f1: Mod time differs $ tar -df ../lpitar2.tar -C / home/ian/lpi103-2/f1: Mod time differs $ tar -xvf ../lpitar1.tar ./f1 # See below ./f1 $ tar --compare -f ../lpitar2.tar --directory /

Имена извлекаемых из архива файлов или директорий должны соответствовать их именам в архиве. В нашем примере попытка восстановить файл f1 вместо./f1 окончится неудачей. Вы можете использовать подстановку имен, однако будьте внимательны, иначе в результате может быть извлечено не совсем то, что вам было нужно. Если вы хотите посмотреть, что хранится в архиве, используйте опцию --list или -t для получения списка его содержимого. В листинге 33 приведен пример использования групповых символов, в результате чего из архива извлекается не только файл./f1.

Листинг 33. Просмотр содержимого архива с помощью tar
$ tar -tf ../lpitar1.tar "*f1*" ./f1a ./f1

Вы можете выбирать файлы, которые необходимо поместить в архив, с помощью команды find , а затем передавать по конвейеру результаты поиска на вход команде tar. Мы рассмотрим этот способ при изучении команды cpio , но он также работает и с командой tar .

Как и в случае с другими командами, которые встречаются в наших учебных руководствах, мы не можем рассмотреть все опции команды tar . Для получения дополнительной информации обращайтесь к man- или info-страницам.

Команда cpio

Команда cpio работает в трех режимах: copy-out для создания архива, copy-in для извлечения из архива и copy-pass для копирования набора файлов из одного местоположения в другое. Для режима copy-out используется опция -o или --create , для режима copy-in – опция -i или --extract и, наконец, для режима copy-pass – опция -p или --pass-through . Список входных файлов команда получает со стандартного устройства ввода stdin. Вывод направляется либо на стандартное устройство вывода stdout, либо на устройство или в файл, указанный с помощью опции -f или --file .

В листинге 34 показано, как сгенерировать список файлов с помощью команды find и передать их команде cpio . Обратите внимание на использование опции -print0 команды find для генерации имен файлов в виде строк с завершающим нулем, а также на соответствующую опцию --null команды cpio , позволяющую считывать данные в этом формате. Использование этих опций позволяет обрабатывать имена файлов, содержащих символы пробела или новой строки. Опция -depth указывает команде find вывести записи директории перед именем директории. В нашем примере мы создаем два архива нашей директории lpi103-2: один архив с относительными путями, второй – с абсолютными. Мы не используем различные возможности команды find для ограничения списка файлов (например, поиск только тех файлов, которые были изменены на этой неделе).

Листинг 34. Создание резервной копии директории с помощью cpio
$ find . -depth -print0 | cpio --null -o > ../lpicpio.1 3 blocks $ find ~/lpi103-2/ -depth -print0 | cpio --null -o > ../lpicpio.2 4 blocks

Если вы хотите, чтобы на экране отображались имена архивируемых файлов, то используйте опцию -v команды cpio .

Команда cpio в режиме copy-in (опция -i или --extract) может выводить содержимое архива или извлекать выбранные файлы. При выводе содержимого архива некоторые старые версии cpio убирают начальный символ / из каждого имени (если оно содержит его) и выводят соответствующее сообщение. Чтобы избавиться от этих посторонних сообщений при просмотре содержимого архива, вы можете указать опцию --absolute-filenames . Эта опция незаметно игнорируется во многих текущих реализациях. В листинге 35 показан выборочный вывод содержимого наших двух предыдущих архивов.

Листинг 35. Просмотр и извлечение выбранных файлов с помощью cpio
$ cpio -i --list "*backup*" < ../lpicpio.1 backup backup/text1.bkp.1 backup/text1.bkp.2 3 blocks $ cpio -i --list absolute-filenames "*text1*" < ../lpicpio.2 /home/ian/lpi103-2/text10 /home/ian/lpi103-2/backup/text1.bkp.1 /home/ian/lpi103-2/backup/text1.bkp.2 /home/ian/lpi103-2/text1 4 blocks

В листинге 36 показано, как извлечь все файлы, содержащие в имени "text1", вместе с их путями во временную директорию. Некоторые из этих файлов расположены в поддиректориях. В отличие от tar , вам необходимо явно указать опцию -d или --make-directories в том случае, если дерево директорий не существует. Кроме того, команда cpio не замещает существующие файлы с более поздней датой, если не указана опция -u или --unconditional .

Листинг 36. Извлечение выбранных фалов с помощью cpio
$ mkdir temp $ cd temp $ cpio -idv "*f1*" "*.bkp.1" < ../../lpicpio.1 f1a f1 backup/text1.bkp.1 3 blocks $ cpio -idv "*.bkp.1" < ../../lpicpio.1 cpio: backup/text1.bkp.1 not created: newer or same age version exists backup/text1.bkp.1 3 blocks $ cpio -id --no-absolute-filenames "*text1*" < ../../lpicpio.2 cpio: Removing leading `/" from member names 4 blocks ./home/ian/lpi103-2/backup/text1.bkp.1 ./home/ian/lpi103-2/backup/text1.bkp.2 ./home/ian/lpi103-2/text1 ./backup/text1.bkp.1 $ cd .. $ rm -rf temp # You may remove these after you have finished

Для получения дополнительной информации о различных опциях обратитесь к man-странице.

Команда dd

В простейшем случае команда dd копирует исходный файл в новый файл. Так как вы уже знакомы с командой cp , вы можете поинтересоваться, для чего нужна еще одна команда, копирующая файлы? Дело в том, что команда dd может выполнять ряд действий, которые не может выполнять обычная команда cp . В частности, она может выполнять преобразования над файлами, такие как перевод из нижнего регистра в верхний или перевод из кодировки ASCII в кодировку EBCDIC. Также она может работать с блоками файлов, что может оказаться полезным при переносе файла на ленточное устройство. Эта команда может пропускать или использовать только выбранные блоки файла. И, наконец, она может читать и записывать на raw-устройства, такие как /dev/sda, что позволяет создавать или восстанавливать файл, являющийся образом целого раздела. Как правило, для записи на устройства необходимо обладать привилегиями пользователя root.

Мы начнем с простого примера, в котором выполняется перевод текстового файла в верхний регистр с помощью опции conv , как показано в листинге 37. С помощью опции if мы указываем, что входные данные должны браться из файла, а не со стандартного устройства ввода. Существует аналогичная опция of , которая переопределяет стандартное устройство вывода, используемое по умолчанию. Для демонстрации возможностей программы мы указываем различные размеры входных и выходных блоков с помощью опций ibs и obs . В случае работы с большими файлами может оказаться удобным использовать блоки большего размера для ускорения операций по передаче данных с диска на диск. В остальных случаях размеры блоков в основном используются для работы с магнитными лентами. Обратите внимание на три строки статуса в конце листинга, которые показывают, сколько целых и частичных блоков было прочитано и записано, а также итоговый размер переданных данных.

Листинг 37. Перевод текста в верхний регистр с помощью dd
$ cat text6 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple $ dd if=text6 conv=ucase ibs=20 obs=30 1 APPLE 2 PEAR 3 BANANA 9 PLUM 3 BANANA 10 APPLE 1 APPLE 2 PEAR 3 BANANA 9 PLUM 3 BANANA 10 APPLE 4+1 records in 3+1 records out 98 bytes (98 B) copied, 0.00210768 s, 46.5 kB/s

Любой из файлов может являться raw-устройством. Обычно так происходит в случае с магнитной лентой, однако в файл или на ленту может быть помещена резервная копия всего дискового раздела, например /dev/hda1 или /dev/sda2. В идеальном случае файловая система устройства должна быть демонтирована или, по крайней мере, смонтирована в режиме только для чтения – это позволит гарантировать, что данные не изменятся за время создания их архивной копии. В примере листинга 38 входной файл является raw-устройством dev/sda2, а результирующий файл – обычным файлом backup-1, расположенным в домашней директории пользователя root. Чтобы создать дамп файла на ленте или другом сменном носителе, необходимо использовать опции наподобие of=/dev/fd0 или of=/dev/st0 .

Листинг 38. Создание резервной копии раздела с помощью dd
# dd if=/dev/sda2 of=backup-1 1558305+0 records in 1558305+0 records out 797852160 bytes (798 MB) copied, 24.471 s, 32.6 MB/s

Заметьте, что было скопировано 797,852,160 байтов данных, и результирующий файл действительно имеет такой размер, хотя дисковое пространство этого раздела используется всего на 3%. Если вы не используете аппаратное сжатие при копировании на ленту, возможно вам потребуется сжать данные. В листинге 39 показано, как сделать это; команды ls и df позволяют оценить размеры файлов и процент использования файловой системы на устройстве/dev/sda2.

Листинг 39. Создание резервной копии с использованием сжатия с помощью dd
# dd if=/dev/sda2 |gzip >backup-2 1558305+0 records in 1558305+0 records out 797852160 bytes (798 MB) copied, 23.4617 s, 34.0 MB/s # ls -l backup- -rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1 -rw-r--r--. 1 root root 995223 2009-09-25 17:14 backup-2 # df -h /dev/sda2 Filesystem Size Used Avail Use% Mounted on /dev/sda2 755M 18M 700M 3% /grubfile

Сжатие с помощью gzip уменьшает размер файла примерно на 20%. Тем не менее, неиспользуемые блоки могут содержать произвольные данные, поэтому даже сжатый архив может иметь больший размер, чем общий размер данных в разделе.

Если вы разделите общее количество скопированных байтов на количество обработанных записей, то вы увидите, что dd записывает данные в виде блоков по 512 байтов. Если копирование осуществляется на raw-устройство, такое как лента, то скорость копирования может существенно снизиться. Как упоминалось ранее, для изменения размера выходного блока можно использовать опцию obs , а для изменения размера входного блока – опцию ibs . С помощью опции bs можно задать общий размер как для входного, так и для входного блока. Если вы используете ленточный накопитель, то не забудьте использовать при чтении с ленты те же размеры блоков, что и для записи на ленту.

Если для хранения архивов необходимо использовать несколько ленточных кассет или других сменных носителей, то может потребоваться разбить архив на несколько более мелких частей с помощью такой утилиты как split . Если вам необходимо пропустить такие блоки, как метки диска или ленты, то вы можете сделать это с помощью dd . Примеры вы можете найти на man-страницах.

Команда dd не ориентирована на работу с файловой системой, поэтому если вы хотите узнать, какие данные содержатся в разделе, необходимо восстановить его дамп. В листинге 40 показано, как восстановить раздел из дампа, созданного в листинге 39, в раздел /dev/sdc7, который был специально создан для нашего примера на сменном USB-накопителе.

Листинг 40. Восстановление раздела с помощью dd
# gunzip backup-2 -c | dd of=/dev/sdc7 1558305+0 records in 1558305+0 records out 797852160 bytes (798 MB) copied, 30.624 s, 26.1 MB/s

Вам может быть интересно узнать, что некоторые программы для записи компакт- и DVD-дисков скрыто используют команду dd для непосредственной записи данных на устройство. Если ваша программа записывает все выполняемые действия в журнал, то теперь, когда вы немного знаете о dd , вам будет полезно просмотреть его. Если вы записываете ISO-образ на компакт- или DVD-диск, то один из способов убедиться, что в процессе записи не возникло никаких ошибок – это прочитать данные с диска при помощи dd и передать результаты на вход команде cmp . В листинге 41 показан общий подход, в котором вместо ISO-образа используется наш файл архива, созданный ранее. Обратите внимание на то, что мы подсчитываем количество блоков, которые должны быть прочитаны, на основании размера образа.

Листинг 41. Сравнение образа с файловой системой
# ls -l backup-1 -rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1 # echo $((797852160 / 512)) # calculate number of 512 byte blocks 1558305 # dd if=/dev/sdc7 bs=512 count=1558305 | cmp - backup-1 1558305+0 records in 1558305+0 records out 797852160 bytes (798 MB) copied, 26.7942 s, 29.8 MB/s