Заметки

Заметки

linux and other

chmod + chown

Posted by kibernet on 15 февраля 2011

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

Материал собран из нескольких источников, поэтому, возможно, изложен не слишком красиво. Зато полезно :).
Назначение владельца файла командой chown

Часто требуется сменить владельца файла или каталога. Возможно, Вы скопировали какой-нибудь файл в другой каталог, но не можете отредактировать его без смены владельца. Многие проблемы в Linux возникают из-за неправильно заданных раз решений или права принадлежности. В таких случаях сообщения вида «Permission denied» и «File is read-only» появляются там, где их быть не должно.

Для решение решения таких проблем воспользуйтесь командой chown и смените владельца и/или группу, которой принадлежит файл:

$ chown пользователь файл
$ chown пользователь:группа файл
$ chown :группа файл

Пример:

$ chown -v carlas:share index.txt
changed ownership of ‘index.txt’ to carlas:share
$ chown -v :share toc.txt
changed ownership of ‘toc.txt’ to :share

Рядовые пользователи могут только вносить изменения в принадлежащие им файлы и не могут передать право владения файлом другому пользователю. Тем не менее, пользователи могут изменять принадлежность к группам (при условии, что они принадлежат как к исходной, так и к итоговой группе).

Для справки (взято из man’a)
Обзор

chown [опции] пользователь[:группа] файл…
Описание

chown изменяет владельца и/или группу для каждого заданного файла.

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

-c, –changes
Подробно описывать действие для каждого файла, владелец которого действительно изменяется.
-f, –silent, –quiet
Не выдавать сообщения об ошибках для файлов, чей владелец не может быть изменен.
-h, –no-dereference
Работать с самими символьными ссылками, а не с файлами, на которые они указывают. Данная опция доступна только если имеется системный вызов lchown.
-v, –verbose
Подробное описание действия (или отсутствия действия) для каждого файла.
-R, –recursive
Рекурсивное изменение владельца каталогов и их содержимого.
–dereference
Изменяет владельца файла, на который указывает символьная ссылка, вместо самой символьной ссылки.
–reference=rfile
Изменяет владельца файла на того, который является владельцем rfile.
–help
Выдать подсказку на стандартный вывод и успешно завершиться.
–version
Выдать информацию о версии на стандартный вывод и успешно завершиться.

Служит для обозначения конца списка опций.
CHMOD. Настройка разрешений в символьном формате.

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

Самым распространенным применением символических обозначений chmod является добавление бита исполнения в атрибуты файла без изменения остальных разрешений:

$ chmod +x сценарий

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

$ chmod u+x сценарий

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

$ chmod go-x сценарий

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

$ chmod +s /общий-каталог

Сброс всех разрешений для группы и прочих пользователей:

$ chmod go= сценарий

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

$ chmod g=u сценарий

Символическая запись chmod порой бывает довольно сложной. Следующий пример стирает все существующие разрешения и приводит их в исходное состояние:

$ chmod -v a=,u-rwx,g=rx,o=r сценарий

То же самое можно сделать командой chmod 754. Символическая форма записи также называется мнемонической:

r - чтение (Read);
w - запись (Write);
х - исполнение (Execute);
X - файл должен уже обладать разрешениям исполнения или быть каталогом;
s - назначение идентификатора пользователя или группы при исполнении - опасно! Не используйте с исполняемыми файлами (по крайней мере, если вы не до конца представляете, что делаете);
t - бит закрепления;
u - владелец файла;
g - группа, которой принадлежит файл;
o - прочие пользователи;
+ - добавление новых разрешений к действующим;
= - замена действующих разрешений;
- - сброс разрешений
CHMOD. Выполнение массовых операций.

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

Команда chmod поддерживает операции со списками файлов. Для построения списков можно воспользоваться командой find или метасимволами командного процессора.

Следующая команда делает несколько файлов доступными только для чтения для всех пользователей:

$ chmod 444 file.txt file2.txt file3.txt

Чтобы сделать все файлы текущего каталога доступными для чтения/записи для владельца и группы, но без изменения разрешений самого каталога, воспользуйтесь командой:

$ find . -type f -exec chmod -v 660 {} \:

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

$ chmod -R -v 755 /shared

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

$ chmod -v 644 * .txt

Изменение всех файлов текущего каталога, начинающихся с определенного префикса:

$ chmod -v 644 apt *
CHMOD. Настройка разрешений.

Из книги Шредера “Linux. Сборник рецептов”. Все нижесказанное проверено и работает.

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

Воспользуйтесь командой chmod (CHange MODe). Смена разрешений может выполняться только суперпользователем (root) и владельцем файла. Например, следующая команда предоставляет владельцу файла доступ для чтения и записи к файлу /archive/datafile. Ни один другой пользователь, кроме root, вообще не сможет обратиться к этому файлу:

$ chmod -v 600 /archive/datafile

mode of ‘/archive/datafile’ changed to 0600 (rw——-)

В следующем примере владелец файла /shared/list разрешает его чтение всем желающим, но изменения в файл могут вноситься только владельцем файла и root:

$ chmod -v 644 /shared/list

mode of ‘/archive/datafile’ changed to 0644 (rw-r–r–)

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

$ chmod 755 /shared/somescript

У каталогов бит исполнения всегда должен быть установлен, иначе они не будут работать:

$ chmod 755 /shared

Назначение разрешений каталогу со всем содержимым, включая подкаталоги, производится с ключом -R. Ключ -v включает режим подробного вывода, чтобы вы видели, какие действия выполняет команда:

$ chmod -R -v 755 /shared

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

Чтение - 4
Запись - 2
Исполнение - 1

Например: чтение + исполнение (4+1) = 5

Вот и подставляем эту цифру для нужного типа пользователя.

____________________________________________________________________________________________

Ряд показанных здесь команд используется для изменения владельца или группы файла или его прав.
chown, chgrp: Изменение владельца или группы для одного или нескольких файлов

Синтаксис команды chown (CHange OWNer - изменить владельца) выглядит следующим образом:
chown [опции] [файл|каталог...]

Опции включают:

-R: рекурсивно. Для изменения владельца для всех файлов и подкаталогов в указанном каталоге.

-v: подробный режим. Показывает все действия, выполняемые chown; сообщает, у каких файлов были изменены владельцы в результате выполнения команды, а какие файлы остались без изменений.

-c: подобна опции -v, но сообщает только о тех файлах, что были изменены.

Несколько примеров:

chown nobody /shared/book.tex: изменяет владельца файла /shared/book.tex на nobody.

chown -Rc queen:music *.mid concerts/: изменяет владельца всех файлов в текущем каталоге, чьи имена заканчиваются на .mid, и всех файлов и подкаталогов в каталоге concerts/ на пользователя queen и группу music, сообщая только о тех файлах, которые были затронуты командой.

Команда chgrp (CHange GRouP - изменить группу) позволяет вам изменять принадлежность к группе файла (или файлов); её синтаксис очень похож на синтаксис команды chown:
chgrp [опции] [файл|каталог...]

Опции для этой команды такие же, как и у chown, и она используется очень похожим способом. Так, команда: chgrp disk /dev/hd* изменяет принадлежность всех файлов в каталоге /dev/ с именами, начинающимися с hd, на группу disk.
2. chmod: Изменение прав файлов и каталогов

Команда chmod (CHange MODe - изменить режим) имеет весьма специфический синтаксис. В общем случае это выглядит так:
chmod [опции] [файл|каталог...]

но различие состоит в формах, которыми можно изменять режим. Он может быть определён двумя способами:

через восьмеричные числа. Права владельца в этом случае соответствуют числам в форме 00, где соответствует присвоенным правам: 4 на чтение, 2 на запись и 1 на выполнение. Так же права группы берутся по форме 0 и права для «других» в форме . Затем, все что вам нужно сделать, это сложить вместе присвоенные права, чтобы получить правильный режим. Так, права rwxr-xr- - соответствуют 400+200+100 (права владельца, rwx) +40+10 (права группы, r-x) +4 (права для других, r- -) = 754; таким образом права выражены в абсолютных значениях. Это значит, что предыдущие права безоговорочно изменены;

через выражения. Здесь права выражены последовательностью выражений, разделенных запятыми. Следовательно, выражение будет иметь вид: [category].

Категорий может быть одна или несколько:

u (User - пользователь), права владельца;

g (Group - группа), права владельца группы;

o (Others - остальные), права для «остальных».

Если категория не определена, изменения будут приняты для всех категорий. + устанавливает права, - забирает права и = устанавливает права на то, что указано в командной строке. Вообщем, права бывают следующие:

r (Read - чтение);

w (Write - запись);

x (eXecute - выполнение).

Главные опции полностью идентичны опциям команд chown и chgrp:

-R: изменяет права рекурсивно.

-v: подробный режим. Показывает выполняемые действия для каждого файла.

-c: подобна опции -v, но сообщает только о тех файлах, которые были подвержены действию команды.

Примеры:

chmod -R o-w /shared/docs: рекурсивно снимает права на запись для остальных всем файлам и подкаталогам в каталоге /shared/docs/.

chmod -R og-w,o-x private/: рекурсивно снимает права на запись для группы и остальных во всём каталоге private/ и снимает права на выполнение для остальных.

chmod -c 644 misc/file*: изменяет права для всех файлов в каталоге misc/, чьи имена начинаются с file на rw-r–r– (то есть чтение для всех, а запись только для владельца), и сообщает только о тех файлах, которые были подвержены действию команды.

Posted in Пользователю, заметки | Tagged: , | No Comments »

Как снять видео с рабочего стола

Posted by kibernet on 15 февраля 2011

ffmpeg -f x11grab -s 1280×800 -r 25 -i :0.0 -vcodec qtrle screenvideo.mov
(Здесь раздешение от левого вернего угла… есть возможность поэксперементировать)

Запись в avi - xvidcap

Запись в ogg theora - Istanbul и recordMyDesktop. Последний имеет фронтенды на GTK2 и QT4

Запись сессии VNC - vncrec

XvidCAP Только старую версию.

GLC
Ubuntu users need following packages installed in order to compile glc:
sudo apt-get install build-essential cmake libx11-dev libxxf86vm-dev libgl1-mesa-dev libasound2-dev libpng12-dev

Additionally on 64-bit systems following commands are necessary:
Code
sudo apt-get install gcc-multilib
sudo ln -s /usr/lib32/libGL.so.1 /usr/lib32/libGL.so
sudo ln -s /usr/lib32/libasound.so.2 /usr/lib32/libasound.so
sudo ln -s /usr/lib32/libXxf86vm.so.1 /usr/lib32/libXxf86vm.so
sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so
sudo ln -s /usr/lib32/libpng12.so.0 /usr/lib32/libpng.so

Posted in Пользователю, заметки | Tagged: , | No Comments »

Изменить способ обмена памяти с диском

Posted by kibernet on 15 февраля 2011

# nano /etc/sysctl.conf

vm.swappiness = 10

Posted in Debian для новичков, Пользователю, заметки | Tagged: , | No Comments »

hddtemp from user

Posted by kibernet on 15 февраля 2011

от рута
ln -s /usr/sbin/hddtemp /usr/bin/hddtemp
chmod a+s /usr/bin/hddtemp
от юзера:
hddtemp /dev/sda
Должно работать.

Posted in Пользователю, заметки | Tagged: , | No Comments »

swap из файла

Posted by kibernet on 15 февраля 2011

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 # Размер своп-файла в мегабайтах
sudo mkswap /swapfile
sudo swapon /swapfile

Чтобы созданный swap автоматически монтировался при загрузке необходимо выполнить:
sudo gedit /etc/fstab
и добавить следующие строки в конец файла:
/swapfile none swap sw 0 0

Posted in Пользователю, заметки | Tagged: , | No Comments »

Выбор файловой системы Linux

Posted by kibernet on 15 февраля 2011

Выбор файловой системы для Linux
Размещено 3 мая 2010 года

Если вы пользователь операционной системы Linux, то, скорее всего, задавались вопросом выбора файловой системы. Ext3, Ext4, XFS, ReiserFS, Btrfs или что-то другое?

Ext2 — стабильная и зрелая файловая система. Она была выбором по умолчанию для большинства старых дистрибутивов. Сейчас она вытеснена версиями 3 и 4, но Ext2 все еще популярна на твердотельных и USB-накопителях. Популярна из-за того, что у этой файловой системы нет журналирования, а это снижает количество обращений к устройству, тем самым продляя его работоспособность.

Рекомендованное использование: твердотельные и USB-накопители, либо другие устойства, которым необходима высокая стабильность с минимальными циклами чтения/записи.

Ext3
Наиболее заметное различие между Ext2 и Ext3 — введение журналирования. Если не углубляться, журналирование файловой системы предназначено для восстановления данных при крахе системы. Если вы сомневаетесь, какую файловую систему выбрать, то лучше остановиться на Ext3. Это продуманная, хорошо поддерживаемая и содержащая все функции, необходимые для настольной ОС, файловая система.

Рекомендованное использование: если у вас нет особых причин использовать другую файловую систему, то Ext3 будет лучшим выбором.

Ext4 — последняя в линейке Ext, включает в себя множество улучшений по сравнению с Ext3:
больший размер файловой системы;
контрольные суммы журналов;
дефрагментация «на лету»;
восстановление;
быстрая проверка файловой системы;
наносекундные временные метки и другое.

Ext4 полностью совместима с версиями 2 и 3, т.е. вы можете подключать Ext2 или Ext3 как файловую систему Ext4 и наоборот. Однако при этом вы потеряете многие преимущества последней версии. Сейчас многие современные дистрибутивы Linux предлагают эту файловую систему во время установки, а некоторые используют ее по умолчанию.

Рекомендованное использование: несмотря на молодой возраст, Ext4 достаточно стабильна для использования на домашних ПК и серверах.

ReiserFS (Reiser3)

До появления Ext3 файловая система ReiserFS была единственной журналируемой системой для Linux. Кроме этого, ReiserFS позволяет изменять размер файловой системы «на лету». В некоторых случаях, когда идет работа с большим количеством мелких файлов, ReiserFS способен превзойти Ext3 со значительным отрывом.

Рекомендованное использование: работа с большим количеством мелких файлов.
Reiser4

Reiser4 предназначена для решения проблем ReiserFS. Обладает улучшенной производительностью, особенно при работе с мелкими файлами, а так же поддерживает сжатие и шифрование. Однако у этой файловой системы неопределенной будущее — ведущий разработчик находится в тюрьме. Если Reiser4 будет завершена, то она станет быстрой и полезной файловой системой, но пока ее не включили в основную ветку ядра не стоит останавливать на ней свой выбор.

Рекомендованное использование: тестирование файловой системы.
XFS

XFS обладает множеством интересных особенностей: гарантированная скорость операций ввода/вывода, изменение размера «на лету», журналирование метаданных и другое. Разработанная в 2001 году файловая система доступна для выбора при установке многих популярных дистрибутивов Linux. Используя переменный размер блока вы можете тонко настроить производительность системы.

Рекомендованное использование: если хотите тонко настроить систему для удовлетворения ваших потребностей, то лучше XFS ничего нет.
Btrfs

Btrfs еще находится в стадии разработки и не может годиться для серьезного использования. Тем не менее, она доступна при установки в некоторых дистрибутивах. Интересные функции: эффективная упаковка мелких файлов и индексированных каталогов, снимки (snapshots), зеркалирвоание файловой системы, возможность миграции с Ext3 и обратно. После завершения разработки это будет, скорее всего, сильный соперник существующим файловым системам, который подойдет для использования как на домашних ПК, так и на серверах.

Рекомендованное использование: после окончания разработки может стать отличной файловой системой для серверов.

Posted in Пользователю, заметки | Tagged: | No Comments »

Корректная перезагрузка при “подвисании”

Posted by kibernet on 15 февраля 2011

Как перегрузить Убунту, если она всё же «подвиснит».Вообще само ядро почти никогда не зависает, подвисают только Иксы (графическая система). Да и вообще такое случается очень редко и в основном зависает не вся система, а только активное окно. В обычном случаи, его просто можно закрыть (окно), но бывают моменты когда графическая система подвисает так, что уже ничего не реагирует, вот тут вам уже поможет моя инструкция…

Когда система “подвисла” – зажимаем Alt + SysRq (обычно там где PrintScrn), и, не отпуская, с интервалом в 1.5-2 секунды нажимаются по очереди кнопки: R E I S U B

R: Переключить клавиатуру из “raw mode” в XLATE

E: Посылаем сигнал SIGTERM всем процессам, за исключением init

I: Посылаем сигнал SIGKILL всем процессам, за исключением init

S: Синхронизация всех подмонтированных файловых систем

U: Перемонтировать все монтированные файловые системы в режиме “только чтение”

B: Немедленно перезагрузить систему без отмонтирования разделов и синхронизации

Подробнее об этом можно почитать тут:

http://en.wikipedia.org/wiki/Magic_SysRq_key

p.s.

Если в консоли нажать Alt+SysRq+H, то можно получить краткую справку.

Posted in Пользователю, заметки | Tagged: , , | No Comments »

Модули, драйвера, устройства

Posted by kibernet on 15 февраля 2011

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

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

Скучная теория из школьного учебника

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

Что происходит на практике, будем рассматривать на примере драйверов usb-устройств. Описанные ниже принципы применимы, с определенными уточнениями, и к другим типам устройств. Работу хост-контроллера шины я сейчас не рассматриваю, достаточно того, что он обнаруживает новое устройство, назначает адрес и получает о нем определенную информацию, в случае usb и в контексте этой статьи, нам досточно device class, vendor id и product id.

Терминология

  • модуль — бинарный файл (elf) с расширением .ko, содержащий какой-то бинарный код
  • устройство физическое — какая-то штука, которую можно покрутить в руках
  • устройство логическое, низкоуровневое — объект (структура типа device, usb_device, *_device) в памяти ядра, позволяющая как-то послать устройству волшебные данные, обычно содержит указатели на устройство шины, адреса и прочее
  • устройство логическое, абстрактное — объект (структура типа input_dev, led_classdev, etc) в памяти ядра, дающая доступ к какой-то функциональности используя заранее определенный интерфейс и позволяющая абстрагироваться от деталей реализации этих функций в железе
  • драйвер — объект (структура типа usb_driver, i2c_driver, итп) в памяти ядра, имеющий имя, знающий список поддерживаемых им устройств и содержащий набор магиифункций для превращения одного в другое. живет в модуле или в теле ядра

Идентификаторы устройства

Как правило, для идентификации конкретного устройства, используется последняя пара — vendor id/product id (далее vid/pid). На шине usb, кроме них еще есть device class, если он указан, это обычно означает, что устройству достаточно стандартного драйвера. Два самых ходовых примера таких устройств — usb флешки (mass storage) и устройства ввода (human interface). У флешек могут разные vid/pid, но их соответствие классу UMS однозначно указывает ядру, на использование стандартного драйвера usb-storage.

Небольшое отступление в сторону

Шина usb поддерживает автообнаружение устройств, но это не всегда справедливо для других случаев. I2C и SPI устройства зачастую явно определяются (хардкодятся) в файле описания платформы. Кроме того, для самого контроллера usb-хоста тоже нужен драйвер — в данном случае для устройства явно задается его имя и различные параметры, необходимые для работы с устройством — адреса регистров, номера прерываний итд.

static struct resource tegra_usb1_resources[] = {
        [0] = {
                .start  = TEGRA_USB_BASE,
                .end    = TEGRA_USB_BASE + TEGRA_USB_SIZE - 1,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
                .start  = INT_USB,
                .end    = INT_USB,
                .flags  = IORESOURCE_IRQ,
        },
};
struct platform_device tegra_ehci1_device = {
        .name   = "tegra-ehci",
        .id     = 0,
        .dev    = {
                .dma_mask       = &tegra_ehci_dmamask,
                .coherent_dma_mask = DMA_BIT_MASK(32),
        },
        .resource = tegra_usb1_resources,
        .num_resources = ARRAY_SIZE(tegra_usb1_resources),
};
platform_device_register(&tegra_ehci1_device);

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

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

Как ядро находит нужный драйвер

Когда у нас есть автоопределение устройств и драйвер хост-контроллера usb замечает нового пассажира, в ядре создается объект usb_device, что отражается в каталоге /sys/bus/usb/devices. На данном этапе с устройством уже можно работать (отправлять и получать данные), но еще никто не знает, как это делать, потомучто с устройством не проассоциирован драйвер. Вы втыкаете флешку и видите, что она появилась в списке usb-устройств (lsusb), но не видите соответствующего блочного устройства (/dev/sd*). Для рассматриваемого в заметке usb, на данном этапе можно пользоваться устройством прямо из юзерспейса через libusb.

Загрузка модуля

В худшем случае, модуль, содержащий драйвер этого устройства не загружен или вообще отстутствует, тогда ядро просит юзерспейс загрузить его, вызывая modprobe и передавая ему информацию о устройстве (те самые vid, pid, device class и прочее).

Если воспользоваться утилитой modinfo или посмотреть в файл /lib/modules/$(uname -r)/modules.alias, можно заметить поле alias:

description:    USBLCD Driver Version 1.05
author:         Georges Toth <g.toth@e-biz.lu>
alias:          usb:v10D2p*d*dc*dsc*dp*ic*isc*ip*
depends:        usbcore
vermagic:       2.6.36-ARCH SMP preempt mod_unload

Если перевести на человеческий язык, данный модуль нужно загрузить, когда в ядре на шине usb нашлось любое устройство (p* — любой pid) вендора 0×10D2 (v10D2), любого класса (ic*).

Естественно, это информация берется не с потолка, а из самого файла usblcd.ko, а изначально прописывается разработчиком драйвера в исходном коде:

static const struct usb_device_id id_table[] = {
        { .idVendor = 0x10D2, .match_flags = USB_DEVICE_ID_MATCH_VENDOR, },
        { },
}
MODULE_DEVICE_TABLE (usb, id_table);

Регистрация драйвера

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

static struct usb_driver lcd_driver = {
        .name =         "usblcd",
        .probe =        lcd_probe,
        .id_table =     id_table,
};

static int __init usb_lcd_init(void)
{
        return usb_register(&lcd_driver);
 }

module_init(usb_lcd_init);

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

В зависимости от нижележащей шины, будет использоваться другой тип структуры и другая функция регистрации, но общая суть останется той же — «увидел устройство такое-то, свистни в функцию probe такую-то».

Регистрация устройства

Если же подходящий драйвер найден, вызывается его функция __probe, которой и передается информация об устройстве (у нас — структура usb_device). Функция __probe может проделать какие-то операции с устройством — посмотреть на список его ендпоинтов (в случае usb), попробовать переслать ему какие-то данные, и так далее, в зависимости от ситуации. Иногда не получается и probe возвращает ошибку, но при этом драйвер остается загруженным в памяти, на случай нахождения подходящего устройства. При возврате ошибки из __init, драйвер будет выгружен обратно.

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

Абстрактные устройства подсистемы

Кроме проверки устройства, функция __probe регистрирует… устройство, но уже не как «адрес какой-то фигни на шине», а как реализующее некий абстрактный интерфейс и принадлежащее к подсистеме ввода, блочных устройств или чего-то еще. Для подсистемы ввода, соответствющая запись появляется в каталоге /sys/class/input и в виде файла /dev/input/eventN, для блочного устройства — появится /dev/sdX, при получении прерывания из usb ендпоинта номер xx, обработчик скажет подсистеме ввода, что нажали (или отпустили) кнопку KB_POWER, а запрос N-ного сектора блочного устройства странслирует в специфическую для протокола usb mass storage команду и отправит в нужный эндпоинт.

Любители паттернов могут сказать, что «драйвер адаптирует usb-устройство к интерфейсу устройства ввода».

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

Распространенная ситуация с модемами — на одно usb устройство приходится три tty линии, одно звуковое устройство (usb audio class device со стандартным драйвером), да еще и эмуляция компакт-диска, при этом три tty-устройства обрабатываются одним драйвером usb-serial, а звук и эмуляция компакт-диска двумя другими.

При этом, подсистеме ввода все равно, на какой шине висит устройство и существует ли оно вообще (драйвер может быть прослойкой к гипервизору виртуальной машины) — если наблюдать извне, то мы просто видим еще одно «устройство ввода с пятью кнопками», точно так же, как драйверу usb-устрйоства все равно, как реализован usb-хост, висит ли он на PCI, I2C или просто вшит прямо в SoC, ему просто нужен способ передать данные в нужный ендпоинт.

При обращении к правильно реализованному устройству, происходит такая цепочка вызовов (на примере led_class): абстрактная функция led_update_brightness -> *_update_brightness конкретного драйвера, реализующий сопряжение с железом -> абстрактная функция следующего низкоуровневого драйвера (драйвера шины) -> и так далее, пока не дойдем до самого железа. При получении данных от устройства, все идет в обратную сторону.

Существует заблуждение, что драйвера пишут на асемблере — это неправда. Большинство кода драйверов устройств написано на обычном переносимом C, поэтому драйвер usb-вебкамеры прекрасно работает, как на x86, так и на мипсах и на армах, при наличии функционирующего драйвера usb-хоста, если же он написан совсем правильно, то будет работать и на big-endian машине. К сожалению, «профессиональные программисты» из различных гомопипроприетарных контор не стремятся писать код, соответствующий этим требованиям, в отличии от «красноглазых студентов».

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

Posted in Статьи | No Comments »

Midnight Commander: команды и горячие клавиши

Posted by kibernet on 15 февраля 2011

Прошли те времена, когда синий цвет на экране ассоциировался не с BSoD, а с Norton Commander. Этот файловый менеджер полюбили многие. Как грибы после дождя, стали появляться клоны. Пользователи Windows получили реинкарнацию проекта в виде FAR Manager. Линуксоиды тоже не спали и вместо надоедливых cp/mv явили миру Midnight Commander.

Программа имеет «интуитивно понятный интерфейс», правда, для эффективного применения mc в боевых условиях понадобится усвоить магические клавиатурные сочетания. Для вышеозначенных целей была скомбинирована шпаргалка в виде PDF-документа. Хочу заметить, шпаргалка не коим образом не отменяет чтения страниц man. Документ распечатывается и крепится на видном месте. Когда потребуется, всегда перед глазами. Сценарий использования абсолютно бесхитростный, но действенный.

Структура

Панели каталогов

После первого запуска mc сам собой возникает вопрос: «Куда коней запрягать?» Чтобы приручить к себе панели, понадобятся следующие комбо-удары:

Tab, Ctrl + i сменить текущую (активную) панель
Insert, Ctrl + t отметить файл либо снять отметку
Alt + g Alt + r Alt + j подсветка верхнего, среднего или нижнего файла из числа отображаемых на панели
Alt + t переключить режим отображения
Ctrl + \ показать «Справочник каталогов»
+ выбрать (отметить) группу файлов по регулярному выражению
\ снять отметку с группы файлов
Alt + o если выделен каталог, установить его текущим в неактивной панели. Иначе, установить родительский каталог текущим.
Alt + i текущий каталог активной панели станет текущим каталогом неактивной панели
Alt + y к предыдущему каталогу из истории перемещения
Alt + u к следующему каталогу из истории перемещения
Alt + H отображает историю перемещения по каталогам
Alt + e поменять кодировку панели
Alt + . отобразить скрытые файлы
Alt + , расположить панели вертикально/горизонтально
Ctrl + u поменять панели местами

Разные команды

Итак, худо-бедно жонглировать файлами и каталогами научились. Пора взяться за права и обязанности владельцев, попутно наблюдая за другими фокусами:

Ctrl + l перерисовать экран
Ctrl + x c поменять права (chmod) для отмеченных файлов
Ctrl + x o поменять владельца (chown) для отмеченных файлов
Ctrl + x l создать жёсткую ссылку
Ctrl + x s создать абсолютную символическую ссылку
Ctrl + x v создать относительную символическую ссылку
Ctrl + x i переводит пассивную панель в режим «Информация»
Ctrl + x q переводит пассивную панель в режим быстрого просмотра
Ctrl + x ! меню → «Критерий панелизации»
Ctrl + x h добавить имя каталога в «Справочник каталогов»
Alt + ! меню → «Просмотр вывода команды»
Alt + ? окно «Поиск файла»
Alt + c окно «Быстрая смена каталога»
Ctrl + o скрыть/показать панели
Ctrl + Space подсчёт размера каталога
Ctrl + r перечитать содержимое каталога
Ctrl + x j показать фоновые задания
Ctrl + x d сравнить каталоги
Ctrl + x, Ctrl + d сравнить файлы

Быстрый поиск

Здесь могла быть реклама гугла с настоящим контекстом, но Ларри до сих пор не отреагировал на моё деловое предложение.

Если серьёзно, быстрый поиск «на лету» выделяет файлы по первым символам введённого имени.

Ctrl/Alt + s режим быстрого поиска

Командная строка оболочки

Ниже представлены сочетания, призванные сократить количество телодвижений, связанных с вводом команд в командной строке.

Ctrl/Alt + Enter копирует подсвеченное имя файла в командную строку
Alt + Tab пытается выполнить операцию Завершение ввода
Ctrl + x t, Ctrl + x Ctrl + t копирует в командную строку имена помеченных файлов из активной/пассивной панели
Ctrl + x p, Ctrl + x Ctrl + p копирует в командную строку имя текущего каталога из активной/пассивной панели
Ctrl + q вставить символы, которые интерпретируются mc (пример: +)
Alt + p, Alt + n перемещение по истории команд
Alt + h выводит историю текущей строки ввода (историю команд)
Ctrl + V вставка из буфера обмена

Редактирование строк ввода

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

End of post

Самые стойкие читатели наверняка ждут результирующего документа: rmc.pdf (~60 Kb)

Этот маленький opensource-кирпичик расположился на github’е. Если захотите отредактировать, поменять шрифты или нечто подобное — не ждите трудностей, они вам не встретятся. PDF создан из обычного odt-файла, OpenOffice в помощь :-)

Posted in Soft, Пользователю | Tagged: , | No Comments »

Тонкие клиенты (linux) из устаревших компьютеров

Posted by kibernet on 15 февраля 2011

Постановка задачи

В наличии имеется следующее «железо»:

  • Мощный системный блок (двухядерный Athlon, 3Гб оперативной памяти, большой жесткий диск)
  • Несколько списанный системников уровня Pentium III, порядка 256 Мб оперативки, жесткие диски убитые/отсутствуют, есть CD-приводы

Необходимо из них собрать офисную сеть, чтобы все могли комфортно работать. Единственное решение в такой ситуации — сделать из списанных компьютеров тонких клиентов, которые могут работать на мощном компьютере (сервере). Загрузка тонких клиентов будет выполняться со специально сделанных LiveCD. Желательно использовать безопасный протокол, так как в будущем хотелось бы иметь возможность работать и удаленно (через интернет).

В качестве серверной ОС взята Linux (Ubuntu).

Способ решения

Для того, чтобы сделать тонких клиентов, воспользуемся thinstation. С официального сайта можно скачать как универсальный LiveCD, так и архив, из которого можно дальше сделать собственный iso-образ. LiveCD подходит для первого знакомства и содержит в себе различные клиенты для подключения к Windows и Unix серверам по разнообразным протоколам (RDP, VNC, SSH и т. д.) Мы будем работать с архивом и сделаем с его помощью свой iso-образ, «заточенный» под наши нужды.

Перед началом сборки определимся, какой сервер терминалов мы будем использовать. Так как у нас линукс, то, по идее, достаточно туннелировать графику через SSH, однако все это танцы с бубном — как на стороне клиента, так и на стороне сервера. Возьмем готовое решение — NX Server. Для Ubuntu уже существуют deb-пакеты. С другой стороны, NX client есть и в составе thinstation. Таким образом, нам остается только настроить сервер и сделать загрузочные CD-диски.

Делаем iso-образы клиентов

Примерная последовательность выглядит так:

1. Скачиваем с официального сайта пакет ThinStation…..tar.gz

2. Распаковываем: tar xzvf Thinstation-2.2.2.tar.gz

3. В корневой папке редактируем build.conf и thinstation.conf.buildtime (эти файлы используются во время сборки образа)

  • В файле build.conf оставляем только нужные модули и пакеты (модули отвечают за драйверы, пакеты — за программы).
  • В блоке, где идет активация клиентов, оставляем только package nx — это наш NX клиент.
  • param nxurl должен указывать на пакет nxclient…..tar.gz (этот пакет подгружается во время сборки iso-образа). Можно указать внешнюю ссылку, можно скачать и положить на localhost. Ссылки на образы других клиентов, естественно, комментируем.
  • param keyfile — берем с сервера (файл ssh_host_rsa_key.pub). Рекомендую прописать полный путь до этого файла во избежание путаницы.
  • param knownhosts — проще всего сгенерировать с помощью любого LiveCD. Загружаемся, по ssh выполняем вход на наш сервер, после этого в профиле должен появиться файл known_hosts. Копируем его. Также необходимо прописать полный путь до этого файла.
  • В файл thinstation.conf.buildtime копируем содержимое из /conf/nx.conf.sample и /conf/x-common.conf.sample. Настраиваем, исходя из своей сети. Проще всего прописывать статические ip-адреса.

Образец файла thinstation.conf.buildtime:

NET_HOSTNAME=ThinClient1NET_USE_DHCP=Off
NET_IP_ADDRESS=10.0.0.3
NET_MASK=255.255.255.0

AUTOSTART=On

SESSION_0_TYPE=nx
SESSION_0_TITLE="Gnome"
SESSION_0_NX_ADVANCED_ENABLE_SSL_ENCRYPTION="true"
SESSION_0_NX_GENERAL_DESKTOP="Gnome"
SESSION_0_NX_GENERAL_SERVER_HOST="10.0.0.1"
SESSION_0_NX_GENERAL_REMEMBER_PASSWORD="true"
SESSION_0_NX_GENERAL_RESOLUTION="fullscreen"
SESSION_0_NX_GENERAL_SESSION="Unix"

SCREEN_RESOLUTION="1280x1024"
SCREEN_COLOR_DEPTH="24"
SCREEN_BLANK_TIME=10
SCREEN_STANDBY_TIME=20
SCREEN_SUSPEND_TIME=30
SCREEN_OFF_TIME=60

MOUSE_RESOLUTION=100

X_COOKIE=36d71ab85c18ef065702c181a3d21593

4. Выполняем сборку образа: ./build

5. Смотрим на лог сборки. Если все ОК — готовый образ появится в /boot-images/iso/. Записываем его на болванку.

Устанавливаем сервер терминалов

Делаем так, как указано на официальном сайте:

sudo dpkg -i nxclient…
sudo dpkg -i nxnode…
sudo dpkg -i nxserver…

Все должно заработать «из коробки».

Чтобы убедиться в работоспособности, можно быстро загрузиться с любой другой машины через LiveCD (Ubuntu/Xubuntu), прописать у нее сеть, поставить на нее только NX клиента, и подключиться к нашему серверу.

Реальные наблюдения

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

#!/bin/shsetxkbmap -model pc105 -layout us,ru\(winkeys\) -option -option grp:alt_shift_toggle -option compose:ralt

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

Наконец, бесплатная версия NX сервера допускает одновременную работу только двух клиентов (итого — 3 человека: один на самом сервере, 2 — через тонких клиентов). Если хотим больше — либо приобретаем платную версию, либо ставим виртуальные системы (например, на proxmox). Но это уже, как говорится, совсем другая статья…

Posted in Soft, Пользователю, Статьи | Tagged: , | No Comments »