Полезные статьи с просторов Интернета или из уст наших пользователей :)
Часто приходится работать удаленно с серверами по ssh, но всегда не хватало магических Alt+F1 .... Alt+Fn. Открыл для себя SCREEN :)
SCREEN - полноэкранный и достаточно мощный консольный оконный менеджер с поддержкой скроллинга и поиска в окне и функцией копирования-вставки между ними. Наиболее интересная функция данного менеджера заключается в том что Вы можете в любой момент отсоединиться от своего screen`a и закрыть сеанс работы в шеле. После этого Вы можете присоединившись к screen`у вновь продолжить свою работу с того места где Вы остановились.
В данной статье я хочу в вкратце рассказать о основных приемах работы с данной утилитой. За более подробной информацией обращайтесь к манам. ;)
И так разберем по подробнее как же работать с данным чудом. Для начала заглянем в конфигурационный файл .screenrc, который находиться в Вашем домашнем каталоге. Если его там нет, можно скопировать файл общесистемный файл screenrc, который находиться в каталоге /etc.
Что же полезного можно включить в конфигурационном файле? Все опции можно изменить во время работы. Для этого нажмите Ctrl+a : и введите название параметра и его значение.
Разберем некоторые директивы:
vbell off - управляет визуальным звонком. Если данный параметр будет включен (on) то звонок будет отображаться как вспышка на экране.
activity 'activity in window %n' - сообщение которое будет выводиться при включенном режиме мониторинга за окном. Полезно если Вы ждете какого либо действия в окне.
bell_msg 'bell in window %n' - сообщение, которое выведется на Ваш экран в случае получения screen`ом звукового сигнала в каком либо окне.
nethack on - изменяет стиль текста выводимых сообщений на стиль знаменитой игрушки NetHack. Почувствуйте себя в подземельях... ;)
autodetach on - если по какой то причине соединение с управляющим процессом будет потеряно, то после востановления работа в screen может быть возобновлена. В обратном случае (off) - screen будет уничтожен со всеми дочерними окнами и процессами.
startup_message off - выключает сообщение об авторских правах при первом запуске screen`а.
defscrollback 10000 - количество строк по умолчанию для буфера прокрутки.
caption always - показывает заголовки окна в строке статуса.
caption string "%{rk} %c %{dd} %{+b M}%n %{-b dd}%-w%{+b B.}%n* %t%{-}%+w%<" - форматирование строки статуса. Данный набор символов приведет к тому что в строке статуса будет отображаться время и цветом выделяться активное окно.
После запуска screen создаст одно окно с Вашим шелом. В последствии вы сможете создать дополнительные окна. Все нажатия клавиш передаются текущей программе в окне. Ограничение накладывается только на управляющую последовательность самого менеджера. Данная последовательность Ctrl+a. Для того что бы передать приложению данную последовательность Вам нужно нажать
Ctrl+a и сразу a. В остальном - абсолютно никаких ограничений. Единственно, что тип терминала должен быть VT100 совместим для правильной передачи нажатий при удаленной работе.
Тип терминала передаваемый приложению в окне screen - так и называться screen. Если Ваше приложение не поддерживает данный тип - его всегда можно изменить путем изменения переменной TERM.
КРАТКАЯ СВОДКА КОМБИНАЦИЙ КЛАВИШ ПРИ РАБОТЕ
Для создания нового окна - Ctrl+a c (create).
Для переключения между окнами - Ctrl+a a - между последним активным.
Ctrl+a <НОМЕР> - выбор окна по номеру.
Ctrl+a (p|n) - циклическое перемещение между окнами. p - prev, n - next.
Ctrl+a " - список окон для переключения.
Управление окнами - Ctrl+a A - изменить заголовок окна. Аналогично
вводу команды title при нажатии Ctrl+a :.
Ctrl+a C - очистить окно.
Ctrl+a F - подогнать размер окна под текущий размер терминала.
Ctrl+a H - протоколирование окна в файл screenlog.<НОМЕР ОКНА>
Ctrl+a K - уничтожить окно.
Ctrl+a M - режим слежения за активностью в окне. Если в момент этого вы
находитесь в другом окне - в подсказке будет выведено:activity in window <НОМЕР ОКНА>
Ctrl+a r - переключение режима переноса по словам. (wrap)
Ctrl+a S - очень интересный режим работы. Сплит. То-есть текущее окно
разделяется на две части и в обоих можно открыть по новому окну.
Переключение между окнами Ctrl+a; TAB, выход из режима сплит - Ctrl+a Q.
Общие команды -
Ctrl+a ? - помощь
Ctrl+a Esc - режим скроллинга. Он же режим копирования. Для копирования
подведите курсор к нужному месту и нажмите пробел.
Ctrl+a ] - Вставка выделенной области.
Ctrl+a x - Запереть менеджер. При вкомпиленной поддержке PAM - для разблокировки
нужно ввести пароль пользователя от которого запущен менеджер.
В обратном случае пароль для разблокировки будет запрошен при
блокировании.
НАИБОЛЕЕ ЧАСТО ПРИМЕНЯЕМЫЕ ОПЦИИ КОМАНДНОЙ СТРОКИ.
-rd - подключиться к screen. Сделать deatach для остальных сессий. -list/-ls - список запущенных менеджеров. -dm - запуск screen в режиме deatach. Полезно для init скриптов или скриптов вообще. -wipe - удалить сведения о запущенных менеджерах. Полезно в случае потери менеджера, но сохранения информации о нем. -x - присоединиться к screen. Присоединение осуществляется даже в случае существующих соединений. Полезно при работе с одним screen из разных окружений. Например один screen и на X и на консоль.
Взято с opennet.ru
Ниже представлен перевод (источник) замечательной статьи SSH Tricks, оригинал которой расположен по адресу: http://polishlinux.org/apps/ssh-tricks.
Содержание:
SSH (secure shell) – это программа, позволяющая получить защищённый доступ к удалённым файловым системам [в Wikipedia дано более точное определение, прим.пер.]. Не все знают, что SSH обладает рядом дополнительных мощных возможностей, таких как вход без запроса пароля, автоматическое выполнение комманд в удалённой системе и даже монтирование удалённых папок. В этой статье мы рассмотрим эти, а также некотороые другие возможности SSH.
SSH работает по принципу клиент-сервер. Это значит, что на сервере, к которому мы хотим подключиться, должен быть запущен демон SSH. В современных дистрибутивах Linux сервер SSH, как правило, установлен по умолчанию. Сервер запускается командой типа /etc/init.d/ssh start. По умолчанию он ожидает соединений на порту 22, так что если вы используете фаервол, убедитесь, что этот порт открыт. После установки и запуска SSH сервера мы можем удалённо подключиться к нему. Чтобы войти пользователем user1 на сервер remote_server (который указывается через доменное имя или IP адрес) нужно воспользоваться следующей простой командой:
ssh user1@remote_server
После ввода пароля для доступа к удалённой машине, появится изменённое приглашение для ввода команд, которое выглядит следующим образом:
user1@remote_server:~$
Это означает что мы успешно произвели вход и сейчас работаем в окружении удалённого сервера. Теперь каждая команда будет выполняться на удалённом сервере, с привелегиями того пользователя, под которым мы вошли (в данном случае user1).
SCP является составной частью пакета OpenSSH. Эта команда позволяет копировать файлы или папки с удалённого сервера (или на него), используя для этого протокол SSH. Благодаря использованию SSH, SCP является отличной заменой для небезопасного протокола FTP, которой широко используется в Интернете. Не все знают, что в FTP пароли передаются по сети в виде открытого текста, а это значит, что злоумышленники могут с лёгкостью перехватить их. Так что SCP это намного более надёжная альтернатива. Простейший пример использования SCP выглядит так:
scp file.txt user1@remote_server:~/
При этом локальный файл file.txt будет скопирован на удалённый сервер и помещён в домашний каталог пользователя user1. Вместо ~/ можно использовать другой путь, например /tmp, /home/public или любую другую папку, в которой пользователь user1 имеет права на запись.
Чтобы скопировать файл с удалённого сервера на локальный компьютер, используется другой синтаксис SCP:
scp user1@remote_server:~/file.txt .
При этом файл file.txt, расположенный в домашнем каталоге пользователя user1 в удалённой системе, будет скопирован в локальную папку (в которой мы сейчас находимся).
Стоит обратить внимание на следующие параметры SCP:
-r – рекурсивное копирование папок (включая подкаталоги)
-P port – использовать нестандартный порт (по умолчанию 22) – этот параметр следует использовать если сервер ожидает соединения на нестандартном порту. Этот параметр может быть полезен при соединении из сети, защищённой фаерволом. Запуск SSH сервера на порту 443 (используемом для защищённых HTTP соединений) это лучший способ обойти ограничения, установленные сетевым администратором.
Если вам не нравится работать с консолью, то вы можете использовать графический (или псевдографический) клиент SCP. Midnight Commander – одна из программ, обладающая функциями SCP клиента (Меню → Правая панель/Левая панель → Shell-соединение). Nautilus и Konqueror также поддерживают SCP. Для подключения к удалённой системе в адресной строке надо ввести ssh://user1@remote_server:~/. При этом файлы могут копироваться как если бы они были расположены локально. В среде MS Windows есть отличное приложение WinSCP. Его интерфейс очень похож на Total Commander. Кстати, существует плагин для Total Commander, позволяющий выполнять SCP подключения.
Необходимость ввода пароля при каждом SSH соединении может сильно раздражать. С другой стороны, незащищённое удалённое соединение это огромный риск с точки зрения безопасности. Решением этой проблемы является авторизация с помощью пары из открытого (public) и секретного (private) ключей.
Пара ключей обычно генерируется с помощью команды ssh-keygen. Ниже показан результат выполнения такой команды. Возможно использование ключей RSA или DSA.
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/user1/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user1/.ssh/id_rsa. Your public key has been saved in /home/user1/.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Когда программа просит указать пароль для ключа, нужно просто нажать ENTER. При этом будет создан ключ без пароля. Имейте в виду, что это представляет угрозу безопасности, так как это понижает безопасность удалённой системы до уровня безопасности вашей локальной системы [злоумышленник, получивший доступ к секретному ключу, хранящемуся в вашей локальной системе, может воспользоваться им для доступа к удалённой системе - прим. пер.]. Поэтому делайте это на свой страх и риск. Когда ssh-keygen закончит свою работу, вы увидите, что были сгенерированы два ключа. Секретный ключ находится в /home/user1/.ssh/id_rsa. Его нельзя делать общедоступным ни при каких обстоятельствах. Второй ключ (открытый) находится в /home/user1/.ssh/id_rsa.pub, к нему можно предоставить публичный доступ.
Теперь, если мы хотим получить доступ к удалённой системе с нашего локального компьютера без запроса пароля (используя только эти два ключа), мы должны добавить информацию о нашем открытом ключе в файл authorized_keys, расположенный в папке ~/.ssh в удалённой системе. Для этого можно воспользоваться следующими командами:
$ scp /home/user1/.ssh/id_rsa.pub \ user1@remote_server:~/ $ ssh user1@remote_server $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
Обратите внимание, что третья команда выполняется на удалённом сервере. После этой процедуры все действия, выполняемые на удалённом сервере через SSH не будут требовать ввода пароля. Это позволит существенно упростить нашу работу с удалённым сервером.
Обратите внимание, что если вам нужен безпарольный доступ с удалённого сервера на локальный, аналогичная процедура должна быть проведена с удалённого сервера. Авторизация с использованием ключей это односторонний процесс. Секретный ключ может авторизовать публичный, но не наоборот.
Теперь, когда мы можем войти в удалённую системы без пароля, почему бы не выполнить несколько удалённых команд? В некоторых случаях это может быть полезно, например, когда нам нужно выполнять некоторую команду ежедневно. Раньше мы не могли автоматизировать этот процесс, так как требовался ручной ввод пароля (или указание его в виде простого текста, что является небезопасным).
Один из интересных способов применения безпарольного входа это «удалённое оповещение». Допустим, что на удалённом сервере работает очень важный процесс, например веб-сервер Apache. Мы хотим получить уведомление, когда система начинает испытывать нехватку ресурсов (жёсткий диск переполнен или нагрузка на систему слишком высока). В этом случае мы можем отправить уведомление по электронной почте. Но помимо этого, мы можем выполнить удалённую команду, которая воспроизведёт звуковой сигнал в нашей локальной системе. Для этого можно воспользоваться, например, такой командой:
ssh user1@local_server "play \ /usr/share/sounds/gaim/arrive.wav"
Эта команда, выполненная скриптом на удалённом сервере, произведёт безпарольный вход пользователем user1 на local_server (на котором мы обычно работаем) и воспроизведёт файл с помощью команды play (которая обычна доступна в Linux).
Одной из наимение известных функций SSH является перенаправление протокола X. Это позволяет запускать практически любое X приложение удалённо! Для этого всего лишь нужно добавить параметр -X при соединении с удалённым сервером:
ssh -X user1@remote_server
После этого изображения всех запущенных X приложений будут перенаправлены на ваш локальный X сервер. В файле /etc/ssh/ssh_config можно включить постоянное использование перенаправления X11 (указав ForwardX11 yes). Разумеется, чтобы этот параметр сработал, удалённый SSH сервер должен также поддерживать перенаправление X11. Настроить это можно отредактровав файл /etc/ssh/sshd_config. Однако в большинстве дистрибутивов Linux необходимые настройки уже выполнены по умолчанию.
Следующий пример показывает запуск одиночной команды с X перенаправлением:
ssh -X user1@remote_server "psi"
При этом на удалённом сервере будет запущена программа PSI, а её изображение будет направлено на локальный экран.
Разумеется, скорость приложений, выполняемых удалённо, будет зависеть в первую очередь от скорости сетевого соединения. В локальной сети они будут работать практически без задержек (даже такие вещи как Totem, воспроизводящий фильм DivX). В случае интернет соединения, DSL линии будет достаточно, чтобы приложения типа Skype или Thunderbird работали без особых проблем.
Работать с файлами, расположенными на удалённом сервере, через SSH может быть неудобно, особенно если приходится часто копировать различные файлы в обоих направлениях. Использование протокола fish:// в Midnight Commander или Konqueror является частичным решением, но fish работает медленне SSH и часто тормозит при копировании файлов. Идеальным решением было бы смонтировать удалённый ресурс, и работать с ним через SSH. И такая возможность есть, благодаря sshfs и проекту fuse.
Fuse это модуль ядра (недавно он был принят в официальную ветку 2.6), позволяющий непривилегированным пользователям монтировать различные файловые системы. SSHFS это программа, созданная самим автором fuse, которая позволяет монтировать удалённые папки или файловые системы, используя SSH. Суть проста - удалённая папка монтируются в папку локальной файловой системы. После этого все операции над этой папкой производятся как если бы это была обычная локальная папка, с той только разницей, что файлы перемещаются через SSH в фоновом режиме.
Установить fuse и sshfs в Ubuntu [и Debian - прим. пер.] очень просто:
# apt-get install sshfs
После этого остаётся только добавить пользователя, которому мы хотим предоставить право на монтирование файловых систем через SSH, в группу fuse (используя команду usermod -G -a fuse user1 [или adduser user1 fuse, что проще - прим. пер.] или вручную отредактировав файл /etc/group). Также необходимо, чтобы был загружен модуль fuse:
# modprobe fuse
После этого, мы можем смонтировать удалённую папку с помощью sshfs:
mkdir ~/remote_folder sshfs user1@remote_server:/tmp ~/remote_folder
Указанная выше команда смонтирует папку /tmp, расположенную на удалённом сервере, в папку ~/remote_folder на локальной машине. Копирование любых файлов в эту папку будет производится по сети с использанием SCP. Редактирование, создание и удаление файлов будет производится таким же образом.
По окончании работы с удалённой системой мы можем отмонтировать её:
fusermount -u ~/remote_folder
Если мы постоянно работаем с этой папкой, то можно добавить её в таблицу /etc/fstab. При этом она будет автоматически монтироваться при загрузки системы, либо можно будет монтировать её вручную (при использовании параметра noauto) без необходимости каждый раз указывать адрес удалённой папки. Пример записи в /etc/fstab:
sshfs#user1@remote_server:/tmp \ /home/user1/remote_folder/ fuse defaults,auto 0 0
Если мы планируем использовать fuse и sshfs регулярно, то нужно добавить fuse в файл /etc/modules. Иначе придётся каждый раз загружать модуль fuse вручную.
Как видите, SSH это мощный инструмент для удалённого доступа. Если вам приходится часто работать с удалёнными UNIX системами, то вам стоит освоить его функции и использовать их на практике. Умение работать с SSH помогает сделать ежедневную работу более эффективной и приятной.
Автор данной статьи попросил меня сделать следующую пометку:
This text is a translation of article SSH Tricks by Borys Musielak published on GNU/Linux vortal PolishLinux.org.
Итак, вы решили установить Gentoo и не знаете с чего начать, при этом чтение мануалов вас отпугивает своим количеством и сложностью. В данном мануале я постараюсь кратко описать весь процесс установки системы, и постараюсь написать простым языком.
Начнем с того, как распространяется дистрибутив и из каких частей он состоит. Если заглянуть на официальные зеркала Gentoo, то вы может увидеть кучу различных каталогов для разных архитектур (что подчеркивает гибкость и кроссплатформенность), различные профили для сборки, набор distfiles и т.д. Как же выбрать что подходит вам? Начнем с выбора профиля, ведь версия дистрибутива обозначается версией профиля (например Gentoo 2007.0). В чем же различия между профилями? Дело в том, что конечный профиль для сборки представляет собой набор пакетов. В конечном счёте, весь набор пакетов от default-linux, x86, 2007.0 представляет собой минимальный набор пакетов необходимых для работы профиля, который используется в ссылке /etc/make.profile. Такой способ управления позволяет гибко настраивать работу различных программ на различных платформах, ведь есть не только x86, есть ещё sparc, amd и т.п. И для sparc существуют собственные аналоги gcc, ведь на бинарном уровне компилятор gcc для x86 не совместим со sparc. Конечно же стоит выбирать самый свежий профиль, т.к. в нем присутствует самый свежий набор требований. Хотя если у вас есть и более старый дистрибутив с набором distfiles, то вы легко можете синхронизироваться с официальным зеркалом и обновить систему после ее установки.
Следующее что нам предстоит выбрать это Stage. Stage это обычный архив, который содержит изначальную структуру каталогов Linux, а также некоторые файлы. Дело в том, что Gentoo отличается сильной оптимизацией работы под конкретный компьютер, поэтому, есть возможность установить «все с нуля». Всего существует три Stage. Например Stage1 представляет собой самый базовый вариант, содержащий минимальный набор команд, такие как chroot и т.п. Если почитать мануалы а официальном сайте Gentoo, то там советуют производить установку из Stage 3, т.к. установка системы из stage1 и stage2, на машину конечного пользователя, больше не поддерживается. Если вам интересно мое мнение, то я всегда использую Stage 1, и весь следующий мануал буду писать именно по сборке из этого stage.
Так же stage бывает для разных профилей и разных архитектур. Stage собирается для некоторого числа определенных архитектур процессоров. Архитектура процессора - это общее название идей, набор инструкций и регистров, поддерживаемых процессором. Имя архива содержит название типа архитектуры процессора, для которой он собран. Чтобы правильно выбрать Stage, вы должны знать тип архитектуры вашего процессора. Данную информацию можно получить, например, с сайта производителя процессора или в общедоступных энциклопедиях.
Следующий пакет который нужно иметь перед началом установки это Portage. В Gentoo существует специальная система Portage, которая отвечает за установку, обновление, отслеживание зависимостей, обслуживание и удаление пакетов. Система довольно часто обновляется, ведь она содержит скрипты для установки определенных версия программ. Portage представляет собой архив содержащий в себе базу с информацией о доступных, на текущий момент пакетах. Скачиваемсамый свежий Portage. Версия данного архива определяется датой выпуска. На официальных зеркалах архив находится в каталоге snapshots. Для управлением пакетов используется универсальный скрипт - emerge. Это команда с помощью которой выполняются все операции связанные с управлением, а так же обновлением пакетов. Например для установки Apache нужно всего лишь ввести emerge apache и систеа сама скачает и установит последнюю (по данным из локального Portage) версию apache.
Установка Gentoo производится из под уже существующей системы Gentoo - livecd соответствующий профилю той системы которую мы будем собирать. На загрузочном диске уже установлен компилятор и библиотеки, а так же базовые команды которые нам могут понадобиться для сборки нашей будущей системы. Конечно же выбирать livecd стоит с таким же профилем и такой же архитектурой что и Stage.
Итак, для начала установки нам понадобиться. Загрузочный livecd, архив Stage 1, архив Portage. Записываем это все на один диск и можно приступить к установке.
Как только закончится загрузка livecd мы попадаем в консоль. Первым делом что мы сделаем, это разобьем жесткий диск на разделы.
На данном этапе я останавливаться не буду, т.к. в интернете и на форуме полно тем по данному вопросу.
# cfdisk /dev/sda
Предположим что ваша таблица разделов выглядит так:
Файловая система Тип Точка монтирования
/dev/sda1 swap -
/dev/sda5 reiserfs /
/dev/sda6 reiserfs /var
/dev/sda7 Ext2 /boot
/dev/sda8 reiserfs /usr/portage
Форматируем разделы:
SWAP - mkswap /dev/sda1
Ext2 - mke2fs /dev/sda1
Ext3 - mke2fs -j /dev/sda1
ReiserFS - mkreiserfs /dev/sda1
JFX - mkfs.jfs /dev/sda1
XFS - mkfs.xfs /dev/sda1
Как видно из моей таблицы разделов на жестком диске, мой выбор пал на ReiserFS, так как он достаточно быстро работает с большим количеством маленьких файлов.
После успешного форматирования, монтируем корневой каталог и создаем на корневом разделе парочку каталогов, для монтирования других разделов.
# mount /dev/sda5 /mnt/gentoo
# cd /mnt/gentoo
# mkdir boot
# mkdir var
# mount /dev/sda6 /mnt/gentoo/var
Распаковываем Stage.
# ls /mnt/cdrom/stages/*
stage1-x86-2007.0.tar.bz2
# tar xvjpf /mnt/cdrom/stages/stage1-x86-2007.0.tar.bz2 /mnt/gentoo
Теперь у нас есть дерево нашей будущей системы. Монтируем к получившимся каталогам остальные файловые системы:
# mkdir /mnt/gentoo/usr/portage
# mount /dev/sda7 /mnt/gentoo/boot
# mount /dev/sda8 /mnt/gentoo/usr/portage
# mount /dev/sda6 /mnt/gentoo/var
# swapon /dev/sda1
# mount t proc none /mnt/gentoo/proc
Распаковываем снимок дерева Portage.
# ls /mnt/cdrom/snapshots/*
portage-20080108.tar.bz2
# tar xvjf /mnt/cdrom/snapshots/portage-20080108.tar.bz2 C /mnt/gentoo/usr
Пришло время указать параметры сборки. Так как Gentoo отличается от других дистрибутивов оптимизацией, существует конфигурационный файл где и выставляются все эти настройки. Все параметры по умолчанию находятся в /etc/make.globals, но добавлять изменения нужно в /etc/make.conf. Так же здесь указываются так называемые USE флаги, предназначенные для обозначения глобальных зависимостей для сборки пакетов. Например при сборке какого-нибудь пакета в зависимости попадает KDE, хотя нам его устанавливать не нужно. Мы просто добавляем в USE параметр -kde и все зависимости связанные с KDE будут автоматически отброшены.
# nano w /mnt/gentoo/etc/make.conf
Если вдруг кому-то интересен мой вариант make.conf
читать дальше »
CFLAGS="-O3 -march=pentium4 -fomit-frame-pointer -pipe"
CXXFLAGS="${CFLAGS}"
CHOST="i686-pc-linux-gnu"
ACCEPT_KEYWORDS="~x86"
#GENTOO_MIRRORS="http://mirror.ealtai.ru/Linux/gentoo"
#SYNC="rsync://mirror.ealtai.ru/gentoo-portage"
MAKEOPTS="-j3"
AUTOCLEAN="yes"
FEATURES="sandbox ccache"
ALSA_CARDS="intel8x0"
VIDEO_CARDS="nvidia"
LINGUAS="ru"
USE="X java acl 3dfx a52 eds truetype gstreamer xv imlib mad ogg vorbis sdl chardet encode png gif bzip2 ftp cdr dvdr gtk gtk2 gnome opengl dbus hal nls nptl nptlonly ncurses ntl alsa slang userlocales unicode symlink cups mp3 jpeg samba beryl glitz ffmpeg dvdread spell qt3 javascript quicktime mikmod \
-kde -ipv6 -oss -berkdb -arts"
Почитать о том какие настройки нужно указывать в make.conf можно тут:
http://gentoo-wiki.com/Safe_Cflags.
http://gentoo-wiki.com/FAQ_USE_Flags
Итак, система готова к сборке, теперь мы можем переключиться под нашу будущую систему и начать сборку.
# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
Приступим к сборке Stage 1.
# cd /usr/portage
# scripts/bootstrap.sh
Этот процесс может занять пару часиков. После успешной сборки Stage приступим к сборке системных пакетов. P.S. Зависимости пакетов которые будут установлены можно посмотреть в виде списка, добавив в команду префикс --pretend. Например emerge --pretend system. Таким образом вы можете точно проследить какие пакеты будут установлены и отрегулировать USE флаги в /etc/make.conf.
# emerge system
Процесс сборки можно прервать, и запустить снова. Установленные пакеты уже будут внесены в базу, и будут реально установлены. Нужно всего лишь ввести emerge system еще раз.
Распаковываем исходные коды ядра:
# emerge gentoo-sources
Собираем ядро:
# cd /usr/src/linux
# make menuconfig
# make && make modules_install
Копируем образ ядра в загрузочный раздел.
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage
# cp /usr/src/linux/System.map /boot
После сборки ядра установим некоторые утилиты, на случай если они каким-то образом не попали в system. P.S. Так как в своем варианте я использую ReiserFS я устанавливаю утилиты для данной файловой системы.
# emerge udev
# emerge reiserfsprogs
Теперь отредактируем таблицу монтирования fstab.
# nano w /etc/fstab
таблица выглядит так:
/dev/sda7 /boot ext2 noauto,noatime 1 1
/dev/sda5 / reiserfs noatime 0 0
/dev/sda1 none swap sw 0 0
/dev/sda8 /usr/portage reiserfs noatime 0 0
/dev/sda6 /var reiserfs noatime 0 0
tmpfs /tmp tmpfs defaults 0 0
Устанавливаем журнал и планировщик заданий.
# emerge syslog-ng
# rc-update add syslog-ng default
# emerge vixie-cron
# rc-update add vixie-cron default
P.S. Для того чтобы добавить init скрипт в уровни загрузки, используется утилита rc-update, использование которой мы видим выше.
Устанавливаем загрузчик:
# emerge lilo
# nano w /etc/lilo.conf
Мой вариант конфига загрузчика выглядит так:
boot=/dev/sda
prompt
timeout=150
image=/boot/bzImage
root=/dev/sda5
label=Gentoo
read-only
Для того чтобы произвести запись в MBR:
# lilo
Создадим нового пользователя.
# useradd -m -G users,wheel,audio -s /bin/bash john
Ну и самое главное, это не забыть установить пароль для root ! P.S. Заодно можно установить пароль и юзеру.
# passwd
Ну вот минимальный набор программ для работы в системе был установлен. Теперь под систему можно загрузиться. Если система при загрузке выдает какие-либо ошибки или отказывается загружаться, то скорее всего вы что-то сделали неверно.
Выходим из системы:
# exit
Ребутимся из под livecd:
Код:
# reboot
Ссылки по теме:
http://gentoo.org/
http://forums.gentoo.org/
http://gentoo-wiki.com/USE_Flags_explained
http://packages.gentoo.org/
http://gentoo-portage.com/
http://gentoo-wiki.com/HOWTO_Use_Por...y#Color_Output
Удачи.
Обновление уже установленной системы.
Так как база скриптов portage обновляется непрерывно, есть возможность иметь постоянно свежий набор пакетов. Для того чтобы синхронизировать дерево Portage с официальным деревм введем команду:
Код:
# emerge --sync
После успешной синхронизации, нужно собрать новые пакеты и удалить старые. Для этого пересоберем пакеты входящие в system и world.
Код:
# emerge system
# emerge world
# emerge --update --newuse --deep world
Следующая команда контролирует целостность пакетов и соответствующие к ним библиотеки:
# revdep-rebuild
Следующая команда чистит систему от мусора. Например вы удалили какой-то пакет, а после него остались зависимости. Выполнив данную команду вы автоматически удалите все "ненужные" пакеты. P.S. Используйте предельно аккуратно.
# emerge --depclean
P.S. В данной статье не стремились охватить весь процесс установки, это очень краткий и сжатый вариант. Если что-то не понятно или что-то указано некорректно пишите, исправим.
У каждого иногда встает вопрос какую же файловую систему выбрать и для чего? У меня тоже был выбор конфигурации, и после прогона тестов стало интересно, чем же отличается одна файловая система от другой? В чем различие? Каковы их плюсы и минусы? В чем преимущество одной файловой системы перед другой?
К сожалению, информации по этой теме крайне мало, тем более на русском языке. Поэтому я решила рассмотреть этот вопрос и собрать все воедино.
Рассматриваются только файловые системы семейства linux. Так что, кого это также заинтересовало, прошу под кат.
Прежде всего, разные тесты показывают разные результаты(так как разные тесты и проводятся по-разному), поэтому нельзя быть полностью обьективной, ссылаясь на цифры. Это необходимо учесть.
Были иcпользованы bonnie++ и postmark. Я не буду приводить результаты, так как мне делать этого не следует (это не паблик тесты, я не думаю, что имею право их выкладывать, прошу меня извинить). Поэтому ограничусь небольшими выводами.
Лидирует по производительности ext2, несильно отстает jfs, затем идет reiserfs, ext3, и с небольшим отрывом xfs.
Если сравнивать наиболее распространенные файловые системы между собой, то выходит следующее:
потеря производительности для xfs по мере добавления промежуточных уровней device mapper'a менее существенна, чем для ext3.
ext3 — обычная, вылизанная до блеска, файловая система, сравнительно простая во внутренней организации, за счет чего не особо эффективная. Поддерживается всем, чем угодно, совместима с ext2. Обычно ставится по умолчанию именно по этим причинам. К тому же, невелик риск потерять что-либо.
xfs — более сложная, более эффективная в работе с большими по размеру файлами, хорошо работает с большими по объему каталогами на чтение и поиск в них. Эффективно реализована поддержка ACL. Невысокая нагрузка на процессор.
Особенности при работе LVM2 — размер файловой системы ext3 можно как увеличивать, так и уменьшать, но лишь при отмонтированной файловой системе, в отличии от xfs, которую можно лишь увеличивать, но на смонтированной файловой системе, то есть, не прерывая работу с ней.
для xfs также есть возможность принудительно сбросить буферы на диск без отмонтирования и прерывания работы с ней. Для ext3 snapshot через LVM будет аналогичен состоянию файловой системы при отключении питания. Но разработчики обещали поправить это дело в новых версиях ядра.
При работе с xfs жизненно необходим ups, и не рекомендуется держать на ней корневую файловую систему, так как xfs считает, что содержимое находившихся открытыми на запись файлов при некорректном прерывании работы системы не определено, и она заполняет эти файлы нулями. (смертельно для базы данных)
ext2 — та же ext3, только без поддержки журналирования, за счет чего работает быстрее.
jfs дает хороший прирост в скорости работы. Плюс этой файловой системы в том, что возможно восстановить данные с поврежденного тома, или же стертые данные, в отличии от ext3, но при этом, jfs не сохраняет данные о стертых каталогах а файлах, что затруднит поиск. Нет ограничений на количество файлов. Одинаково производительна как на файлах малого обьема, так и на файлах большого обьема. fsck работает очень быстро. Минимальная нагрузка на процессор, оптимизирована для работы в многопроцессорной среде. Раздел можно лишь увеличить. Идеально подходит для хранения корневой файловой системы.
reiserfs — не доработанная до конца, и нынче не развиваемая, файловая система, т.к. ее разработчик находится в тюрьме. reiserfs достаточно быстрая файловая система, но при условии, что файлы будут иметь небольшой размер. Недостатки — высокая нагрузка на процессор, нередки случаи безвозвратной потери информации при крахе файловой системы. Можно использовать для какого-нибудь кэша.
На этом, в общем-то, все. Приятного всем дня
PS: Ссылку на оригинал статьи не приведу, нашел давно и сохранил у себя на жестяке.
Хотите узнать как восстановление данные с поврежденного NTFS раздела с помощью свободных средств в GNU/Linux?
Источник - Восстановление данных R.LAB
Несмотря на упорное сопротивление некоторых производителей "очень маленького программного обеспечения" :) вкупе с анонимусами с linux.org.ru :) , Linux не спеша, но уверенно занимает места на десктопах пользователей. Как только не отговаривали среднестатистического юзера от знакомства с желтопятым Туксом: и что, мол, Линукс - это ОС для "красноглазых программистов" (и таки правда - Линукс замечательная свободная платформа для разработчика ПО с уймой этих самых средств разработки), что Линукс - это сугубо серверная ОС (и таки да - Линукс отлично зарекомендовал себя и на тяжелых веб-серверах и на примитивных роутерах) и т. д., и т. п. И помимо этого, благодаря усилиям тысяч энтузиастов при поддержке хардверных и софтверных гигантов (один IBM чего стоит), пингвин уверенно взгромоздился на десктоп и в качестве офисного рабочего места, и в качестве игровой машины, и в качестве мультимедийного центра "из коробки". Эта тенденция не может не радовать. Но что может дать Линукс, к примеру, в столь специфической сфере, как восстановление данных с неисправных HDD? Автор, исходя из специфики своей трудовой деятельности :) , решил задаться этим вопросом.
Решив не размениваться на мелочи, автор сразу поставил достаточно сложную и нетривиальную для Линукса задачу: снятие данных исключительно свободными средствами Линукс с сильно забэдовавшегося винчестера Samsung объемом 200 ГБ, на котором, к тому же, было установлено юзер-френдли поделие Microsoft Windows XP. Требование заказчика - скопировать "всего 2 папки с диска D". Текущие симптомы со слов заказчика: Windows не грузится, винчестер долго "чухается"... и ничего не происходит - черный экран. При попытке подключить его к другой исправной машине, установленный на ней Windows грузится минут 20, нещадно шкарябая полудохлым винчестром в попытке что-то там найти и автоматически смонтировать. В результате загрузка таки происходит, в Проводнике виден только один раздел неизвестного размера, который "умный" Виндовз тут же предлагает "дружественно" форматнуть; в PartitionMagic после тугого зависона виден 1 раздел, покрашенный желтым цветом :) "с какой-то там ошибкой" и непотребным размером в 400 гигабайт.
Сейчас последует стандартный отказ от каких-либо гарантий. Автор не отвечает за то, что с правами суперпользователя вы легко можете стереть и свои и чужие данные без какой-либо возможности восстановления. Автор снимает с себя ответственность за то, что вы, не имея опыта, неверно оценили состояние своего или чужого накопителя и добили ему полуживые головы, устроили запилы на поверхностях дисков, дожгли глюкавую плату контроллера винчестера. Автор не несет ответственности за то, что по этим причинам его собратья по восстановлению данных выставили вам круглые счета за работу :) . Как всякий нормальный человек вы конечно же подумали, взвесили все риски и лишь потом приступили к чтению и применению описанного ниже алгоритма. Удачи!
Ну а теперь за работу, товарищи!
В распоряжении автора IBM-PC совместимый компьютер на процессоре AMD Sempron 2800+, установленном в материнскую плату Gigabyte GA-K8NE на логике nForce4-4x. На компьютере установлен совершенно недружественный к пользователю :) , вручную локализованный, Slackware-10.2 (ядро 2.4.32) в полной инсталляции. Из дополнительных программ установлены: ddrescue, dd_rescue, testdisk и, на всякий случай, пакет ntfsprogs и ntfs-3g. Для начала договоримся, что ни в какие иксы мы грузиться не будем и попробуем обойтись даже без mc :) (это по желанию).
Небольшое примечание. У кого нет установленного на HDD Линукса, либо нет желания его устанавливать, может воспользоваться Slackware-based (sic!) LiveCD RIPLinux-2.9 (ядро 2.6.21). В нем уже предустановлены основные нужные нам программы, как то: ddrescue, dd_rescue, testdisk. Единственный минус - не собрана поддержка koi8-r, поэтому кириллический раздел монтировать придется -o nls=utf8 и копировать данные придется уже из-под иксового файл-менеджера, т. к. поддержки utf8 в консоли нет, что, впрочем, не проблема, хоть и идеологически неправильно :) .
Применим профессиональный подход к проблеме. А профессиональный подход подразумевает, что перво-наперво необходимо скопировать проблемный винчестер на исправный и дальнейшие работы вести уже с исправным, дабы глюки и подвисания инвалида не мешали нам. Достанем с полки (приобретем в магазине, одолжим у друзей) накопитель, равный по объему, либо больший, чем проблемный. У нас под рукой случайно :) оказался 500-гигабайтный WD с SATA интерфейсом. Подготовим его к работе. Несмотря на то, что диск-приёмник вроде бы чист, перед началом процесса копирования хорошим тоном считается всё ж гарантированно его очистить с помощью того же dd. Для максимально быстрого стирания выставляем blocksize не менее 16 секторов накопителя, т. е 16*512B=8KB. Можно и больше.
root@rozik3:~# dd if=/dev/zero of=/dev/sda bs=8K
Процесс стирания 500-гигабайтного винта займет около 2-х часов. Пока что можно выйти покурить сигарет, поиграть с компьютером в шахматы, сходить на linux.org.ru пофлеймить :) .
Периодически вводя от рута на втором терминале killall -SIGUSR1 dd наблюдаем на первом ход стирания.
8034929+0 записей считано 8034929+0 записей написано скопировано 65822138368 байт (66 GB), 832,959 секунд, 79,0 MB/s 52809917+0 записей считано 52809917+0 записей написано скопировано 432618840064 байт (433 GB), 6286,23 секунд, 68,8 MB/s #К концу диска, как и полагается, линейная скорость записи несколько уменьшается dd: запись `/dev/sda": No space left on device 61048324+0 записей считано 61048323+0 записей написано скопировано 500107862016 байт (500 GB), 7750,36 секунд, 64,5 MB/s
Вот и чудненько. Выключаем компьютер, дабы только теперь подключить инвалида. Включились. БИОС тут же ругнулся на SMART проблемного Samsung"а: что, мол, немедленно сбэкапьтесь, после чего выкиньте его в окошко :) . Сейчас, сейчас. Именно сбэкапиться и хотим :) . Раз даже глупая материнка ругается на СМАРТ, то посмотрим и мы его :) для оценки ситуации.
root@rozik3:~# smartctl -i -A /dev/hdc smartctl version 5.36 [i486-slackware-linux-gnu] Copyright (C) 2002-6 Bruce Allen Home page is http://smartmontools.sourceforge.net/ === START OF INFORMATION SECTION === Device Model: SAMSUNG SP2014N Serial Number: S088J1NL203227 Firmware Version: VC100-33 User Capacity: 200.049.647.616 bytes Device is: In smartctl database [for details use: -P show] ATA Version is: 7 ATA Standard is: ATA/ATAPI-7 T13 1532D revision 4a Local Time is: Tue Sep 18 00:12:19 2007 EEST SMART support is: Available - device has SMART capability. SMART support is: Enabled === START OF READ SMART DATA SECTION === SMART Attributes Data Structure revision number: 16 Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x000f 253 099 051 Pre-fail Always - 0 3 Spin_Up_Time 0x0007 038 033 025 Pre-fail Always - 12800 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 272 5 Reallocated_Sector_Ct 0x0033 001 001 010 Pre-fail Always FAILING_NOW 32267 7 Seek_Error_Rate 0x000f 253 253 051 Pre-fail Always - 0 8 Seek_Time_Performance 0x0025 253 253 015 Pre-fail Offline - 0 9 Power_On_Half_Minutes 0x0032 097 097 000 Old_age Always - 17476h+42m 10 Spin_Retry_Count 0x0033 253 253 051 Pre-fail Always - 0 11 Calibration_Retry_Count 0x0012 253 002 000 Old_age Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 13 190 Unknown_Attribute 0x0022 166 127 000 Old_age Always - 24 194 Temperature_Celsius 0x0022 166 127 000 Old_age Always - 24 195 Hardware_ECC_Recovered 0x001a 100 100 000 Old_age Always - 1228 196 Reallocated_Event_Count 0x0032 001 001 000 Old_age Always - 32267 197 Current_Pending_Sector 0x0012 253 001 000 Old_age Always - 4294935023 198 Offline_Uncorrectable 0x0030 253 001 000 Old_age Offline - 4294935631 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 200 Multi_Zone_Error_Rate 0x000a 253 253 000 Old_age Always - 0 201 Soft_Read_Error_Rate 0x000a 253 089 000 Old_age Always - 0
Имеем скачущие параметры с ID 1, 197, 198, 201, говорящие о нестабильном чтении и имеющихся дефектах и рухнувший параметр с ID 5, явно говорящий нам, что винчестер щедро просыпал бэдами и полностью забил ремапами G-List.
С помощью fdisk сориентируемся в пространстве, чтоб случайно не потереть что-нибудь не то :) .
root@rozik3:~# fdisk -l #Это наш чистый накопитель-приемник. На нем ничего нет. Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sda doesn"t contain a valid partition table #Это наш инвалид. #Вместо внятной логической структуры - какое-то месиво - источник желтого цвета#в PartitionMagic и 400 ГБ размера. Disk /dev/hdc: 200.0 GB, 200049647616 bytes 255 heads, 63 sectors/track, 24321 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes This doesn"t look like a partition table Probably you selected the wrong device. Device Boot Start End Blocks Id System /dev/hdc1 ? 13578 119522 850995205 72 Unknown Partition 1 does not end on cylinder boundary. /dev/hdc2 ? 45382 79243 271987362 74 Unknown Partition 2 does not end on cylinder boundary. /dev/hdc3 ? 10499 10499 0 65 Novell Netware 386 Partition 3 does not end on cylinder boundary. /dev/hdc4 167628 167631 25817+ 0 Empty Partition 4 does not end on cylinder boundary. Partition table entries are not in disk order #Это, собственно, наш системный винчестер Disk /dev/hda: 120.0 GB, 120059362816 bytes Disk /dev/hda: 120.0 GB, 120059362816 bytes 255 heads, 63 sectors/track, 14596 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 1 65 522081 82 Linux swap /dev/hda2 66 1340 10241437+ 83 Linux /dev/hda3 * 1341 14468 105450660 7 HPFS/NTFS /dev/hda4 14469 14596 1028160 c W95 FAT32 (LBA)
Исходя из выданных fdisk"ом имён файлов устройств будем продолжать дальнейшую работу.
Чем же копировать? Вот вопрос. Линукс-гуру настойчиво предлагают не изобретать велосипед и использовать всё тот же dd
root@rozik3:~# dd if=/dev/hdc of=/dev/sda bs=8K conv=noerror,sync
где bs=8K опять же для пущей скорости, noerror не дает вылетать на ошибках, sync дописывает проблемные блоки нулями, чтоб не возникло смещений на приемнике.
На сайте testdisk"а рекомендуют использовать ddrescue в два прохода:
root@rozik3:~# ddrescue -n /dev/hdc /dev/sda samsung200.log
где n - не разбивать на исходном диске проблемные блоки для вычитки, в лог же ведется запись сессии для исключения успешно скопированных секторов из второго прохода:
root@rozik3:~# ddrescue -r 1 /dev/hdc /dev/sda samsung200.log
где -r 1 - однократная попытка чтения дефектного сектора при вычитывании с использованием сохраненного лога.
Хорошие программы, правильные методы. Только, как выяснилось впоследствии, на инвалидном Samsung"е приблизительно на 11-ом ГБ имеет место значительная дефектная зона, где при прямом копировании и вычитке головы начинают терять сервометки с логично вытекающим отсюда стуком. И если оставить винчестер копироваться на ночь, то на утро есть все шансы получить только первые 11 ГБ копии и монотонно стучащий трупик с дохлыми головами. Это нас совершенно не устраивает. Поэтому мы обратимся к не так сильно разрекламированной dd_rescue. Фичности у нее поменее будет, чем у ddrescue - она не умеет обрабатывать лог сессии и каждый запуск будет начинать, как буд-то ничего не происходило. Но реверсное копирование с лихвой перекрывает её недостаточную интеллектуальность и автоматичность. Итак, решено! В данном случае наш выбор - dd_rescue.
Как водится, перед самым стартом на Луну :) покурим хелп на предмет управления звездолетом :) .
root@rozik3:~# dd_rescue -h dd_rescue Version 1.14, garloff[at]suse[dot]de, GNU GPL ($Id: dd_rescue.c,v 1.59 2007/08/26 13:42:44 garloff Exp $) dd_rescue copies data from one file (or block device) to another. USAGE: dd_rescue [options] infile outfile Options: -s ipos start position in input file (default=0), #начальный сектор на исходном файле-устройстве (по ум.=0) -S opos start position in output file (def=ipos), #начальный сектор на результирующем файле-устройстве (по ум.=как на исходном) -b softbs block size for copy operation (def=65536), #размер блока при нормальном копировании (по ум.=64 КБ) -B hardbs fallback block size in case of errs (def=512), #размер блока при копировании на дефектах (по ум.=512 Б) -e maxerr exit after maxerr errors (def=0=infinite), #завершить работу при определенном количестве ошибок (по ум.=0=не завершать) -m maxxfer maximum amount of data to be transfered (def=0=inf), #максимальный скопированный объем данных, по достижении которого завершить работу #(по ум.=0=не завершать) -y syncfrq frequency of fsync calls on outfile (def=512*softbs), #частота вызова fsync для синхронизации результирующего файла с исходным #(маленькое значение замедляет работу) (по ум.=каждые 32 МБ) -l logfile name of a file to log errors and summary to (def=""), #файл, в который захватывается вывод программы в терминал (полезно для анализа) #(по ум.=не создается) -o bbfile name of a file to log bad blocks numbers (def=""), #файл, в который пишутся номера дефектных секторов (полезно для анализа) #(по ум.=не создается) -r reverse direction copy (def=forward), #реверсное копирование (!!!) (по ум.=выключено, копируем вперед) -t truncate output file (def=no), #очищать результирующий файл (как это делает dd) (по ум.=не очищать) -d/D use O_DIRECT for input/output (def=no), -w abort on Write errors (def=no), #завершать работу при ошибках записи (по ум.=не завершать) -a spArse file writing (def=no), -A Always write blocks, zeroed if err (def=no), #записывать на приемник нули вместо ошибок (полезно, если не очистили приемник; #несколько замедляет копирование на дефектах) (по ум.=не записывать) -i interactive: ask before overwriting data (def=no), #интерактивный режим: спрашивать при перезаписи данных (по ум.=отключен) -f force: skip some sanity checks (def=no), -p preserve: preserve ownership / perms (def=no), -q quiet operation, #копировать молча -v verbose operation, #копировать с максимумом подробностей -V display version and exit, #показать версию программы и выйти -h display this help and exit. #показать эту справку и выйти Note: Sizes may be given in units b(=512), k(=1024), M(=1024^2) or G(1024^3) bytes This program is useful to rescue data in case of I/O errors, because it does not necessarily abort or truncate the output.
Осмыслив написанное, взлетаем :) .
root@rozik3:~# dd_rescue -v -y 1G -l samsung200.log -o samsung200.bb /dev/hdc /dev/sda # -v - пусть пишет, что делает; -y 1G - синхронизация раз в гигабайт, иначе тормозит прилично;# -l, -o - пусть ведет логи... для истории :) dd_rescue: (info): about to transfer 0.0 kBytes from /dev/hdc to /dev/sda dd_rescue: (info): blocksizes: soft 65536, hard 512 dd_rescue: (info): starting positions: in 0.0k, out 0.0k dd_rescue: (info): Logfile: samsung200.log, Maxerr: 0 dd_rescue: (info): Reverse: no , Trunc: no , interactive: no dd_rescue: (info): abort on Write errs: no , spArse write: never dd_rescue: (info): ipos: 2283520.0k, opos: 2283520.0k, xferd: 2283520.0k errs: 0, errxfer: 0.0k, succxfer: 2283520.0k +curr.rate: 54010kB/s, avg.rate: 50720kB/s, avg.load: 16.9% ------skip------- dd_rescue: (info): ipos: 10801400.5k, opos: 10801400.5k, xferd: 10801400.5k * errs: 449, errxfer: 224.5k, succxfer: 10801176.0k +curr.rate: 0kB/s, avg.rate: 10586kB/s, avg.load: 3.6% dd_rescue: (warning): /dev/hdc (10801400.5k): Input/output error! dd_rescue: (info): ipos: 10801401.0k, opos: 10801401.0k, xferd: 10801401.0k * errs: 450, errxfer: 225.0k, succxfer: 10801176.0k +curr.rate: 0kB/s, avg.rate: 10544kB/s, avg.load: 3.6% dd_rescue: (warning): /dev/hdc (10801401.0k): Input/output error! dd_rescue: (info): ipos: 10801401.5k, opos: 10801401.5k, xferd: 10801401.5k * errs: 451, errxfer: 225.5k, succxfer: 10801176.0k +curr.rate: 0kB/s, avg.rate: 10502kB/s, avg.load: 3.6% dd_rescue: (warning): /dev/hdc (10801401.5k): Input/output error! Bad block: 21602803 dd_rescue: (fatal): Caught signal 2 "Interrupt". Exiting! Summary for /dev/hdc -> /dev/sda: dd_rescue: (info): ipos: 10801402.0k, opos: 10801402.0k, xferd: 10801402.0k errs: 452, errxfer: 226.0k, succxfer: 10801176.0k +curr.rate: 0kB/s, avg.rate: 10461kB/s, avg.load: 3.6%
Вот оно! На 11 гигабайте винт бешено захрюкал и затикал значительно громче, чем на предыдущих дефектах. По Ctrl+C выходим. Теперь будем копировать задом наперед.
root@rozik3:~# dd_rescue -r -v -y 1G -l samsung200.log -o samsung200.bb /dev/hdc /dev/sda # -r - реверс; логи дописываются dd_rescue: (info): ipos set to the end: 195360984.0k dd_rescue: (info): about to transfer 0.0 kBytes from /dev/hdc to /dev/sda dd_rescue: (info): blocksizes: soft 65536, hard 512 dd_rescue: (info): starting positions: in 195360984.0k, out 195360984.0k dd_rescue: (info): Logfile: samsung200.log, Maxerr: 0 dd_rescue: (info): Reverse: yes, Trunc: no , interactive: no dd_rescue: (info): abort on Write errs: no , spArse write: never dd_rescue: (info): ipos: 195225816.0k, opos: 195225816.0k, xferd: 135168.0k - errs: 0, errxfer: 0.0k, succxfer: 135168.0k +curr.rate: 14083kB/s, avg.rate: 14083kB/s, avg.load: 4.3%
И идем спать :) . Начало мы уже получили. Теперь будет вычитываться с конца. Если даже и стукнет на проблемной зоне, то львиную долю копии мы получим. Копирование в реверс идет приблизительно втрое медленней прямого. Так и должно быть :) .
------------------------
Ситуация на утро: dd_rescue прочесал проблемную зону и с 11-ю тысячами ошибок успешно завершил работу:
dd_rescue: (info): ipos 7539736.0k promote to large bs again! dd_rescue: (info): ipos: 216.0k, opos: 216.0k, xferd: 195360768.0k - errs: 11016, errxfer: 5508.0k, succxfer: 195355260.0k +curr.rate: 18205kB/s, avg.rate: 6161kB/s, avg.load: 2.3% Summary for /dev/hdc -> /dev/sda: dd_rescue: (info): ipos: 0.0k, opos: 0.0k, xferd: 195360984.0k - errs: 11016, errxfer: 5508.0k, succxfer: 195355476.0k +curr.rate: 17705kB/s, avg.rate: 6161kB/s, avg.load: 2.3%
Ура! Выключаем компьютер, отсоединяем инвалида.
Кстати, вполне трезвой мыслью является сделать бэкап посекторной копии уже с живого накопителя. Если есть в запасе еще один винт, то очень нелишне будет это сделать тем же dd.
Включаемся опять. Еще раз запустим fdisk. Может быть в процессе переезда что-то изменилось к лучшему :) ?
root@rozik3:~# fdisk -l Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes This doesn"t look like a partition table Probably you selected the wrong device. Device Boot Start End Blocks Id System /dev/sda1 ? 13578 119522 850995205 72 Unknown Partition 1 does not end on cylinder boundary. /dev/sda2 ? 45382 79243 271987362 74 Unknown Partition 2 does not end on cylinder boundary. /dev/sda3 ? 10499 10499 0 65 Novell Netware 386 Partition 3 does not end on cylinder boundary. /dev/sda4 167628 167631 25817+ 0 Empty Partition 4 does not end on cylinder boundary. Partition table entries are not in disk order Disk /dev/hda: 120.0 GB, 120059362816 bytes 255 heads, 63 sectors/track, 14596 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 1 65 522081 82 Linux swap /dev/hda2 66 1340 10241437+ 83 Linux /dev/hda3 * 1341 14468 105450660 7 HPFS/NTFS /dev/hda4 14469 14596 1028160 c W95 FAT32 (LBA)
Всё по-старому. Несмотря на то, что в MBR ничего, похожего на правду не обнаруживается, на всякий случай бекапим её.
root@rozik3:~# dd if=/dev/sda of=samsung200.mbr.old count=1 1+0 записей считано 1+0 записей написано скопировано 512 байт (512 B), 0,000281 секунд, 1,8 MB/s
Запускаем testdisk. Хоть он и консольный, но обладает интуитивно понятным интерфейсом с кнопками и менюшками :) .
root@rozik3:~# testdisk TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Please wait...
После чего вылезает менюшка с выбором устройств:
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org TestDisk is free software, and comes with ABSOLUTELY NO WARRANTY. Select a media (use Arrow keys, then press Enter): Disk /dev/hda - 120 GB / 111 GiB Disk /dev/sda - 500 GB / 465 GiB [Proceed ] [ Quit ] Note: Disk capacity must be correctly detected for a successful recovery. If a disk listed above has incorrect size, check HD jumper settings, BIOS detection, and install the latest OS patches and disk drivers.
Выбираем стрелками на клавиатуре нужный девайс /dev/sda и жмем Proceed
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB Please select the partition table type, press Enter when done. [Intel ] Intel/PC partition [Mac ] Apple partition map [None ] Non partioned media [Sun ] Sun Solaris partition [XBox ] XBox partition [Return ] Return to disk selection Note: Do NOT select "None" for media with only a single partition. It"s very rare for a drive to be "Non-partitioned".
Несмотря на то, что у нас AMD :) , выбираем Intel
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 [ Analyse ] Analyse current partition structure and search for lost partitions [ Advanced ] Filesystem Utils [ Geometry ] Change disk geometry [ Options ] Modify options [ MBR Code ] Write TestDisk MBR code to first sector [ Delete ] Delete all data in the partition table [ Quit ] Return to disk selection Note: Correct disk geometry is required for a successful recovery. "Analyse" process may give some warnings if it thinks the logical geometry is mismatched.
Жмем Analyse
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Current partition structure: Partition Start End Size in sectors 1 * Sys=72 13577 238 11 119521 238 60 1701990410 Bad relative sector. 2 * Sys=74 45381 70 3 79242 34 29 543974724 Bad relative sector. 3 * NetWare 3.11+ 10498 56 41 10498 56 40 0 Bad relative sector. Only one partition must be bootable Space conflict between the following two partitions 1 * Sys=72 13577 238 11 119521 238 60 1701990410 2 * Sys=74 45381 70 3 79242 34 29 543974724 *=Primary bootable P=Primary L=Logical E=Extended D=Deleted [Proceed ] [ Save ] Try to locate partition
По результатам анализов наблюдаем то же безобразие, что и выдал нам fdisk. Жмем Proceed, дабы попытаться обнаружить живые разделы.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Partition Start End Size in sectors * HPFS - NTFS 0 1 1 5182 254 63 83264832 [WIN_XP] L HPFS - NTFS 5183 1 1 24320 254 63 307451907 [ARCHIVE] Structure: Ok. Use Up/Down Arrow keys to select partition. Use Left/Right Arrow keys to CHANGE partition characteristics: *=Primary bootable P=Primary L=Logical E=Extended D=Deleted Keys A: add partition, L: load backup, T: change type, P: list files, Enter: to continue NTFS, 42 GB / 39 GiB
Жмем Enter
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Partition Start End Size in sectors 1 * HPFS - NTFS 0 1 1 5182 254 63 83264832 [WIN_XP] 2 E extended LBA 5183 0 1 24320 254 63 307451970 5 L HPFS - NTFS 5183 1 1 24320 254 63 307451907 [ARCHIVE] [ Quit ] [Search! ] [ Write ] [Extd Part] Return to main menu
По оставшимся в живых бутсекторам testdisk обнаружил разделы. На этом можно было бы, нажав Write, и завершить, тем более, что со слов заказчика размеры найденных разделов совпадают с предполагаемыми размерами утерянных. Но в целях повышения эрудиции пройдем всю цепочку до конца. Выбираем всё ж таки Search!
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Partition Start End Size in sectors D HPFS - NTFS 0 1 1 2233 254 63 35889147 D HPFS - NTFS 0 1 1 5182 254 63 83264832 [WIN_XP] D HPFS - NTFS 0 1 32 5182 254 63 83264801 D HPFS - NTFS 2234 1 1 21371 254 63 307451907 [ARCHIVE] D HPFS - NTFS 5183 1 1 24320 254 63 307451907 [ARCHIVE] Structure: Ok. Use Up/Down Arrow keys to select partition. Use Left/Right Arrow keys to CHANGE partition characteristics: *=Primary bootable P=Primary L=Logical E=Extended D=Deleted Keys A: add partition, L: load backup, T: change type, P: list files, Enter: to continue NTFS, 42 GB / 39 GiB
Обнаружены записи о некоторых разделах, оставшихся, по-видимому, от предыдущей установки винды. Пораскинув мозгами, стрелками на клавиатуре выбираем интересующие нас разделы и в соответсвии с (выделенной мною) подсказкой внизу обозначаем их.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Partition Start End Size in sectors D HPFS - NTFS 0 1 1 2233 254 63 35889147 * HPFS - NTFS 0 1 1 5182 254 63 83264832 [WIN_XP] D HPFS - NTFS 0 1 32 5182 254 63 83264801 D HPFS - NTFS 2234 1 1 21371 254 63 307451907 [ARCHIVE] L HPFS - NTFS 5183 1 1 24320 254 63 307451907 [ARCHIVE] Structure: Ok. Use Up/Down Arrow keys to select partition. Use Left/Right Arrow keys to CHANGE partition characteristics: *=Primary bootable P=Primary L=Logical E=Extended D=Deleted Keys A: add partition, L: load backup, T: change type, P: list files, Enter: to continue NTFS, 157 GB / 146 GiB
Жмем Enter.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 Partition Start End Size in sectors 1 * HPFS - NTFS 0 1 1 5182 254 63 83264832 [WIN_XP] 2 E extended LBA 5183 0 1 24320 254 63 307451970 5 L HPFS - NTFS 5183 1 1 24320 254 63 307451907 [ARCHIVE] [ Quit ] [ Write ] [Extd Part] Write partition structure to disk
Testdisk вывел структуру PT, которую нам предстоит записать в MBR. Write!
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Write partition table, confirm ? (Y/N)
Нас в последний раз спрашивают, хорошо ли мы подумали? Да, то есть Y.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org You will have to reboot for the change to take effect. [Ok]
Чтобы всё заработало, надо будет перезагрузиться. Жмем OK. Выходим на уровень вверх.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org Disk /dev/sda - 500 GB / 465 GiB - CHS 60801 255 63 [ Analyse ] Analyse current partition structure and search for lost partitions [ Advanced ] Filesystem Utils [ Geometry ] Change disk geometry [ Options ] Modify options [ MBR Code ] Write TestDisk MBR code to first sector [ Delete ] Delete all data in the partition table [ Quit ] Return to disk selection Note: Correct disk geometry is required for a successful recovery. "Analyse" process may give some warnings if it thinks the logical geometry is mismatched.
Жмем Quit.
TestDisk 6.3, Data Recovery Utility, March 2006 Christophe GRENIER <grenier [at] cgsecurity [dot] org> http://www.cgsecurity.org TestDisk is free software, and comes with ABSOLUTELY NO WARRANTY. Select a media (use Arrow keys, then press Enter): Disk /dev/hda - 120 GB / 111 GiB Disk /dev/sda - 500 GB / 465 GiB [Proceed ] [ Quit ] Note: Disk capacity must be correctly detected for a successful recovery. If a disk listed above has incorrect size, check HD jumper settings, BIOS detection, and install the latest OS patches and disk drivers. Quit program
И еще раз Quit.
TestDisk exited normally. You have to reboot for the change to take effect. root@rozik3:~# reboot
Перезагружаемся... Еще раз ориентируемся на местности:
root@rozik3:~# fdisk -l Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 2234 17944573+ 7 HPFS/NTFS /dev/sda2 2235 21372 153725985 f W95 Ext"d (LBA) /dev/sda5 2235 21372 153725953+ 7 HPFS/NTFS Disk /dev/hda: 120.0 GB, 120059362816 bytes 255 heads, 63 sectors/track, 14596 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 1 65 522081 82 Linux swap /dev/hda2 66 1340 10241437+ 83 Linux /dev/hda3 * 1341 14468 105450660 7 HPFS/NTFS /dev/hda4 14469 14596 1028160 c W95 FAT32 (LBA)
Похоже на правду. Нам нужен /dev/sda5 - там лежат каталоги, нужные заказчику. Пробуем смонтировать /dev/sda5, не забывая, что раздел виндовый, и юзер обыкновенный не брезгует кириллицей в именах каталогов, поэтому:
root@rozik3:~# mount -o iocharset=koi8-r /dev/sda5 /mnt/hd
Mount не ругается. Наши шансы стремительно растут :)
root@rozik3:~# cd /mnt/hd root@rozik3:/mnt/hd# ls Book/ GAMES/ Install/ Office\ 2003/ RECYCLER/ WindowsXP/ Хранение\ документов/ Film/ ImageDrive/ Music/ Pictures/ System\ Volume\ Information/ ДОКУМЕНТАЦИЯ/ Yes! root@rozik3:/mnt/hd# cp -R ДОКУМЕНТАЦИЯ /root root@rozik3:/mnt/hd# cp -R Хранение\ документов /root
Собственно, всё :) .
Итоги или послесловие.
Можно было бы возрадоваться успеху свободного ПО в деле датарековери на неродном для Линукса поле боя, но на всякую цистерну мёда найдется своё ведро дёгтя :) . Мы недаром вели логи копирования. Впоследствии, при изучении логов мы увидели, что львиная доля дефектов на исследуемом накопителе пришлась на системный раздел, в том числе крепко досталось и MFT. Все попытки ради эксперимента смонтировать или фиксануть /dev/sda1 окончились неуспехом с соответствующими пожеланиями :) используемых в этом нелегком деле программ.
root@rozik3:~# mount -o iocharset=koi8-r /dev/sda1 /mnt/hd mount: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or other error In some cases useful info is found in syslog - try dmesg | tail or so root@rozik3:~# ntfs-3g /dev/sda1 /mnt/hd -o force Failed to load $MFT: Input/output error Failed to startup volume: Input/output error Failed to mount "/dev/sda1": Input/output error NTFS is inconsistent. Run chkdsk /f on Windows then reboot it TWICE! The usage of the /f parameter is very IMPORTANT! No modification was made to NTFS by this software. root@rozik3:~# ntfsfix /dev/sda1 Mounting volume... Failed to load $MFT : Input/output error Failed to startup volume : Input/output error FAILED Attempting to correct errors... Failed to load $MFT : Input/output error FAILED Failed to startup volume : Input/output error Volume is corrupt. You should run chkdsk.
Использование же обычного chkdsk уже в "самой дружественной ОС" восстановило валидность раздела и дало доступ к большинству файлов с остальными пользовательскими данными (системные файлы в таких ситуациях зачастую повреждаются, но и ценности они особой не представляют), даже без применения сторонней датарековери проприетарщины.
Не следует забывать, что в нашей ситуации копировщики работают через системные драйверы того же IDE-контроллера хоста с включенным на всю катушку UDMA, что в данной ситуации зачастую ведет к неправильной интерпретации зависаний или таймаутов дефектного накопителя как однозначных ошибок. Что и подтверждается сравнительным копированием платным копировщиком, написанным для DOS, работающим непосредственно через порты IDE-контроллера хоста и использующим свои алгоритмы управления скоростью копирования (в том числе и в UDMA режимах) и вычитыванием. Платный копировщик дал вчетверо меньше ошибок. Кроме того, автор ничего не знает о средствах первичной диагностики винчестеров под Линукс, способных выводить карту диска или хотя бы график чтения, аналогичных тем же MHDD, Victoria и Vivard для DOS. Поэтому в описанном случае пришлось опираться сугубо на значения SMART-атрибутов и собственный опыт и вносить корректировки в процесс снятия данных уже по ходу работы, что в отдельных случаях может быть довольно рискованным.
Тем не менее, в завершение, хочется с удовлетворением отметить, что, в отличие от "дружественной ОС" под котрую и за деньги мало чего надёшь путного, для Линукса существуют мощные, явно написанные со знанием дела, открытые и свободные приложения, способные бороться с весьма тяжелыми физповреждениями накопителей, а также софт с быстрыми и грамотно разработанными алгоритмами поиска утерянных первичных логических стуктур накопителей, вовсе не являющихся нативными для Линукс.
Автор не ставил перед собой задачи показать, что под Линуксом можно "рубать капусту" :) (хотя мы предметно увидели, что и это возможно :) ) , а хотел поделиться с сообществом себе подобных :) некоторыми наработками в правильном профессиональном подходе к восстановлению данных и показать, что в Линуксе RIP значит вовсе не Rest In Peace, а Recovery Is Possible :) !
Виталий Розизнаный AKA Rozik специально для rlab.ru
Оригинал: How to edit and understand /etc/fstab на http://www.tuxfiles.org/
Автор: Nana Langstedt
Свободный перевод: Алексей Дмитриев
Дата перевода: 11 декабря 2007
Один из конфигурационных файлов в Линукс-системах носит имя fstab. Он содержит информацию обо всех разделах жесткого диска и других носителях информации в компьютере. Этот файл находится в каталоге /etc, вот почему полный путь к нему выглядит как /etc/fstab.
В /etc/fstab прописано, куда и как разделы винчестера и другие носители должны быть примонтированы. Если вы не имеете доступа к Windows разделу, не можете примонтировать CD, не в состоянии записать, как рядовой пользователь, файл на дискету, или испытываете трудности с CD-RW, то, скорее всего, у вас неверно сконфигурирован /etc/fstab. Редактируя этот файл, обычно решают все проблемы с монтированием.
Файл /etc/fstab это обычный текстовый файл, поэтому его можно редактировать в любом текстовом редакторе. Единственное требование - наличие прав суперпользователя. Так что, прежде чем приступать, войдите в систему как root или используйте команду su, чтобы получить права root. Как выглядит файл /etc/fstab
В каждой конкретной системе файл /etc/fstab выглядит не так, как в другой, ведь разделы, устройства, и их свойства, различаются в разных системах. Но скелет структуры файла всегда одинаков. Вот пример содержимого файла /etc/fstab:
/dev/hda2 / ext2 defaults 1 1 /dev/hdb1 /home ext2 defaults 1 2 /dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0 /dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0 proc /proc proc defaults 0 0 /dev/hda1 swap swap pri=42 0 0
Что же означает вся эта тарабарщина? Как легко заметить, каждая строка содержит информацию об одном разделе или устройстве. Первый столбец содержит имя устройства, второй - точку его монтирования, третий - тип файловой системы, четвертый - опции монтирования, пятый (число) - опции дампа, шестой (число) опции проверки файловой системы. Давайте подробно рассмотрим всю эту информацию.
Первый и второй столбцы просты и понятны. Они содержат ровно то же самое, что вы пишете в командной строке, когда даете команду mount, то есть имя устройства (раздела) и точку его монтирования. Точка монтирования, указанная в /etc/fstab, является точкой монтирования по умолчанию. Эта та директория, куда будет примонтировано устройство, если вы не указали другой, когда давали команду mount.
Большинство дистрибутивов Линукса создают специальные директории для точек монтирования. Большинство дистрибутивов создают их в каталоге /mnt, некоторые (в том числе и SuSE), в каталоге /media. Как вы возможно догадались, глядя на распечатку fstab, я привела в качестве примера именно точки монтирования SuSE.
Что все это означает практически? Если я дам команду:
$ mount /dev/fd0/
...то моя дискета будет смонтирована в /media/floppy, потому что эта точка монтирования указана в /etc/fstab и поэтому используется по умолчанию. Вот если строчки /dev/fd0 в моем файле /etc/fstab не окажется, то команда mount будет сильно обескуражена, так как не будет знать, куда следует монтировать дискету.
Точки монтирования по умолчанию легко изменить, если они вас почему-либо не устраивают. Для этого нужно заменить директории в файле /etc/fstab на любые другие, реально существующие директории. Если подходящих не существует, то просто создайте их.
Некоторые разделы и устройства монтируются автоматически, в процессе загрузки системы. Взгляните на приведенный выше пример. Видите две строчки:
/dev/hda2 / ext2 defaults 1 1 /dev/hdb1 /home ext2 defaults 1 2
Они означают, что /dev/hda2 будет примонтирован в директорию /, а /dev/hdb1 - в директорию /home. Это произойдет автоматически, когда система загружается. Если этого не произойдет, то система не сможет работать, так как все программы находятся именно в директории /, и, если она не смонтирована, то и доступа к программам нет! Откуда система узнает, куда вы хотите примонтировать /dev/hda2, а куда /dev/hdb1? Посмотрев файл /etc/fstab, конечно.
Третий столбец файла /etc/fstab указывает тип файловой системы раздела или устройства. Поддерживается множество различных файловых систем, но мы рассмотрим только наиболее употребительные.
ext2 и ext3 С большой вероятностью ваши Линукс-разделы отформатированы в Ext3. Раньше стандартом была система Ext2, но в наши дни почти все дистрибутивы используют по умолчанию Ext3 или ReiserFS. Ext3 более современная система, чем Ext2 и отличается от нее своей журналируемостью. Это, в практическом плане, означает, что, если вы обесточите ваш компьютер, вместо того, чтобы выключить его по всем правилам, то вы не потеряете информацию, и не будете долго ждать при следующем включении, пока ваш компьютер проверяет файловую систему.
reiserfs Вполне возможно, что ваши Линукс-разделы отформатированы в ReiserFS. Подобно Ext3, ReiserFS тоже журналируемая файловая система, но она является гораздо более "продвинутой". Многие дистрибутивы Линукс (включая SuSE) используют ReiserFS по умолчанию.
swap Своп значит подкачка. Файловая система типа "swap" используется в разделах подкачки.
vfat и ntfs Windows разделы используют либо Vfat, либо NTFS. В 9х сериях (95, 98, МЕ) применялась Vfat, более известная как FAT32, в сериях NT (NT, 2000, XP) используется NTFS. В 2000 и XP можно применять и Vfat тоже. Если вы хотите иметь возможность писать в свои Windows-разделы из Линукса, советую отформатировать их в Vfat, потому что в Линуксе запись в NTFS-разделы до сих пор может причинить головную боль.
auto Нет-нет, это не тип файловой системы :-) Опция "auto" просто означает, что тип файловой системы определяется автоматически. Если снова взглянете на пример файла /etc/fstab, приведенный выше, то увидите, что и floppy и CD-ROM - оба - имеют вместо типа файловой системы опцию "auto". Почему? - Дело в том, что в этих устройствах могут применяться различные типы файловых систем. Одна дискета может быть отформатирована для Windows, другая - для Линукс (Ext2). Довольно разумно позволить системе самой определить тип файловой системы на носителях вроде дискет и оптических дисков.
В четвертом столбце перечислены все опции, с которыми устройство или раздел будут смонтированы. По совместительству, это еще и самый сложный для заполнения столбец, но, зная некоторые самые употребительные опции, вы избежите большинства недоразумений. Я рассмотрю только наиболее широко распространенные опции, а по поводу остальных - смотрите ман-страницу mount.
auto и noauto Если задана опция auto, то устройство будет смонтировано автоматически во время запуска компьютера (или по команде mount -a ). Эта опция включена по умолчанию. Если вам не нужно, чтобы устройство монтировалось автоматически, вы должны прописать опцию noauto в /etc/fstab. С опцией noauto, устройство или раздел могут быть смонтированы только явно.
exec и noexec Если хотите запускать двоичные программы, которые находятся в данном разделе, то применяйте опцию exec, а если не хотите - то noexec. Последнее может быть полезно, если на разделе содержатся программы, которые не могут работать в вашей системе, например Windows- приложения, либо программы, нежелательные к запуску по той или иной причине.
Опция exec включена по умолчанию, и очень хорошо, что включена. Представьте, что было бы, если бы вы по ошибке использовали для монтирования своего корневого раздела опцию noexec...
ro Монтирует файловую систему в режиме "только чтение".
rw Монтирует файловую систему в режиме "чтение и запись". Применение данной опции вылечит головную боль многих новых пользователей Линукс, рвущих волосы оттого, что не могут записывать: на дискету, в Windows-разделы или куда-либо еще.
sync and async Эти опции определяют как осуществляется ввод/вывод в данную файловую систему: синхронно или асинхронно. Обратите внимание, что в примере опция sync применена с дискетой. Попросту говоря, когда вы копируете файл на дискету, то запись физически происходит в тот самый момент, когда дана команда копировать. Если же применяется опция async, ввод и вывод происходят неодновременно (асинхронно). В случае с дискетой это означает, что физически запись может произойти много позже команды. В этом нет ничего плохого, и во многих случаях даже предпочтительно, но может иметь неприятные побочные следствия: если вытащить дискету из дисковода, не отмонтировав ее, скопированного файла на ней может не оказаться.
По умолчанию применяется опция async. Но, может быть, стоит для дискеты прописать sync, особенно если вы привыкли вытаскивать неотмонтированные дискеты, подобно тому, как это делается в Windows.
defaults По умолчанию включены следующие опции: rw, suid, dev, exec, auto, nouser и async.
Дамп - это опция резервного копирования, а fsck - опция проверки файловой системы. Я не стану слишком много о них распространяться, так как для этого может понадобиться отдельная статья, но скажу несколько слов, чтобы вы не гадали, что они могут означать.
Пятый столбец файла /etc/fstab - это опция дампа, выраженная числом. От значения этого числа зависит, будет ли создаваться резервная копия данной файловой системы. Если это ноль, программа dump проигнорирует такую файловую систему. Как видно из примера, в большинстве строк в пятом столбце нули.
В шестой колонке опция программы fsck (filesystem check- проверка файловой системы). Программа fsck использует значение чисел в этом столбце, чтобы определить, в каком порядке проверять файловые системы. Если там ноль, то файловая система вообще не будет проверяться.
Примеры записей в файл /etc/fstab
Для примера мы разберем два случая, которые чаще прочих расстраивают новых пользователей Линукса: дискета и CD-ROM (хотя дискеты в последнее время употребляются все реже).
/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0
Эта строка означает, что дискета монтируется по умолчанию с директорию /media/floppy и что тип файловой системы при этом определяется автоматически. Это полезно, так как тип файловой системы на дискетах может быть различным. Особое внимание обратите на опции rw и user: они обязательно должны быть прописаны, если вы хотите монтировать дискету и записывать на нее, будучи рядовым пользователем. Если это не получается, проверьте файл /etc/fstab на предмет наличия этих опций. Еще обратите внимание на опцию sync. С таким же успехом может быть и async, по причинам, которые мы уже обсудили.
/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0
Снова отметьте опцию user, позволяющую рядовому пользователю монтировать компакт диски. Опция ro установлена потому, что нет смысла монтировать CD-ROM в режиме "чтение-запись", ведь на него все равно ничего не запишешь. А вот опция exec очень кстати, если надо запустить какую-либо программу с компакт-диска.
Обратите также внимание на применение опции noauto как с дискетой, так и с CD-ROM, это означает, что они не будут автоматически смонтированы при запуске системы. Это очень разумно для съемных носителей, которых при запуске может просто не быть в дисководах, ведь нет смысла пытаться монтировать то, чего нет.
Взято с http://www.rus-linux.net/lib.php?name=MyLDP/file-sys/fstab.html
Зачастую, начинающий пользователь, не зная как выполнить какое-либо действие в Терминале, сразу задаёт вопрос (иногда довольно глупый) в Форуме. Особенно это свойственно тем, кто совсем недавно обратил свой взор на операционные системы, отличные от Windows.
Но в большинстве случаев проблему можно решить своими силами. Ведь для этого часто бывает достаточно почитать справку по используемой команде или же использовать страницы man.
В данном материале делается попытка дать начальные сведения по использованию справки и страниц man. (жду дополнений)
Практически у каждой команды Linux-системы есть (хотя бы и очень краткая) справочная информация. Чтобы её вызвать, достаточно запустить команду с аргументами -h или --help. Например, для команды ls:
$ ls --help Usage: ls [OPTION]... [FILE]... List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuSUX nor --sort. ...
В большинстве команд при вызове её с аргументом --help выдается очень много информации. Вывод на экран можно разграничить по страницам с помощью:
$ ls --help | more
Команда more самая популярная команда для вывода информации по страницам в каждой Unix системе. В Linux более популярная команда less - она имеет большую функциональность: позволяет передвигаться постранично вперед и назад, с помощью стрелок прокручивать текст, поддерживаются сочетания клавиш редактора vi для навигации и поиску по тексту. Также можно использовать команду card, которая позволяет выводить информацию сразу на принтер или сохранить в виде Postscript файл, что позволит позднее прсмотреть его с помощью утилиты evince или сконвертировать в PDF файл с помощью утилиты ps2pdf.
Многие команды имеют более расширенную версию "справки" - т.н. страницы man. Для вызова достаточно набрать:
$ man [название команды]
Для поиска информации в базе данных man страниц по ключеву слову или нескольким символам существует команда apropos. На выходе apropos покажет страницы man сожержащие искомое слово:
$ apropose crontab /etc/anacrontab (5) [anacrontab] - configuration file for anacron
- apropos показывает секции и страницы man, где было найдено искомое слово.
Секции страниц man - это способ сгрупировать страницы man по темам. Например, страницы man из секции 1 - это "Запускаемые программы" или "команды shell".
Страницы man из секции 5 - это "Формат файлов и соглашения". Страницы man одинаковые на всех Linux системах, но могут немного отличаться на других Unix системах. Для получения представления секций на конкретной системе можно посмотреть страницы man на man:
$ man man
Если указать номер сессии, то man выведет страницу этой секции. Если не указать номер секции, то man покажет страницы из первой найденной секции.
У комнады есть несколько аргументов, для выполнения разных задач. Например:
man -a crontab
- показывает все страницы секций, в данном случае для crontab
man 5 crontab
- показывает страницы man из пятой секции для crontab
man crontab -P more
- используется программа more для возможности постраничного просмотра по crontab
man -f crontab
- аналогично команде whatis
man -k crontab
- аналогично команде apropos
Существует ещё команда для поиска в страницах man - whatis. Отличие её от apropos в том, что она показывает только описание страниц man относящиеся к искомому слову. После запуска команды apropos для команды route получим три разных страницы содержащие слово route:
$ apropos route NETLINK_ROUTE (7) - Linux IPv4 routing socket route (8) - show / manipulate the IP routing table traceroute6 (8) - traces path to a network host
Если же запустить whatis, то получим только 8-ю секцию страниц man для команды route:
$ whatis route route (8) - show / manipulate the IP routing table
В некоторых случаях разработчики помещают некоторую дополнительную информацию по описанию команд, устройств, форматов файлов и других компонентов Linux в информационную базу данных. Чтобы получить доступ к этой базе необходимо набрать info (для выхода из утилиты info используется q):
$ info ls
При этом будет показана информация по команде ls. Можно перемещаться по информации с помощью клавиш нафигации (стрелки), а так же с помощью Page UP и Page Down. Файлы, которые использует такая информационная база данных, находится в директории /usr/share/info.
Вот все говорят, что линукс очень шустрый и весь такой замечательный, а мне все мало :) Приходиться выжимать из бедного пингвина последние соки, чтобы он летал быстрее, выше и сильнее. К счастью в этом стремлении я не одинок и время от времени попадаются весьма интересные способы заставить приложения работать чуточку быстрее. Например сегодня я наткнулся на статью о маленькой утилитке, позволяющей существеннл уменьшить время запуска "тяжелых" приложений. Утверждается, что прирост может составлять 50% и хотя с секундомером я не замерял, но этот прирост видно "на глаз". Вам уже интересно? Тогда продолжим :)
Итак, герой дня на сегодня - prelink. Для начала немного теории: наверное вы знаете, что программы в Linux - это, как правило, не монолитный объект, а набор из исполняемого файла и некоторого количества подключаемых динамически библиотек, так вот, при каждом запуске программы эти библиотеки приходится искать на жестком диске, что приводит к задержкам, порой достаточно длительным. Конечно, возможно статически скомпилировать программу, но тогда размер системы будет неприемлемо большим. Умные люди прикинули, что динамическое связывание с библиотеками всегда проходит одинаково и решили выполнять его раз и навсегда, то есть сохранять библиотечные связи в исполняемом файле. Это таинственное действо назвали прелинкингом, откуда, собственно и появилось название программы.
Для начала, неплохо-бы посмотреть нет-ли этой утилитки в вашем дистрибутиве. Если нет, идем дальше.
Итак, что нам понадобится:
Установленный дистрибутив GNU/Linux - 1 штука.
Библиотека libelf-0.8.10 - 1 штука
Исходники prelink - тоже 1 штука :)
распаковываем все это и ставим:
tar -zxvf libelf-0.8.10.tar.gz tar -jxvf prelink-20071009.tar.bz2 cd libelf-0.8.10 ./configure --enable-shared make make install cd ../prelink/ ./configure make make install
если повезло, то все соберется нормально, если не повезло, то внимательно читаем документацию и логи :)
После успешной сборки и установки надо-бы заняться конфигурированием.
cp doc/prelink.conf /etc
открываем файлик и дописываем в него все пути к исполняемым файлам и библиотекам, которые вы собираетесь подвергнуть процедуре предварительного связывания. Получается что-то наподобие:
-l /bin -l /usr/bin -l /sbin -l /usr/sbin -l /usr/X11R6/bin -l /lib -l /usr/lib -l /usr/X11R6/lib -l /usr/local/kde/bin -l /usr/local/qt/bin -l /usr/local/qt/lib -l /usr/local/kde/lib
Синтаксис файла в нем самом вполне доступно описан. После сохранения изменений наступает время запустить процесс:
prelink -avfmR
Процесс не очень долгий, но можно пойти покурить и выпить чашечку кофе.
по окончании процесса у вас в консоли будет отчёт о успешно или не успешной прелинковке. К сожалению, самые тяжёлые софтины обычно остаются как были и помочь в этом может только перекомпиляция этих софтин со включением опции --with-pic конфигуратора или добавлением флага -fPIC в список значений переменной CFLAGS. Гентушникам с этим проще :)
Итак, результатом всех этих безобразий станет заметное ускорение программ, подвергшихся процессу прелинкинга. Допустим приложения, основанные на GTK у меня теперь летают, хотя их и мало. Будем работать в этом направлении :)
Источники информации:
Очень мне нравится данный загрузчик, работает как часы и еще мощно конфигурируется. Но вот недавно столкнулся с одним нюансом, о котором и хочу рассказать.
Предистория.
В моей системе используется один жесткий диск (sda1), который полностью отдан во владение Kubuntu 7.10. И вот на днях, возникла необходимость установить Windows-XP на отдельный жесткий диск.
Отключив свой жесткий диск с Kubuntu, и подключив диск для Windows как второй SATA была произведена установка системы, после чего первый винт был возвращен на свое место. Но при загрузке второй операционки, возникли реальные трудности.
Теперь задача - добиться загрузки обоих систем выбором соответствующего пункта из загрузчика.
Параметры Grub.
Основные параметры загрузчика задаются в файлах menu.lst и device.map, которые находятся в директори /boot/grub/.
В Kubuntu, по-умолчанию, файл device.map выглядит так:
(hd0) /dev/sdaа строки загрузки в menu.lst - вот так (с сокращенной строкой root=UUID):
title Ubuntu 7.10, kernel 2.6.22-14-generic root (hd0,0) kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=... ro quiet splash locale=ru_RU initrd /boot/initrd.img-2.6.22-14-generic quiet title Ubuntu 7.10, kernel 2.6.22-14-generic (recovery mode) root (hd0,0) kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=... ro single initrd /boot/initrd.img-2.6.22-14-generic title Ubuntu 7.10, memtest86+ root (hd0,0) kernel /boot/memtest86+.bin quietНу а теперь о тех изменения, которые пришлось внести в конфигурационные файлы загрузчика Grub.
(hd0) /dev/sda (hd1) /dev/sdbКак я понимаю, цифра после слова hd показывает порядковое состояние винта по контроллерам. Т.е. получается что для SATA-дисков будет такая нумерация:
(hd0) = /dev/sda (hd1) = /dev/sdb (hd2) = /dev/sdc (hd3) = /dev/sddНу а для IDE-дисков соответственно:
(hd0) = /dev/hda (hd1) = /dev/hdb (hd2) = /dev/hdc (hd3) = /dev/hddи так далее..
title Windows-XP rootnoverify (hd1,0) map (hd0) (hd1) map (hd1) (hd0) makeactive chainloader +1Вот и все! Все грузится, все работает.
Взято с http://jedi-linux.blogspot.com/2008/04/grub-hdd.html
Как многим известно, я давно озаботился процессом записи крупных файлов (более 2 Гб) под Linux. В начале тернистого пути, который я прошел, было: debian etch 4.0 с ядром 2.6.18.
Что происходило в это случае. Ужасная работа с UDF. UDF диск, записанный в windows читался, но копировался не полностью, потом вообще переставал читаться, не говоря про запись.
Для начала, поймем что такое UDF. википедия пишет, что "UDF (Universal Disk Format - универсальный формат диска) - новая файловая система на CD, с поддержкой для текущего поколения компакт-дисков типа CD-RW и DVD-ROM. Стандартные CD-ROM обычно форматируются с использованием ISO 9660. Большинство компьютерных систем может читать ISO 9660 CD-ROM и CD-R диски, так как имеют встроенную поддержку ISO 9660. Однако, ISO 9660 имеет некоторые ограничения, которые делают его несовместимым с DVD, CD-RW и другими новыми форматами дисков. UDF разработан так, чтобы избавить от этих ограничений. UDF позволяет дозаписывать файлы на CD-R или CD-RW дисках, один файл одновременно, без существенных потерь дискового пространства, используя метод пакетной записи. Также UDF учитывает возможность выборочного стирания некоторых файлов на перезаписываемых носителях CD-RW, освобождая место на диске. В стандарте ISO 9660 такое не предусмотрено. UDF также лучше подходит для DVD, так как имеет лучшую поддержку для дисков большого объёма."
А также, что "ОС Linux также поддерживает данную файловую систему. Монтироваться она должна без проблем, для создания диска с данной ФС нужно использовать пакет udftools."
Что ж. Вначале я попробовал создать UDF в k3b. Но выяснилось что k3b создает все-таки ISO9660 с структурой UDF (я не стал вникать в подробности сего процесса, и решил что все таки ISO мне не подходит так как k3b в любом случае не даст писать файлы более 4 Гб да и после того как я попробовал записать файл более 1 Гб - он у меня не прочитался) .
Далее, я решил сначала исправить ошибку чтения UDF дисков. Эта ошибка решается компиляция нового ядра - последнее на данный момент 2.6.23. Для этого при конфигурировании включаем поддержку UDF и поддержку пакетной записи (она пригодится нам позже). Обновив ядро мы смело копируем диск UDF с файлом более 4 Гб.
Но на запись ISO с поддержкой UDF (k3b с помощью mkisofs и cdrecord) это к сожалению это к сожалению не влияет:
man mkisofs
" -udf Include UDF filesystem support in the generated filesystem image. UDF support is
currently in alpha status and for this reason, it is not possible to create UDF-
only images. UDF data structures are currently coupled to the Joliet structures,
so there are many pitfalls with the current implementation. There is no UID/GID
support, there is no POSIX permission support, there is no support for symlinks.
Note that UDF wastes the space from sector ~20 to sector 256 at the beginning of
the disc in addition to the space needed for real UDF data structures."
После пришлось искать альтернативные программы записи. Нашлось - udftools.
А вот собственно как писать UDF в режиме пакетной записи:
1) В файле /etc/default/udftools раскомментировать DEVICES="/dev/hd?" (у меня /dev/hdb)
2) Вставляем диск.
3) Форматируем RW. - #dvd+rw-format -f /dev/hdb
4) Создаем на диске UDF fs - #mkudffs /dev/hdb
5) Запускам пакетную запись: #/etc/init.d/udftools start
6) Создать папку для монтирования: # mkdir /mnt/udf
7) Монтируем диск (через пакетное устройство) #mount -t udf -o utf8,noatime /dev/pktcdvd/0 /mnt/udf
8) Используем диск как дискету
9) Отмонтируем диск #umount /mnt/udf
10) Останавливаем пакетную запись: #/etc/init.d/udftools stop
11) eject
Как насчет DVD-R пока не знаю, расскажу позже. Или может в комментах кто расскажет.
С самого своего появления, UNIX позиционировался как мультипользовательская операционная система. Что соответственно повлекло за собой создание механизмов для защиты и обеспечения авторизорованного доступа к данным. Таким образом появился стандарт DAC (Discretionary Access Control). В соответствии с DAC, пользователь сам решает какие права доступа соответствуют файлам. Но с точки зрения разработки операционных систем эта модель оказалась неудовлетворительной. Из-за чего появились новые модели для организации доступа к файлам, такие как MAC (Mandatory Access Control), ACL (Access Control List), и их реализации, например SELinux, TrustedBSD, Trusted Solaris.
Обычно, владельцем файла является пользователь, создавший этот файл. В UNIX-подобных операционных системах, все файлы имеют два типа владельцев: user (пользователь) и group (группа). Владельцы не должны совпадать друг с другом, т.е. user не должен быть членом group. Но фактически почти всегда, пользователь принадлежит к той группе, которая владеет файлом. Если пользователь не является владельцем файла и не принадлежит к группе, владеющей файлом, то он считается левым (others, остальные). Каждому пользователю в системе присваивается UID-номер (user identification number, идентификатор пользователя), с помощью этого система однозначно определяет пользователя. Пользователь root имеет UID = 0, а максимально возможный номер принадлежит пользователю nobody (никто) (для Ubuntu это 65534, для NetBSD 32767). Следовательно права привязываются не в к имени пользователя, а к его UID. Аналогично каждой группе соответствует GID (group identification number). Для того что бы в консоле вывести владельцев файлов используйте команду ls с ключом -l:
$ ls -l razem 1822 drwxr-xr-x 3 adam adam 120 2007-09-03 16:00 Desktop -rw-rr 1 adam adam 400 2007-08-22 18:49 prog_09.py
Третья и четвертая колонка означают, что пользователь и группа владеют файлом.
Эта команда позволяет изменить группу-владельца файла. Если эту команду использует простой пользователь, то он, во-первых, должен быть владельцем файла, а во-вторых, он должен быть членом группы, которой он хочет дать права. Интересный факт, пользователь не должен быть членом группы, которая владеет файлом. Синтаксис следующий: chgrp new-group files,можно использовать как и имя группы, так и GID группы.
$ ls -l -rw-rr 1 adam root 0 2007-09-03 15:33 file.txt $ chgrp users file.txt $ ls -l -rw-rr 1 adam users 0 2007-09-03 15:33 file.txt
Команду кстати можно использовать с ключом -R, что приведет к рекурсивному обходу всех файлов в каталоге и его подкаталогах.
Эта команда используется для изменения как владельца так и группы. В большинстве систем, только root имеет право пользоваться этой командой. У команды следующий синтаксис: chown new user:new group files. Как и в команде chgrp, вы можете использовать как имена пользователей и групп, так и их GID и UID. Кстати команда не проверяет на существование пользователей и группы, так что можно задать несуществующие.
$ ls -l -rw-rr 1 adam users 0 2007-09-03 15:33 file.txt root@laptop:# chown root:root file.txt adam@laptop:~$ ls -l -rw-rr 1 root root 0 2007-09-03 15:33 file.txt
Смена группы и пользователя.
root@laptop:# chown zoidberg file.txt
Смена владельца на пользователя zoidberg, группа остается без изменений.
# chown :futurama file.txt
Смена группы на futurama, владелец без изменений.
В любой UNIX-подобной системе имеются 3 уровня доступа к файлу: чтение, read (r), запись, write (w) и выполнение, execute (x).Тип доступа Для файла Для каталога
r Чтение содержимого файла Отображение содержимого каталога (например командой ls)
w Запись в файл Изменение содержимого каталога
x Запуск файла на исполнение Возможность войти в каталог командой cd
Стоит заметить, что когда мы рассматриваем права на каталоги, нужно помнить, что каталог - это тоже файл, который содержит список файлов, т.е. их имена и расположение на диске. Для того что бы посмотреть содержимое каталога достаточно воспользоваться командой ls (без ключей), для этого необходимы только права на чтение, но для того что бы выполнить ls -l необходимы права на запись и выполнение. Обобщая вышесказанное, выполняя любую операцию над каталогом (кроме простого просмотра содержимого) вам необходимы права на выполнение, таким образом обладая этими правами вы получаете доступ к содержимому каталога использую имена файлов.
drw-rr 2 adam adam 96 2007-09-05 18:04 blob drwxr-xr-x 2 adam adam 176 2007-09-04 15:57 tapety -rw-rr 1 adam adam 125 2007-08-29 18:31 fme.py
Список прав доступен по команде ls с ключом -l. В первой колонке первый символ обозначает тип файла, а остальные 9 показывают права доступа. Первые 3 из 9 показывают права user, следующие 3 - это права group, и оставшиеся для левых.
В приведенном примере blob - это каталог, user имеет права на запись и чтение, но не на выполнение (rw-), у группы и у остальных есть права только на чтение. Tapety - тоже каталог, и у user есть права на все (rwx), а у группы и у остальных есть права на чтение и выполнение (r-x). Fme.py - это файл.
Рассмотрим команду для смены прав доступа:
chmod access rights files
Перед выполнением команды необходимо выбрать класс пользователей, для кого мы хотим изменить права (ugo, User, Group, Others). Есть так же дополнительная группа a (all, все). Затем выбираем оператор: + (дать права), - (убрать права) и = (присвоить права). И в конце выбрать сами права (rwx, r-x и т.д.).
$ chmod u+x skrypt.sh
Пользователю (u) добавляется (+) право на выполнение (x) файла skrypt.sh.
$ chmod go-r raport.odt
У группы и остальных (go) отбирается (-) право на чтение (r).
$ chmod a=w finanse.ods
Всем (a) присваивается (=) право на запись (w), а остальные права стираются (=).
$ chmod u+rwx,g+rwx,o+x trurl.py
Пользователю прибавляются права на все, группе тоже, а остальным прибавляется право на выполнение.
Для упрощения записи команды chmod можно использовать числовое представление прав. У каждого типа доступа есть числовое представление, для этого используется двоичное представление. Единица означает - есть право, 0 - нет права. Таким образом запись правила rwx r-x r-x в бинарном виде будет выглядить следующим образом: 111 101 101. Но двоичное представление не очень удобно, поэтому используют десятичное представлени. 111 в двоичной системе - это 7 в десятичной, а 101 - это 5, таким образом 111 101 101 - это 755. Итак получаем:
x 1 -w- 2 -wx 3 r 4 r-x 5 rw- 6 rwx 7
Таким образом вы можете записать как
$ chmod u=rwx,g=rwx,o=x trurl.py
так и
$ chmod 771 trurl.py
Рассмотрим несколько специальных уровней доступа, расширяющие стандартные.
Данная опция добавляет выбранным классам права на выполнение тогда и только тогда, когда другие классы тоже имеют права на выполнение:
$ ls -l -rwx 1 adam users 14 2007-09-10 21:48 skrypt.sh drwx 1 adam users 14 2007-09-10 21:48 tapety -rw- 1 root users 3665 2007-09-17 17:23 wynik.txt $ chmod go+X * $ ls -l -rwxr-xr-x 1 adam users 14 2007-09-10 21:48 skrypt.sh drwxr-xr-x 1 adam users 14 2007-09-10 21:48 tapety -rw-rr 1 adam users 3665 2007-09-17 17:23 wynik.txt
Если такой типа установить на выполняемый файл, то результаты его работы будут храниться в оперативной памяти даже после завершения программы. Эта возможность редко используется в наши дни, но исторически это сделано было для уменьшения затрат при запуске программ, сегодня существуют более мощные средства кэширования и экономичного распределения памяти между процессами. Если поставить эту опцию на каталог, то всем будет разрешено создавать в ней содержимое, но удалять будет иметь права только владелец и root.
drwxrwxrwt 10 root root 464 2007-09-20 12:45 tmp
Эта возможность часто используется для каталога /tmp. Судя из названия, этот каталог используется как временный.
Назначить липкий бит можно командой chmod:
# chmod u+t test/ # ls -l drwxrwxrwt 2 adam users 48 2007-09-20 15:28 test
или используя числовую запись
# chmod 1000 test/
Если установить этот режим на исполняемый файл, то все смогут запускать программу от имени владельца. Например у программы ping владельцем является root (т.к. только root имеет право создавать сокеты, что и делает эта программа), но так как на ней стоит этот режим, то и все остальные могут пользоваться этой программой.
$ ls -l /usr/bin/ | grep sudo -rwsr-xr-x 1 root root 91508 2006-10-09 13:37 sudo # chmod u+s program # chmod 4000 program
Полностью аналогична setuid, только для групп.
# chmod g+s test/ # chmod 2000 test/ # ls -l drwxrwsrwt 2 adam adam 48 2007-09-20 15:28 test
Команда unmask используется для установки прав файлов для новосозданных файлов по умолчанию. Глобально, у всех новых файлов права по умолчанию 666. С помощью этой команды мы передаем те опции которые НЕ будут присутствовать в новых файлах. Т.е. если мы передадим параметр 0022, то по умолчанию права будут 644.
$ umask 0022 $ touch file $ ls -l -rw-rr 2 adam adam 48 2007-09-20 15:28 file umask 0111 $ ls -l -rw-rw-rw- 1 adam adam 0 2007-09-20 17:31 file2
Оригинал: http://polishlinux.org/console/file-permissions-in-linux/
Взято с http://linuxpeople.ru/2007/12/04/prava-na-fajly-v-linux/
Статья с http://tigro.info/blog/ о сборке deb пакетов.
Для сборки пакета нам понадобятся debhelper, dh-make, devscripts, fakeroot, а также необходимые компиляторы и интерпретаторы. Кроме того нам нужна программа, которую будем компилировать. Сам тарбол нам как бы и не нужен, нам нужно только дерево исходников, которое необходимо распаковать. Главный каталог должен называться следующим образом: имяпакета-версияпакета, в противном случае возникнут проблемы.
В итоге у нас должны получиться бинарные файлы, исходник *orig*tar.gz, *diff*gz* и файлы .dsc и .changes. Возможно обойтись без файлов *orig*tar.gz и *diff*gz* заменив их одним тарболом, в котором находятся все служебные файлы, однако начиная с версии Debian 4.0 подобные ухищрения не приветствуются.
Итак, я для удобства рекомендую создать в вашем домашнем каталоге папку, допустим, BUILD, в ней для каждого пакета создавать каталог по его имени, и уже внутри последнего каталога размещать дерево исходников. Для чего так сложно? Потому, что собранные пакеты будут помещаться на уровень выше дерева и у вас скоро весь каталог BUILD забьётся кучей файлов.
Если вы хотите использовать Цифровую подпись, то необходимо добавить в ваш файл .bashrc следующие строки:
export EMAIL=your@gpg.email export DEBFULLNAME="YOUR GPG NAME" export DEBEMAIL=your@gpg.email
Имя и почтовый адрес должны быть такими же, какими вы их задали при создании GPG ключа. Если вы создали ещё и описание, то его тоже необходимо указать в переменной DEBFULLNAME.
Итак, для начала необходимо создать служебные файлы. Для этого нужно зайти в каталог исходников и отдать команду dh_make --createorig. Вам необходимо выбрать нужный тип пакета. Если у вас будет только один бинарный пакет, то нажимаем s, если несколько — то l. Для модулей ядра нужно выбрать k. О cdbs (b) мы поговорим как-нибудь потом.
Можете также вызывать команду
dh_make
вместе с ключом
-c
чтобы указать лицензию пакета.
Мы сперва рассмотрим пакет, содержащий несколько бинарников (то, что обычно ни в каких документациях не рассматривается). А потом скажем несколько слов относительно single binary.
После запуска dh_make создастся каталог debian, в котором будет лежать довольно большое количество файлов. Все файлы *.ex и *.EX можно в принципе удалить сразу и создавать только по мере надобности.
В файле control указываются все необходимые параметры. Он делится на секции Source и Package. Секций Package может быть несколько в зависимости от того сколько бинарных пакетов получится при сборке. Ниже приведён пример файла control для пакета liferea:
Source: liferea Section: gnome Priority: optional Maintainer: Franz Pletz <fpletz@franz-pletz.org> Uploaders: Luis Rodrigo Gallardo Cruz <rodrigo@nul-unu.com> Build-Depends: autotools-dev, debhelper (>> 4.0.0), libgtkhtml2-dev Standards-Version: 3.7.2.0 Package: liferea Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, liferea-xulrunner (=${Source-Version}), dbus-1-utils Description: feed aggregator for GNOME Liferea is a simple FeedReader clone for GNOME. It is a reader for RSS/RDF feeds which also supports CDF channels, Atom/Echo/PIE feeds and OCS directories. . Liferea is an abbreviation for Linux Feed Reader. . Homepage: http://liferea.sourceforge.net/ Package: liferea-xulrunner Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Provides: liferea-mozilla, liferea-gtkhtml Conflicts: liferea-mozilla (<< 1.0.17-1), liferea-gtkhtml (<< 1.0.27-2) Replaces: liferea-mozilla (<< 1.0.17-1) Description: xulrunner-based rendering library for Liferea Liferea is a simple FeedReader clone for GNOME2. It is a reader for RSS/RDF feeds which also supports CDF channels, Atom/Echo/PIE feeds and OCS directories. . Liferea is an abbreviation for Linux Feed Reader. . Homepage: http://liferea.sourceforge.net/ Package: liferea-mozilla Architecture: all Depends: liferea-xulrunner Description: transitional dummy package Previous versions of liferea had several rendering engines to choose from. This is a dummy package to ease transition from those versions. . It can be safely removed from your system after updating. Package: liferea-gtkhtml Architecture: all Depends: liferea-xulrunner Description: transitional dummy package Previous versions of liferea had several rendering engines to choose from. This is a dummy package to ease transition from those versions. . It can be safely removed from your system after updating.
Разберём его поподробней. Итак, в секции Source указывается имя исходника, секция (Section), к которой пакет будет отнесён в репозитории, Priority — приоритет, подробнее смотреть здесь. Maintainer и Uploaders — думаю без вопросов, Build-Depends — пакеты необходимые при сборке пакета, Standards-Version — версия документа Debian-Policy (не нужно трогать).
Далее идёт описание для бинарного пакета, Packages — его имя, Architecture: архитектура пакета, может быть any (сама превратится в нужную платформозависимую архитектуру) и all (платформонезависимую), Depends — зависимости которые обязательно требуются для установки пакета (благодаря двум переменным в этом поле зависимости появятся автоматически, однако иногда следует добавлять их вручную), Description — описание пакета, причём в первой строке используется краткое описание, а в остальных строках, начиная с пробела, длинное. Новые абзацы отделены строкой с точкой.
По поводу зависимостей. Существуют ещё два типа зависимостей Suggests и Recommeds. Первый тип зависимостей нацелен на расширение возможностей нашего пакета, второй настоятельно рекомендует установить данные пакеты. Aptitude ставит зависимости Recommeds по умолчанию, apt-get не обрабатывает ни те, ни другие. Существуют также Pre-Depends, но их использовать не рекомендуется.
В зависимостях могут применяться указания версий, как видно из примера. Допустимыми символами сравнения являются: <<, <=, =, >=, и >> для строго раньше чем, раньше или равно, в точности равно, равно или позже и строго позже чем соответственно.
Также в control файле могут применяться следующие теги: Provides — дополнительное имя для нашего пакета (эдакое виртуальное), Replaces — список пакетов, которые будут удалены после установки нашего пакета, Conflicts — пакеты с которыми наш пакет заведомо конфликтует.
Вторым по важности файлом является файл rules. Именно в нем находится все необходимое для компиляции пакета и упаковки его в бинарные пакеты. Этот файл есть ничто иное, как скрипт make, с использованием команд dh_*.
В нем действительно много секций, и много строк, но нам нужно будет изменять секции config.status, build и install. В этих секциях, соответственно, необходимо прописать команды для конфигурации пакета (если они нужны), для его сборки и для установки. Если мысленно выкинуть всевозможные dh-команды, то скрипт становится не таким уж страшным. Правда dh-команды разумеется нужны. Ниже приведен файл rules:
#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. CFLAGS = -g -O2 ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif config.status: configure dh_testdir cp -f /usr/share/misc/config.sub config.sub cp -f /usr/share/misc/config.guess config.guess CFLAGS="$(CFLAGS)" ./configure --prefix=/usr \ --mandir=\$${prefix}/share/man \ --sysconfdir=/etc --disable-gecko \ --disable-gtkhtml2 --enable-sm ln -s $(CURDIR)/liferea.1 $(CURDIR)/debian/liferea-bin.1 ln -s $(CURDIR)/liferea.1 $(CURDIR)/debian/liferea-add-feed.1 build: build-stamp build-stamp: config.status dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp config.log debian/liferea-bin.1 \ debian/liferea-add-feed.1 -$(MAKE) distclean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 $(MAKE) install \ DESTDIR=$(CURDIR)/debian/liferea # add the debian menu icon cp debian/liferea.xpm debian/liferea/usr/share/liferea/pixmaps/ # Link documentation mkdir -p debian/liferea/usr/share/doc/liferea ln -s ../../liferea/doc/html debian/liferea/usr/share/doc/liferea/html dh_movefiles --sourcedir=debian/liferea # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs ChangeLog dh_installdocs dh_installman debian/liferea-bin.1 debian/liferea-add-feed.1 dh_installmenu dh_gconf dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install
Вообще при сборке deb-пакета следует привыкать к тому, что одно и тоже можно делать разными способами, что разумеется не упрощает задачу. Рассмотрим основные строки из файла rules.
В секции config.status идет обычный запрос на конфигурацию пакета. Обратите внимание, что вам необходимо правильно задавать каталоги, так как по умолчанию configure выбирает /usr/local. Секция build вызывает секцию build-stamp, в которой происходит обычный make ($(MAKE) = make).
Затем выполняется install. Там идет обычный make install и дополнительные команды для правильной установки данного пакета. Заметьте, что инсталляция происходит в каталог $(CURDIR)/debian/liferea, где $(CURDIR) каталог дерева исходников. Теперь одна из важных вещей. Нам необходимо разобрать файлы из общего каталога liferea по нашим бинарным пакетам. Именно для этих целей и служит команда dh_movefiles. В качестве параметра указывается каталог в который была произведена инсталляция. Если вы инсталлировали пакет в каталог $(CURDIR)/debian/tmp, то никаких параметров dh_movefiles передавать не нужно.
Все данные о том какие файлы в какие пакеты положить dh_movefiles берёт из файлов (в каталоге debian) название-бинарного-пакеты.install. Создайте их столько же, сколько будет бинарных пакетов и пропишите в них названия файлов с полным путём относительно каталога в который была установлена программа, но без первого слеша. Можно использовать маски.
После разбора файлов выполняется секция binary-arch, которая создаёт deb-пакет. В ней, например, видно, как устанавливаются man файлы.
В deb-пакете также могут присутствовать скрипты postinst, preinst, postrm и prerm, которые выполняются соответственно, после инсталляции, перед инсталляцией, после удаления и перед удалением. Для каждого из пакетов необходимо создать файл имя-бинарного-пакета.postinst и т. п. в них можно разместить любые команды.
Теперь рассмотрим changelog. Именно в нем мы будем указывать версию нашего пакета. Версией в Debian называется все, что идёт после имени пакета. В deb нет тегов release и epoch как в rpm, однако вы можете запросто задать что-то наподобие 3:1.0.4-15.feisty.0. До ":" идёт эпоха, после "-" идёт релиз. Файл changelog следует редактировать при помощи команды dch. Если её вызвать без параметра, то будет изменена последняя запись в changelog, а если dch -i, то будет добавлена новая:
liferea (1.0.27-2) unstable; urgency=low * Remove the GtkHTML rendering plugin. This plugin is basically unusable on 64bit architectures. liferea-gtkhtml is now just a dummy package for upgrades (Closes: #379900, #407152, #361376, #368866). * Remove upstream's NEWS file, it contains only version release dates. -- Luis Rodrigo Gallardo Cruz <rodrigo@nul-unu.com> Sun, 11 Feb 2007 21:18:16 -0600
Также в changelog вы можете менять принадлежность пакета к дистрибутиву (сразу после версии). В данно примере идёт unstable, в Ubuntu там должно быть что-то типа feisty, edgy и т. п.
Что касается single binary то там все намного проще. После команды dh_make, вам нужно подправить control и changelog. Возможно немного rules. И далее пакет соберётся сам собой.
Для сборки пакета нам понадобится команда debuild которую следует отдавать всё в том же каталоге исходников. После того, как пакеты соберутся, вы должны будете подписать пакет (если настроили GPG), вернее не пакет, а два текстовых файла, которые появятся в процессе сборки. Это файлы .dsc и .changes. Первый из них несёт информацию об исходнике, второй нужен только для помещения пакета в репозиторий.
У debuild есть параметр clean, который позволяет очистить дерево исходников и папку debian от ненужных файлов.
В этой статье я попытался передать основные принципы сборки deb пакетов, однако прекрасно понимаю, что нюансов здесь очень много, но описать их все я конечно же не смогу. Вам возможно следует почитать Руководство начинающего разработчика Debian, в котором некоторые аспекты изложены поподробней, а также Руководство по политике Debian. В следующей статье мы поговорим о том, как создавать репозитории для rpm и deb пакетов.
Я ничего не буду рассказывать о таких утилитах как emacs и vi, т. к. редактор это дело вкуса. Обойду стороной такие утилиты, как tcpdump и netstat, т. к. они в первую очередь предназначены для системных администраторов. Так о каких же утилитах я тогда хочу рассказать? О тех, которые исключительно предназначены для разработчиков приложений и стандартно присутствуют в большинстве nix-систем (в первую очередь в Linux и BSD). Как ты можешь заметить по объему статьи, таких утилит немало, к тому же в обзор попали далеко не все стандартные утилиты.
Большинство стандартных утилит для программиста входят в пакет GNU Binutils (информацию о том, что это за пакет смотри во врезке). Без пакета Binutils невозможна нормальная работа в системе, поэтому знать об утилитах входящих в этот пакет полезно не только программисту, но и простому юзеру. Впрочем, речь будет идти не только о программах из Binutils.
GNU Binutils это пакет утилит, который включается в себя многие важные системные программы, такие как as, ld, ar, gprof и пр. Без пакета Binutils невозможна работа компилятора gcc, а, значит, невозможно нормальное функционирование всей системы. Сайт разработчиков пакета Binutils расположен по адресу: http://sources.redhat.com/binutils/.
Первая такая утилита, входящая в пакет Binutils — это профайлер или профилировщик. С помощью профайлера можно установить, какие функции в программе вызываются чаще, чем нужно, а также какие из них затрачивают больше всех вычислительных ресурсов, т. е. можно выявить в программе «узкие места». Воспользоваться gprof просто. Сначала компилится и компонуется программа с опциями профилирования (для языка Си (gcc) в опциях должен быть указан флаг –pg). Затем программа запускается, в результате чего генерятся профильные данные и скидываются в файл gmon.out. Замечу, что профильный файл не появится, если программа завершается аварийно, т. е. твоя прога должна быть уже отлажена. Последним этапом запускается сам gprof, которому нужно передать имя исполняемого файла, gprof анализирует файл gmon.out и выдает информацию о том, сколько времени заняло выполнение каждой функции. В общем случае информация будет состоять из двух таблиц — «Простой профиль» ("Flat profile") и «Граф вызовов» ("Call graph") с замечаниями, кратко объясняющими содержимое этих таблиц. Из простого профиля устанавливается, какие функции программы затрачивают больше всего времени, т. к. эта таблица показывает, сколько времени выполнялась каждая функция и сколько раз эта функция вызывалась. Граф вызовов может подсказать те места, в которых можно попытаться исключить вызовы функций, требующие много времени на выполнение. В таблице графа вызовов показано для каждой функции, какие функции ее вызывали, какие функции вызывала она сама и сколько раз. Также здесь есть информация, сколько времени было затрачено на выполнение подпрограмм в каждой функции.
Утилита gprof имеет множество полезных опций, например, при задании опции –A будет отображен исходный текст программы с процентными показателями времени выполнения.
Профилировку имеет смысл делать только в больших программах с множеством вызовов функций. Пример использования:
$ gcc -pg -o you_prog you_prog.c
$ ./you_prog
$ gprof ./you_prog
Time показывает время, затраченное на выполнение программы. Пример:
$ time ./you_prog
real 0m0.008s user 0m0.001s sys 0m0.010s
Где real — астрономическое время, в течение которого выполнялась программа; user — время центрального процессора, потраченное на исполнение программы; sys — время, затраченное на программу операционной системой. Понятно, что буква m указывает минуты, а s — секунды в десятичных дробях. Если нужно отследить время выполнения программы, которая использует множество флагов и/или каналы, то утилиту time следует использовать так:
$ time /bin/sh -c "you_prog –flags|my_prog"
Если программа состоит из множества модулей, которые в свою очередь разбросаны по множеству исходных файлов, то становится сложно отыскать определение нужной функции. Именно для быстрого поиска функций и предназначена ctags. Достаточно ей скормить исходные файлы твоей проги, как она сформирует особый информационный файл (tags) из трех колонок, где в первой колонке будут названия всех функций, во второй имена исходных файлов в которых расположены эти функции, а в третьей готовый шаблон для поиска функций по файловой системе с помощью таких утилит как find. Пример:
main /usr/src/you_prog.c /^main()$/
func1 /usr/src/you_prog.c /^func1(arg1,arg2)$/
func2 /usr/src/you_prog.c /^func2(arg1,arg2)$/
Пример использования утилиты ctags:
$ ctags *.c
Данная утилита отслеживает все запрашиваемые вызовы и получаемые системные сигналы твоей программы. Используется просто:
$ strace ./you_prog
Каждая строка выводимой информации будет соответствовать одному системному вызову. Где сначала будет указано имя системного вызова со списком аргументов (с сокращениями), а после знака равно возвращаемое значение.
В выражении вида:
execve(“./you_prog”, [“./you_prog”], [/*27 vars */]) = 0
[/* 27 vars */] — означает, что здесь идет список переменных среды (27 штук), которые опущены strace для краткости.
В *BSD существует команда ktrace, которая аналогична команде strace. Пример использования:
$ ktrace ./you_prog
В текущей директории образуется файл ktrace.out, куда скидываются результаты работы ktrace. Чтобы просмотреть эту информацию нужно просто запустить утилиту kdump:
$ kdump
Во многих UNIX-like системах присутствует еще одна похожая утилита — truss. По функциям она проще, чем ktrace, но зато сразу отображает все результаты в консоли. Пример:
$ truss ./you_prog
Если твоя прога использует динамическую память, то очень желательно протестировать ее с помощью утилиты mtrace. Mtrace отслеживает соответствие числа операций выделения и освобождения памяти, т. е. вылавливает утечки памяти. Утечки памяти ведут к постепенному сокращению ресурсов системы, до полного их исчерпания. Чтобы выловить все возможные утечки памяти в твоей программе придется проделать несколько неприятных шагов. Во-первых, нужно включить в программу файл и разместить в самом начале программы вызов функции mtrace(). Затем нужно указать имя файла, в котором будет сохраняться информация о проверке, делается это через экспортирования в переменную окружения, например:
$ export MALLOC_TRACE=mem.log
После чего нужно запустить программу и все операции выделения и освобождения памяти будут регистрироваться в mem.log. Последним этапом вызывается утилита mtrace в следующем виде:
$ mtrace you_prog $MALLOC_TRACE.
Теперь нужно внимательно читать полученную информацию с указанием строк, где память не была освобождена.
Чтобы узнать размеры секций программы — секции команд (text), данных (data) и секции неинициализированных данных (bss) нужно использовать утилиту size. Она также показывает общую сумму всех секций в десятичном и шестнадцатеричном формате.
$ size ./you_prog
Команда nm выдает на стандартный вывод таблицу внешних символов для каждого файла, указанного в командной строке. Таблица символов используется для отладки приложения. Для каждого символа будет выведено его имя и указано, является ли он символом данных (переменной) или программным символом (меткой или именем функции) и пр. Подробности смотри в man. Пример:
$ nm ./you_prog
Когда программа отлажена, таблицу символов из нее можно удалить, для чего используется команда strip. Это уменьшает размер выполняемого файла, но в наше время это не столь существенно и отладочную информацию лучше оставить. Пример:
$ strip ./you_prog
GNU Debugger – самый известный консольный nix-отладчик. Про gdb написано много, поэтому я напомню лишь основные функции. Запускаем программу в режиме отладки:
$ gdb you_prog
Теперь можно ставить бряк на нужную функцию, например на функцию main:
(gdb) break main
В gdb каждая команда имеет сокращенное обозначение, поэтому вместо break можно просто ввести b. Теперь можно запустить программу на выполнение командой r (run). Можно выполнять пошаговую трассировку: s (step) – с заходом в функцию, n (next) – без захода в функцию. Команда i reg показывает содержимое всех регистров; если нужно посмотреть конкретные регистры, то их можно указать сразу за этой командой, например:
(gdb) i reg ebp eip
Команда x показывает содержимое памяти. В help (h) можно узнать подробности по любой команде.
Когда проект состоит из множества файлов, то любое изменение в одном из них неизбежно влечет за собой перекомпиляцию всех остальных, облегчить эту задачу способна утилита make (в некоторых системах она называется gmake). Этой утилите нужно передать простой текстовый файл под названием Makefile, который содержит информацию о правилах сборки и зависимостях. Правила записываются в следующем виде:
<цель>: <зависимости> <команда> <команда> ...
Первая цель в Makefile выполняется по умолчанию при запуске make без аргументов. Ее принято называть all, что эквивалентно команде "make all". Пример Makefile:
all: you_prog you_prog: you_prog.o foo.o boo.o gcc you_prog.o foo.o boo.o -o you_prog you_prog.o: you_prog.c you_prog.h foo.o: foo.c foo.h boo.o: boo.c boo.h clean: rm -f *.o you_prog
Цель «clean» предназначена для удаления всех сгенерированных объектных файлов и программ, чтобы make могла создать их заново. Чтобы собрать проект достаточно в командной строке набрать:
$ make
В man об утилите make можно узнать много других интересных подробностей.
Но есть еще один более простой способ создания Make-файлов, с помощью стандартных утилит automake и autoconf. Сначала нужно подготовить файл Makefile.am, например:
bin_PROGRAMS = you_prog you_prog_SOURCES = you_prog.c foo.c boo.c AUTOMAKE_OPTIONS = foreign
Последняя опция указывает на то, что в проект не будут включаться файлы стандартной документации: NEWS, README, AUTHORS и ChangeLog. Согласно стандарту их присутствие в GNU-пакете обязательно. Теперь нужно создать файл configure.in. Это можно сделать с помощью утилиты autoscan. Autoscan выполняет анализ дерева исходных текстов, корень которого указан в командной строке или совпадает с текущим каталогом, и создает файл configure.scan. Нужно просмотреть configure.scan, внести необходимые коррективы и затем переименовать в configure.in. И последним этапом следует запустить утилиты в следующем порядке:
$ aclocal
$ autoconf
$ automake -a -c
В результате в текущей директории появятся скрипты configure, Makefile.in и файлы документации. Чтобы собрать проект достаточно ввести следующие команды:
$ ./configure
$ make
Утилиты autoconf и automake входят в серию Autotools (см. врезку).
Под названием Autotools объединяются утилиты Automake, Autoconf, Libtool и Shtool. Подробности можно узнать на сайтах разработчиков:
http://sources.redhat.com/automake/
http://www.gnu.org/software/autoconf/
http://freshmeat.net/projects/libtool/
http://www.gnu.org/software/shtool/
Рекомендую также прочитать книгу: "GNU Autoconf, Automake and Libtool" по адресу: http://sources.redhat.com/autobook/autobook/autobook_toc.html.
Утилита hexdump может вывести программу в десятичном виде (опция –d), шестнадцатеричном (опция –x), восьмеричном (опция –b) и в ascii-символах (опция –c). Пример использования:
$ hexdump –c ./you_prog
Утилита od аналогична утилите hexdump:
$ od –c ./you_prog
Hexdump и od имеют множество других опций, о которых ты знаешь где узнать ;).
Эту утилиту по количеству функций можно сравнить со «швейцарским ножом». Например, она может легко дизассемблировать прогу (опция –D), показать все заголовки программы, в т. ч. файловые, секций и пр. (опция –x), может показать содержимое всех секций (опция –s), динамически перемещаемые данные (опция –R) и многое другое. Пример:
$ objdump –D ./you_prog
Данная утилита показывает все динамические библиотеки, от которых зависит программа. Пример использования:
$ ldd ./you_prog
libc.so.6 => /lib/i686/libc.so.6 (0x40026000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
В скобочках указывается адрес библиотеки в памяти.
Если твоя программа использует взаимодействие процессов, то тебе могут пригодиться утилиты ipcs и ipcrm. Команда ipcs указанная с флагом -m показывает сведения о совместно используемых сегментах:
$ ipcs -m
Если указать флаг -s, то ipcs покажет информацию о существующих группах семафоров.
Утилита ipcrm позволяет удалить определенный сегмент в памяти или группу семафоров, например:
$ ipcrm shm 2345097
удаляет сегмент под id равным 2345097.
Чтобы можно было работать с утилитами ipcs и ipcrm в ядре должны быть включены опции:
option SYSVMSG - поддержка сообщений в соответствии с System V;
option SYSVSEM - поддержка семафоров в соответствии с System V;
option SYSVSHM - возможность работы с разделяемой памятью в соответствии с System V.
Утилита strings выводит последовательности ascii-символов (слова) длиннее четырех (по умолчанию), которые хранятся в открытом виде в уже скомпиленной программе. Пример использования:
$ strings ./you_prog
Для создания собственных программ полезность данной утилиты сомнительна, но для исследования чужих очень даже - к примеру, можно найти имена разработчиков интересные комментарии, пароли и даже номера кредитных карт :).
Выводит файловые заголовки и заголовки секций файлов ELF-формата. Об опциях можно посмотреть в хелпе или в man.
$ readelf ./you_prog
В пакете Binutils существует архиватор ar, который используется для создания статических библиотек. Например:
$ ar cr libmy.a file1.o file2.o
Флаг cr указывает на то, что должен быть создан архив, есть и другие флаги, например для модификации или извлечения из архива (см. man). Для подключения полученной статической библиотеки к программам с помощью gcc или g++ нужно использовать флаг -L, который указывает, в каком каталоге следует искать библиотеку. Флаг -L. (с точкой) указывает на то, что библиотека находится в текущем каталоге. Затем все необходимые библиотеки перечисляются с помощью ключа -l, за которым указывается название библиотеки без префикса lib и окончания .a. Т. е. в нашем случае:
$ gcc -o you_prog.c -L. -lmy -o you_prog
Это работает в большинстве случаев, однако на некоторых системах получить статическую библиотеку не получится таким способом, т. к. после того как архиватор ar создаст архив нужно в него добавить индекс символов, т. е. список вложенных в библиотеку функций и переменных, чтобы линковка проходила нормально. Делается это с помощью стандартной утилиты ranlib из пакета Binutils:
$ ranlib libmy.a
После этого библиотеку можно подключать к программе с помощью gcc, как в предыдущем примере. Для получения статической библиотеки рекомендуется обрабатывать архив утилитой ranlib всегда.
На этом стоит, думаю, остановиться, хотя я рассказал еще далеко не обо всех стандартных утилитах для программиста. Большинство из «забытых» мной утилит либо используются очень редко, например такие как: addr2line, c++filt, objcopy, либо требует для рассказа отдельной статьи, как, например, ассемблер as. В man ты всегда сможешь найти нужную информацию.
Автор: Иван Скляров
Нашел доклад с семинара о новой файловой системе, пока находится в разработке и стадии тестирования но уже можно посмотреть что представляет из себя эта интересная разработка.
Речь пойдёт о файловой системе нового поколения. Традиционно ФС играла значительную роль в организации Unix-систем. И во многом именно свойствами ФС определялись свойства той или иной реализации Unix.
Файловая система должна хранить файлы и обеспечивать доступ к ним. При этом к ней предъявляется большое количество требований, зачастую взаимоисключающих: поддержка файлов любого размера, высокая производительность операций ввода/вывода, масштабируемость и т.д. Давно стало ясно, что ни одна файловая система не может быть одинаково эффективна во всех случаях. Поэтому все современные реализации Unix поддерживают работу с несколькими типами ФС одновременно. Есть такое выражение: "Linux - это Unix сегодня", и ядро Linux поддерживает свыше 50 (!) типов ФС.
В 2005-м году компания Sun Microsystems представила файловую систему ZFS, которая стала прорывом в области файловых систем. Из-за лицензионной политики Sun ZFS не может быть включена в ядро Linux. Однако в 2007-м году началась разработка файловой системы нового поколения для Linux - Btrfs. Разработку оплачивает компания Oracle, однако код выпускается под лицензией GNU GPL и входит в ядро Linux начиная с релиза 2.6.29, вышедшего на этой неделе.
Приведу фрагмент интервью Chris Mason - основного разработчика Btrfs:
Опишите Btrfs своими словами.
Btrfs - это новая файловая система, выпускаемая под GPL, которая разрабатывается с учётом масштабируемости на очень большие объёмы носителей. Масштабируемость означает не только возможность адресовать блоки носителя, но также возможность работать с повреждениями данных и метаданных. Это означает наличие инструментов для проверки и восстановления файловой системы без отмонтирования, и интегрированную проверку контрольных сумм, чтобы определять ошибки.
Является ли Btrfs наследницей какой-нибудь другой ФС?
Да, всех их :) Здесь много идей из ReiserFS, отложенное размещение и другие идеи из XFS. ZFS популяризовала идею, что подсчёт контрольных сумм данных может быть быстрым, и что управление логическими томами может быть лучше. Идеи по реализации управления томами пришли из AdvFS.
Итак, основные возможности, которые будут в Btrfs:
Поддержка доступных на запись снапшотов (аналог клонов ZFS). Кроме того, здесь можно создавать снапшоты снапшотов.
Поддержка субтомов --- множественных именованных корней в одной файловой системе с общим пулом хранения.
Поддержка сложных многодисковых конфигураций --- RAID уровней 0, 1, 5, 6 и 10, а также реализация различных политик избыточности на уровне объектов ФС --- то есть возможно назначить, к примеру, зеркалирование для какого-либо каталога или файла.
Copy-on-write (CoW) журналирование.
Контроль целостности блоков данных и метаданных с помощью контрольных сумм.
Зеркалирование метаданных даже в однодисковой конфигурации.
Полностью распределенное блокирование.
Поддержка ACL.
Защита от потери данных.
Выбор хэш-алгоритма.
Поддержка NFS.
Флаги совместимости, необходимые для изменения дискового формата в новых версиях btrfs с сохранением совместимости со старыми.
Резервные копии суперблока, по крайней мере --- по одной на устройство.
Скоростные приоритеты для дисков.
Гибридные пулы. btrfs старается перемещать наиболее используемые данные на самое быстрое устройство, вытесняя с него "залежавшиеся" блоки. Эта политика хорошо согласуется с появившейся недавно моделью использования SSD (Solid State Drive).
Балансировка данных между устройствами в btrfs возможна сразу после добавления диска к пулу, отдельной командой --- а не только постепенно, в процессе использования (как это реализовано в ZFS).
Диски для горячей замены, поддержка которых появилась и в ZFS.
Он-лайн конфигурирование RAID будет реализовано на уровне объектов файловой системы --- субтомов, снапшотов, файлов. Возможно будет также устанавливать некоторые параметры ввода-вывода для каталогов --- с наследованием этих свойств всеми дочерними объектами.
Конвертер из ext2/3/4.
Большинство из этих возможностей уже реализованы и работают.
С точки зрения устройства ФС, можно выделить следующие основные моменты, которые делают возможными все перечисленные особенности в сочетании с очень хорошей производительностью:
B-деревья везде, где они имеют смысл
Copy-on-write везде, где это имеет смысл
Политика блокировок - высокая гранулярность блокировок.
B-деревья и дали название файловой системе (B-tree FS). B-деревья - это сильноветвящиеся деревья (B-деревья почему-то часто путают с двоичными деревьями, видимо, из-за буквы B, но она означает Block; у каждого узла в B-дереве обычно несколько тысяч потомков), каждый узел которых, в свою очередь, содержит большое количество записей (они обычно организуются в двоичное сбалансированное дерево; в частности, в Btrfs используются красно-чёрные деревья). Читаются и пишутся узлы B-дерева целиком, что даёт значительный выигрыш в производительности.
Copy-on-write (CoW) - это алгоритм, предназначенный для ситуаций, когда нужно создавать много похожих объектов. Рассмотрим, например, создание снапшота ФС. Снапшот - это мгновенная копия всех данных части ФС в данный момент времени. Реализация "в лоб" предусматривает создание копий всех файлов, что займёт много времени и много дискового пространства. При использовании CoW создаётся только один новый объект - копия корневого каталога, а на всех файлах, на которые ссылается корневой, ставится специальная метка. Когда приложение пытается писать в "помеченный" каталог, ФС прозрачно для приложения делает его копию (помечая при этом все файлы в этом каталоге), и приложение пишет уже в созданную копию. Таким образом, создаются копии только изменившихся данных, и только тогда, когда данные действительно изменяются. Это позволяет сделать операцию создания снапшотов почти мгновенной даже для очень больших разделов. Это немаловажно, т.к. одно из основных требований к операции создания снапшота - атомарность, т.е. эта операция не должна прерываться (и конфликтовать) никакими другими операциями. В Btrfs CoW используется не только при создании снапшотов, но и при ведении журнала и многих внутренних операциях.
Блокировки - это сущность, позволяющая избежать конфликтов при одновременном доступе к данным из разных потоков. Поток, который хочет внести изменение в некоторую структуру данных, сначала проверяет, не заблокирована ли она другим потоком; если заблокирована - ждёт, пока блокировка не будет освобождена, иначе сам захватывает блокировку, и освобождает её по окончании записи. Когда речь идёт о доступе к сложным структурам данных, возникает вопрос о политике блокировок. Нужно ли блокировать всю структуру целиком, или каждый элемент в отдельности, или элементы какими-то группами? Чем крупнее единица блокировки, тем меньше блокировок, и меньше накладных расходов. Чем мельче - тем более эффективно расходуется процессорное время, т.к. потокам приходится ждать гораздо меньше. Btrfs стремится блокировать как можно меньшие элементы структур (но не слишком мелкие).
Ещё один пункт, связанный с блокировками, специфичен для ядра. В ядре есть два вида блокировок: spin-lock и мьютексы. При использовании spin-lock ожидающий поток "крутится" в бесконечном цикле. При использовании мьютексов - поток переходит в заблокированное состояние TASK_INTERRUPTIBLE, и "пробуждается" планировщиком автоматически при освобождении блокировки. Понятно, что мьютексы более эффективны, т.к. не тратят процессорное время на пустые циклы. Но мьютексы не могут быть использованы в контексте обработчика прерывания, т.к. в этом состоянии планировщик не работает. Значительная часть функций любой ФС может быть вызвана как из обработчика прерывания, так и в контексте задачи. Поэтому во многих функциях приходится использовать менее эффективные спин-блокировки.
Btrfs использует новый тип блокировок, которые могут работать в обоих режимах (и их можно переключать между режимами). Таким образом, один и тот же код будет использовать мьютексы в контексте задачи и спин-блокировки в режиме прерывания.
Ещё одна особенность Btrfs: все структуры ФС могут находиться в произвольных местах раздела, они связаны между собой указателями. Этой особенностью обладают и некоторые другие ФС, но разработчики Btrfs нашли ей новое применение: конвертация разделов из других ФС (сейчас реализована конвертация из ext2/3, конвертер из ext4 в разработке, теоретически можно создать конвертеры из других ФС). При конвертации структуры Btrfs создаются в местах раздела, помеченных в исходной ФС как свободные. В Btrfs создаётся специальный файл, в который входят блоки, занятые структурами исходной ФС. Таким образом, эти блоки оказываются помеченными как занятые. Кроме того, этот файл представляет собой образ исходной ФС, который можно примонтировать (mount -o loop). Это позволяет выполнить откат к предыдущей ФС. Чтобы освободить место на диске, достаточно просто удалить файл с образом исходной ФС (возможность отката, соответственно, пропадёт).
Одна из особенностей современных ФС не так давно вызвала небольшой скандал. Дело в том, что в ядрах unix (и linux) код ФС не занимается непосредственно записью данных на диск. Данные записываются в страницы памяти, и эти страницы помечаются как "грязные", и затем их сбрасывает на диск отдельный поток ядра (pdflush). Так вот, при использовании современных ФС (в той новости речь шла про ext4, но теми же свойствами обладают и XFS, и Btrfs, и многие другие) интервал между записью данных в страничный кэш и их записью на диск может достигать 150 секунд (больше двух минут). Unix традиционно пишется для хорошего оборудования. В частности, предполагается, что в любой системе, от которой нужна надёжность, применяются UPS. Поэтому большая задержка записи является не недостатком, а преимуществом: это даёт возможность разместить данные более удачно, и избежать фрагментации. А при использовании на менее надёжном оборудовании нужно просто перенастроить ядро средствами sysctl, чтобы заставить pdflush срабатывать чаще.
Другая недавно вышедшая ФС для Linux - это Ext4. Она учитывает многие наработки современных ФС (экстенты, delayed allocation итп), но при этом основана на коде Ext3. Это более продвинутая ФС, чем та же ext3, по тестам она во многих случаях даёт бОльшую производительность и может быть рекомендована для использования на многих машинах уже сейчас. Но при этом её не назовёшь ФС нового поколения: архитектура осталась от ext3.
Btrfs сейчас в стадии experimental, разработчики предупреждают, что сейчас её имеет смысл использовать только для тестирования и экспериментов. Даже дисковый формат до сих пор окончательно не устаканился. Но при этом это безусловно ФС нового поколения, по архитектуре она напоминает разве что ZFS, но не старые ФС linux-ядра.
Больше всего Btrfs похожа на ZFS от компании Sun. Btrfs не поддерживает диски такого астрономического объёма, как zfs, но вряд ли это в ближайшее время будет иметь практическое значение. Зато Btrfs имеет некоторые возможности, отсутствующие в zfs: снапшоты снапшотов и скоростные приоритеты дисков, оптимизацию для ssd-накопителей. Но ZFS уже вовсю используется на production-серверах, а использование btrfs станет массовым, видимо, года через два (если предполагать, что распространение btrfs будет развиваться также, как zfs).
Измерения производительности Btrfs сейчас мало информативны, т.к. оптимизация в разгаре. Однако уже сейчас Btrfs обходит zfs по производительности некоторых операций.
Основные возможности Btrfs уже реализованы. Дисковый формат близок к стабилизации, если он и будет меняться, то не сильно. Только что завершена реализация обработки ситуации нехватки места на диске (проблема в том, что фактическая запись на диск может происходить уже после закрытия файла программой, и было не совсем очевидно, как передать ошибку записи программе). Вовсю идёт поиск и исправление других ошибок. В разработке специальный ioctl-API для поддержки транзакционного I/O (несколько операций, объединённых в транзакцию, могут быть выполнены все или не выполнены совсем; кроме всего прочего, это позволяет минимизировать количество проверок между операциями в одной транзакции). Ближайшая задача - реализация удаления снапшотов, первый вариант кода уже появился в рассылке.
Оригинал статьи тут.
Недавно столкнулся с задачей как удаленно подключиться к веб-серверу на FreeBSD из под Windows, и откопал небольшую заметку. Возможно она пригодится не только мне поэтому делюсь ею с посетителями LNA
В первую очередь, что такое SSH? SSH - это сетевой протокол, который позволяет управлять удаленным компьютером через командную оболочку. При чем здесь Putty? Putty - это программа, посредством которой можно общаться с удаленным компьютером по протоколу SSH.
Давно хотел написать статью о том, зачем все это надо, потому как заметил что многие мои знакомые полностью игнорируют возможности, которые предоставляет протокол SSH. А ведь даже для не профессионала, обычного владельца блога (или парочки блогов), умение общаться с сервером через командную строку может оказаться полезным.
Представьте, что вы находитесь за городом, связь не фонтан, а вам понадобилось установить wordpress. Заливать кучу мелких файлов по FTP занятие не для слабонервных. Во-первых долго, во-вторых связь постоянно рвется. Хочется раздолбать ноут, плюнуть на все и отложить установку до возвращения домой. На помощь приходит SSH и программа Putty.
В первую очередь убедитесь, что хостинг-провайдер разрешает вам использовать SSH. На некотрых тарифах начального уровня такой возможности может не быть. В статье я затрону лишь основы работы с SSH, не касаясь особенности создания ключей (в моем варианте работы с хостинг-провайдерами этот вопрос не актуален) или передачи файлов с помощью Putty. Итак, скачайте
После запуска утилиты Putty перед вами появится основное окно работы с программой, где необходимо указать сервер, к которому будем подключаться, и название сессии. Обычно логин и пароль для доступа по протоколу SSH идентичны логину и паролю для FTP.
Host Name (or IP address): имя сервера или IP к которому подключаемся
Saved Sessions: имя сессии, под которым сохраним настройки
Port: 22
Для удобства в разделе "Connection => Data" можно прописать логин доступа, чтобы каждый раз при соединении не набирать его. Что касается пароля, то его придется каждый раз вводить вручную.
Возвращаемся в раздел "Session" и нажимаем кнопку Save для сохранении сессии. Двойным кликом мышки на названии сессии соединяемся с сервером по протоколу SSH. Предположим, что предварительно в папку "public_html" через FTP клиент вы залили архив с Wordpress, например "wp.zip".
После ввода пароля мы оказываемся подсоединенными к серверу по протоколу SSH и можем вводить команды управления файлами и взаимодействовать с сервером. Командой ls попросим сервер показать нам текущие папки и файлы в корне сервера (см. красную стрелку №1). Чтобы перейти в папку "public_html" выполним команду "cd public_html" (см. красную стрелку №2). Посмотрим, что за файлы и папки есть внутри "public_html" с помощью команды ls (см. красную стрелку №3). Архив "wp.zip" на месте, попробуем его разархивировать: "unzip wp.zip" (см. красную стрелку №4).
Дело сделано, архив с Wordpress разархивирован, осталось удалить "wp.zip": rm wp.zip. Ниже вы можете ознакомится с основными командами, который понадобятся вам для взаимодействия с сервером по протоколу SSH:
ls - отобразить файлы и папки
cd /home/big-papka/- сменить папку на указанныую
cd .. - перейти на каталог уровнем выше
cd - перейти в корневую папку
pwd - показать путь к текущему месторасполажению
mv - переместить файл
cp - копировать файл
rm - удалить файл
mkdir - создать новую папку
rmdir - удалить папку
get - загрузить файл на локальный ПК
put - загрузить файл на удаленный ПК
unzip filename.ext - извлечь файлы из архива
exit - закрыть сессию и выйти из программы
help - список команд с комментариями
Обратите внимание, что Putty не единственная программа, способная взаимодействовать с сервером по протоколу SSH, но лучшая из бесплатных.
Оригинал статьи расположен по адресу