Сборник статей Handbook inside ! : Linux не для идиотов inside ! : Версия 1 от 15. 07. 2007 2007


Инициализация предварительного связывания



Pdf просмотр
страница28/50
Дата14.11.2016
Размер5.65 Mb.
Просмотров8209
Скачиваний0
ТипСборник статей
1   ...   24   25   26   27   28   29   30   31   ...   50
2. Инициализация предварительного связывания
Установка программ
Примечание: Я подразумеваю, что у вас есть Gentoo-1.4, который был собран при помощи gcc-3.2 или более поздней версии и binutils-2.13.90.0.xx. Это требуется для того, что бы выполняемые файлы могли быть предварительно связаны.
Предупреждение: Должен быть установлен glibc 2.3.1 или более новый, иначе программа prelink может испортить все ваши выполняемые файлы!
Для начала обновите свое дерево портежей, потому что многие из необходимых приложений часто обновляются и постоянно выходят исправления ошибок.
Листинг 2.1: Обновление вашего дерева портежей
# emerge sync
339

Далее, убедитесь, что у вас установлен portage-2.0.26 или более новый. Это требуется для того, что бы portage могло распознать предварительно связанные выполняемые файлы и при необходимости корректно их деинсталлировать. Т.к. предварительное связывание изменяет контрольную сумму MD5 бинарных файлов.
Листинг 2.2: Проверка версии дерева портежей
# emerge ">=portage-2.0.46"
Теперь вы можете вызвать emerge для программы предварительного связывания.
Процесс emerge автоматически проверит, что ваша система может безопасно выполнять предварительное связывание.
Листинг 2.3: Устанавливаем предварительное связывание
# emerge prelink
Некоторые люди, в ходе выполнения тестов, получают ошибки выполняя emerge для программы prelink. Тесты размещены в пакете из соображений безопасности, предварительное связывание будет непредсказуемым, если их отменить. Эти ошибки обычно связаны с базовыми пакетами, такими как binutils, gcc и glibс. В таком случае попробуйте выполнить emerge этих пакетов повторно.
Примечание: Tip: Если ошибки продолжают появляться, попробуйте скомпилировать и протестировать программу prelink самостоятельно (./configure ; make ; make check ). В случае сбоя вы можете просмотреть *.log файлы в директории с набором тестов. Они могут дать вам некоторые полезные подсказки.
Если вы имеете набор действий, которые демонстрируют ошибки в другой системе, пожалуйста отправьте его на Stefan Jones.
Настройка
Portage автоматически генерирует файл /etc/prelink.conf, который говорит программе prelink какие файлы требуется предварительно связать.
К сожалению, вы не сможете предварительно связать файлы, которые были скомпилированы старыми версиями пакета binutils. Большинство таких приложений поставляется уже скомпилированными, не имея исходных кодов, и устанавливаются в каталоге /opt. Создайте следующий файл, для того, что бы запретить программе
340
prelink использовать предварительное связывание для подобных файлов.
Листинг 2.4: /etc/env.d/99prelink
PRELINK_PATH_MASK="/opt"
Примечание: Вы можете добавить больше или меньше директорий, в список, разделенный двоеточиями.
3. Предварительное связывание
Применение предварительного связывания
Я использую следующую команду для предварительного связывания всех бинарных файлов в директориях, заданных в файле /etc/prelink.conf.
Листинг 3.1: Предварительное связывание заданных файлов
# prelink -afmR
Предупреждение: Наблюдалось, что при наличии небольшого свободного пространства в момент выполнения предварительного связывания для всей системы, существует вероятность усечения выполняемых файлов. Результатом может стать испорченная система. Используйте команду file или readelf для проверки целостности выполняемых файлов. Также вы можете заранее проверить наличие свободного места коммандо df -h
Описание опций:
-a
All, применить предварительное связывание ко всем выполняемым файлам.
-f
Вынуждает повторить предварительное связывание для файлов, которые уже подвергались ему. Это требуется т.к. программа prelink прекращает обработку существующих старых связанных файлов, зависимые библиотеки которых могли измениться.
-m
Сохраняет пространство виртуальной памяти. Это требуется, если вы имеете много библиотек, которые необходимо связать.
-R
Random, -- Выбирает случайный порядок адресов, это увеличивает безопасность против переполнений буферов.
Примечание: Более подробно об опциях можно узнать, набрав man prelink
341

4. Известные проблемы и методы их решения
"Предварительное связывание не работает с разделяемой библиотекой, собранной без опции PIC"
Причиной данной проблемы являются объектные файлы разделяемой библиотеки, скомпилированные без опции gcc -fPIC.
Далее следует список проблемных библиотек и список пакетов, для которых требуется повторно вызвать emerge, в случае возникновения данной проблемы.
Листинг 4.1: Исправления
(Для библиотеки ORBit /usr/lib/libIIOP.so.0.5.17)
emerge ">=sys-apps/tcp-wrappers-7.6-r4" ORBit
(Для библиотеки zlib /usr/lib/libz.so.1.1.4)
emerge ">=sys-libs/zlib-1.1.4"
(Для svgalib, /usr/lib/libsvga.so.xx)
emerge ">=media-libs/svgalib-1.9.16"
(Для библиотеки XFree openGL, libGLU.so.1)
emerge ">=x11-base/xfree-4.2.1-r2"
(Для libpcap.so.0.6)
emerge ">=net-libs/libpcap-0.7.1-r2"
(Для библиотеки lcms, /usr/lib/liblcms.so.1)
emerge ">=media-libs/lcms-1.09"
Примечание: Многие библиотеки статично связаны с zlib и/или tcp-wrappers, так что сначала попробуйте выполнить emerge для них, после чего, повторно запустите emerge для проблемных библиотек.
Если вы имеете проблемы с предварительным связыванием QT/KDE, то сначала попытайтесь обновить x11-base/xfree до версии 4.2.1-r2 или более новой и x11-libs/qt до версии 3.1.0-r1 или более новой. Если QT так и не работает, тогда попробуйте скомпилировать его без поддержки xinerama, задав строку myconf="-no-xinerama
${myconf}" в файле ebuild для qt.
Далее приводится список библиотек, которые пока не работают или не могут работать вообще:
Библиотеки в пакете wine, включая windex. Они в любом случае не могут ускорить выполняемые файлы MS Windows.
Библиотека в media-video/mjpgtools, /usr/lib/liblavfile-1.6.so.0 342

Если у вас есть проблемы с библиотекой, которой нет в списке, пожалуйста сообщите об этом, предпочтительно, добавив -fPIC к соответствующим CFLAGS.
Прерывание предварительного связывания файла, с выводом сообщения, вида:
"1631 Aborted ...."
Вам необходимо использовать опцию -f программы prelink; т.е. повторить предварительное связывание для всей системы с нуля. Попробуйте запустить prelink
-af
"Ошибка: : error while loading shared libraries: unexpected reloc type..."
Это было исправлено в пакете sys-libs/glibc-2.3.1-r2 2002/11/18, выполните emerge для glibc, если у вас более старая версия.
Так же запустите prelink -u -a -m ; prelink -a -m это должно помочь. Если все это не помогает, просто запустите prelink -u
У меня проблемы с библиотеками Nvidia openGL
Ускоренные библиотеки openGL идущие с пакетом nvidia-glx скомпилированы нестандартным образом, и программа prelink выводит массу предупреждений. Здесь нет повода для беспокойства, и это не может быть исправленo кем-либо помимо компании nvidia. Вы всегда можете вернуться к xfree версии библиотеки libGL.so, если вам не требуется ускорение 3D. Хотя драйвер xfree nvidia работает нормально.
После предварительного связывания моей системы, некоторые статичные выполняемые файлы более не работают
Там где участвует glibc, не бывает такой вещи как 100% статичный выполняемый файл. Если вы статично скомпилировали выполняемый файл с glibс, он может продолжать оставаться зависимым от других системных файлов. Далее приводится объяснение от Dick Howell.
"Я предполагал, что все должно находиться в скачанном файле и не должно быть никаких зависимостей с локальными библиотеками на целевой системе. К сожалению, в Linux, и я думаю везде, где используется GLIBC, это до сих пор не совсем верно. Существует библиотека "libnss" (name service switch - переключатель сервиса имен, некоторые люди думают, что это network secutiry system - сетевая система безопасности) которая предоставляет функции для доступа к различным базам данных для аутентификации, сетевой информации и для других вещей. Эта библиотека предполагает сделать приложения независимыми от отдельно сконфигурированных сетевых окружений машины. Хорошая идея, но изменения
343

GLIBC может вести к проблемам ее загрузки. И вы не можете статически связать "libnss" так как она сконфигурирована для каждой машины индивидуально. Я думаю, что, главным образом, это происходит из-за статического связывания других GLIBC библиотек, особенно "libpthread, "libm" и "libc", откуда приходят несовместимые вызовы к функциям "libnss""
Предварительное связывание обрывается с ошибкой"prelink: dso.c:306: fdopen_dso:
Assertion `j == k' failed."
Это известная проблема, любезно продиагностирована здесь. Программа prelink не может справиться с выполняемыми файлами сжатыми методом UPX. Для версии prelink-20021213 нет другого способа решить эту проблему, кроме как спрятать выполняемые файлы во время предварительного связывания. Смотрите раздел конфигурации выше, где обсуждается вопрос о том, как это осуществить.
5. Заключение
Предварительное связывание может решительно ускорить время запуска для некоторых больших приложений. Его поддержка встроена в дерево портежей.
Предварительное связывание безопасно, т.к. вы всегда можете отменить его действие для любого выполняемого файла, если вы столкнетесь с какими-либо проблемами. Помните что когда вы обновляете glibc или другие библиотеки, с которыми вы осуществили предварительное связывание, вам надо будет перезапустить prelink. В общем, удачи!
Руководство по файловой системе для устройств
Содержание:
1. Что такое devfs?
Старые (добрые?) времена
Традиционная реализация Linux предоставляет пользователю абстрактный каталог устройств, называемый /dev. Внутри этого каталога находятся device nodes, специальные файлы, символизирующие устройства внутри системы. Например,
/dev/hda символизирует первое IDE устройство в вашей системе. Файлы устройств позволяют создавать программы, которые взаимодействуют с устройствами так, как если бы устройства были обычными файлами, вместо использования специальных
API.
Файлы устройств подразделяются на две группы, называемые character devices
(символьные устройства) и block devices (блочные устройства). Первая группа содержит устройства, для котрых отсутствует буферизация чтения/записи. Вторая
344
группа, естественно, содержит устройства, для которых чтение/запись буферизируется. Из обоих типов устройств может быть прочитан за раз один символ или блок. Поэтому такой способ присваивания имён может сбивать с толку и на самом деле неправилен.
Если посмотреть на конкретное устройство, можно обнаружить что-то, похожее на это:
Листинг 1.1: Исследование информации о файле устройства
# ls -l /dev/hda brw-rw---- 1 root disk 3, 0 Jul 5 2000 /dev/hda
В предыдущем примере мы увидели, что /dev/hda — это блочное устройство. Однако важнее то, что ему присвоено два специальных номера 3, 0. Эта пара называется major-minor. Она используется ядром, чтобы соотнести файл устройства и реальное устройство. major (старший) относится к типу устройства, minor (младший) к конкретному устройству. Выглядит запутано, не правда ли?
Ещё два примера — /dev/hda4 и /dev/tty5. Первое устройство соответствует четвёртому разделу на первом IDE-устройстве. Его пара major-minor 3, 4. Другими словами, minor соответствует разделу, тогда как major соответствует устройству. Во втором примере пара major-minor — 4, 5. В этом случае первое число соответствует драйверу терминала, тогда как второе соответствует номеру терминала (в данном случае пятый терминал).
Проблемы
Если вы заглядывали в папку /dev, вы обнаружили, что там перечислены не только все ваши устройства, но и все возможные устройства, которые только могут быть.
Другими словами, у вас есть файлы устройств для устройств, которых у вас нет.
Управление такой кучей устройств по крайней мере можно назвать громоздким.
Представьте, что надо поменять права на все устройства, реально существующие в вашей системе, оставив остальные без изменений.
Затем вы добавили новое оборудование в вашу систему, для него может не оказаться уже существующего файла. Продвинутые пользователи знают, что эта задача может быть выполнена с помощью команды ./MAKEDEV внутри директории
/dev, но разве вы сразу знаете, что за устройство вам придётся создать?
Когда у вас есть программы, взаимодействующие с оборудованием при помощи файлов устройств, вы не можете смонтировать корневой раздел только для чтения, в то время как в дальнейшем нет необходимости в том, чтобы он был смонтирован на чтение и запись. И вы не можете иметь /dev на отдельном разделе, так как mount
345
необходим, /dev чтобы монтировать разделы.
Решения
Как вы могли себе представить, kernel hackers нашли достаточно решений для вышеперечисленных проблем. Однако многие из этих решений имеют собственные проблемы описанные в http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq- why. Мы не будем обсуждать эти варианты, а сконцентрируемся на одном способе, который был реализован в официальной версии исходников ядра: devfs как абсолютный победитель?
devfs решает все перечисленные проблемы. Она просто предоставляет пользователю доступ к существующим устройствам, добавляет новые device nodes
(файлы устройств), когда найдены новые устройства, и делает возможным монтировать корневую файловую систему в режиме read only (только чтение). А также решает многие проблемы, которые мы раньше не обсуждали, потому что они не так интересны для пользователей...
Как пример, с devfs вам не надо беспокоится о паре major/minor. Она продолжат поддерживаться (для обратной совместимости), но в ней нет необходимости. Это позволяет Linux поддерживать ещё больше устройств, так как больше нет ограничений (числа всегда имеют границы :)
Однако у devfs есть свои проблемы, не столь очевидные для пользователей, но достаточно серьезные, чтобы разработчики ядра пометили ее как obsolete
(устаревшее), порекомендовав использовать udev, которая также поддерживается
Gentoo.
Чтобы узнать, почему devfs считается устаревшей, читайте udev FAQ и udev versus devfs document.
2. Навигация через дерево устройств
Директории
Одна из первых особенностей которые вы можете заметить это то что devfs использует директории для объединения устройств вместе. Это повышает читабельность, так как теперь все связанные между собой устройства находятся внутри одной общей директории.
Например, все устройства, относящиеся к IDE, находятся в директории /dev/ide/, а
346
все относящиеся к SCSI в директории /dev/scsi/. SCSI и IDE диски во многом похожи, у них одинаковая структура поддиректорий.
IDE и SCSI диски управляются при помощи адаптера (встроенного или отдельной платой), называемого host. Каждый адаптер может иметь несколько каналов. Канал называется bus. На каждом канале может быть несколько IDs (идентификаторов). ID служит для идентификации диска. Этот ID называется target. Многие SCSI устройства могут иметь множество LUN (Logical Unit Numbers (Номер Логического
Устройства)), Например устройства которые управляют несколькими носителями одновременно (hi-end tapedrives). У вас скорее всего будет только один lun, lun0/.
Итак, несмотря на то, что раньше использовался /dev/hda4, теперь появился
/dev/ide/host0/bus0/target0/lun0/part4. Это намного проще... нет, не спорьте со мной... это проще... как бы то ни было! :)
Примечание: Вы также можете использовать более похожие на Unix названия для жёстких дисков, такие как c0b0t0u0p2. Они могут быть найдены в /dev/ide/hd,
/dev/scsi/hd и.т.д.
Чтобы дать вам лучше понять идею с директориями, вот листинг директорий которые есть у меня:
Листинг 2.1: Дирректории в /dev cdroms/ cpu/ discs/ floppy/
ide/ input/ loop/ misc/
netlink/ printers/ pts/ pty/
scsi/ sg/ shm/ sound/
sr/ usb/ vc/ vcc/
Обратная совместимость при помoщи devfsd
Использование этой новой структуры выглядит здорово, но многие утилиты и программы используют предыдущую, старую структуру. Для уверенности, что система не будет нарушена, был создан devfsd. Этот демон создаёт символьные ссылки на новые файлы устройств, но со старыми именами (compatibility symlinks).
Листинг 2.2: Созданные символьные ссылки
$ ls -l /dev/hda4
lr-xr-xr-x 1 root root 33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4 347

При помощи devfsd, вы можете устанавливать права доступа, создавать новые файлы устройств и т.д. Всё это описывается в следующей главе.
3. Администрирование дерева устройств
Перезагрузка devfsd
Если вы изменили файл /etc/devfsd.conf, и хотите чтобы изменения вступили в силу, вым не обязательно перезагружаться. В зависимости от того, что вы хотите, вы можете использовать любой из следующих сигналов:
SIGHUP заставит devfsd перечитать конфигурационный файл, перегрузить разделяемые объекты (shared objects) и сгенерировать событие REGISTER для каждого листа в дереве устройств.
SIGUSR1 сделает то же самое, но не будет событий REGISTER.
Чтобы послать сигнал, просто используйте kill или killall:
Листинг 3.1: Посылка сигнала SIGHUP демону devfsd
# kill -s SIGHUP `pidof devfsd`
или
# killall -s SIGHUP devfsd
Удаление compatibility symlinks
Предупреждение: В настоящее время Gentoo не может существовать без этих ссылок.
Если вы хотите удалить из вашей системы ссылки которые засоряют /dev (в Gentoo они используются по умолчанию), отредактируйте /etc/devfsd.conf и удалите следующие две строчки:
Листинг 3.2: /etc/devfsd.conf для обратной совместимости
# Закоментируйте эти две строчки для удаления симлинков
REGISTER .* MKOLDCOMPAT
UNREGISTER .* RMOLDCOMPAT
348

Вам придётся перезагрузится, чтобы изменения вступили в силу.
Удаление возможности автосоздания файлов устройств
Когда вы загружаете модуль, devfs автоматически создаёт файлы устройств. Если вы не хотите, чтобы он так делал, удалите эту строчку из /etc/devfsd.conf:
Листинг 3.3: /etc/devfsd.conf, autoload functionality
LOOKUP .* MODLOAD
4. Вопросы, относящиеся к правам доступа
Установка/изменение прав доступа при помощи PAM
Хотя вы можите установить права доступа в /etc/devfsd.conf, мы советуем использовать PAM (Pluggable Authentification Modules (). Так как PAM имеет решающий голос при установке прав доступа, и может проигнорировать изменения, которые вы сделали в /etc/devfsd.conf.
PAM использует /etc/security/console.perms для установки прав доступа. Файл состоит из двух частей: в первой описываются группы, а во второй права.
Давайте сначала взглянем на часть с группами. Как пример мы рассмотрим sound- group:
Листинг 4.1: Sound group в /etc/security/console.perms
=/dev/dsp* /dev/audio* /dev/midi* \
/dev/mixer* /dev/sequencer* \
/dev/sound/* /dev/snd/* /dev/beep \
/dev/admm* \
/dev/adsp* /dev/aload* /dev/amidi* /dev/dmfm* \
/dev/dmmidi* /dev/sndstat
Синтаксис достаточно прост: вы начинаете с имени группы, и заканчиваете списком устройств, принадлежащих этой группе.
349

Теперь для того, чтобы с группами можно было что-нибудь сделать, рассмотрим следующую часть, описывающую, как управлять правами.
Листинг 4.2: Права доступа для sound group в /etc/security/console.perms
0600 0600 root.audio
Первое поле — это проверка терминала. На большинстве систем это console-group.
PAM будет проверять это поле при каждом входе в систему. Если вход произошёл на устройстве, содержащемся в console-group, PAM проверит и возможно сменит права на некоторые файлы устройств.
Второе поле содержит права, которые установятся на файл устройства после удачного входа в систему. Когда человек вошел в систему, а файлы устройств принадлежат пользователю и группе по умолчанию, PAM сменит владельца на вошедшего пользователя и установит на них права из второго поля. В данном случае используется 0600 (пользователь имеет право на чтение/запись, все остальные нет).
В третьем поле содержатся группы устройств, чьи права будут изменены. В данном случае, вторая группа (все устройства, относящиеся к звуку) будут изменены.
Четвёртое поле определяет права, которые будут установлены на файлы устройств после возврата в состояние по умолчанию. Другими словами, если человек, который владеет правами на все файлы устройств, выйдет из системы, PAM установит права обратно в состояние по умолчанию, описанному в этом четвёртом поле.
Пятое поле определяет собственника (с группой если вам надо) к которому будут установлены атрибуты устройства после возврата в состояние по умолчанию
Другими словами, если человек, владеющий правами на все файлы устройств, выйдет из системы, PAM установит собственника обратно в состояние по умолчанию, описанному в пятом поле.
Установка/изменение прав доступа при помощи devfsd
Если вы действительно хотите установить права, используя /etc/devfsd.conf, тогда используйте синтаксис приведённый в этом примере:
Листинг 4.3: Права в /etc/devfsd.conf
REGISTER ^cdroms/.* PERMISSIONS root.cdrom 0660 350

Второе поле — это группа устройств, начиная с /dev. Это регулярное выражение, означающее, что вы можете выбрать несколько файлов устройств с одним правилом.
Четвёртое поле — это владелец файла устройства. В отличие от PAM, он не изменяется (если он не упоминается в console.perms, так как PAM главнее).
Пятое поле содержит права на файлы устройств.
Ручная установка прав и их сохранение devfsd
Это обычная ситуация для Gentoo: если вы делаете chown (CHange OWNer (Смена владельца)) и chmod (CHange MODe (Смена вида)) некоторым файлам устройств, то devfsd сохраняют информацию, когда вы вы выключаете систему. Это происходит из-за того, что файл /etc/devfsd.conf содержит следующие строчки:
Листинг 4.4: /etc/devfsd.conf для сохранения прав доступа
REGISTER ^pt[sy]/.* IGNORE
CHANGE ^pt[sy]/.* IGNORE
CREATE ^pt[sy]/.* IGNORE
DELETE ^pt[sy] IGNORE
REGISTER ^log IGNORE
CHANGE ^log IGNORE
CREATE ^log IGNORE
DELETE ^log IGNORE
REGISTER .* COPY /lib/dev-state/$devname $devpath
CHANGE .* COPY $devpath /lib/dev-state/$devname
CREATE .* COPY $devpath /lib/dev-state/$devname
DELETE .* CFUNCTION GLOBAL unlink
/lib/dev-state/$devname
RESTORE /lib/dev-state
Другими словами, изменённые файлы устройств копируются в /lib/dev-state, когда выключается система, и копируются в /dev, когда система грузится.
Другая возможность - монтировать /lib/dev-state в /dev во время загрузки. Чтобы это сделать, вы должны быть уверены, что devfs не монтируется автоматически (это значит, что вы должны перекомпилировать ядро), и что /dev/console существует.
Затем, где-то в начале bootscripts (загрузочных скриптов) вашей системы, вы должны разместить:
351

Листинг 4.5: Монтирование /lib/dev-state в /dev mount --bind /dev /lib/dev-state mount -t devfs none /dev devfsd /dev
Настольная книга по безопасности Gentoo (Англ.)
Обновлено 19 ноября 2006
Содержание:
Безопасность системы
Укрепление различных составляющих системы для повышения защищенности.
Соображения перед началом установки
Почему безопасность важна для каждого администратора сервера? (на английском языке)
Закручивание гаек
Укрепление защиты во время и после установки. (на английском языке)
Журналирование
В Gentoo Linux можно выбирать из трех различных служб журналирования. (на английском языке)
Монтирование разделов
В файле /etc/fstab есть множество параметров, влияющих на безопасность. (на английском языке)

Каталог: pub -> docs books -> Linux -> Linux 2
pub -> Буланов С. В. Кудрявцева Е. Л. Развитие креативности билингвов: путь от интеркультурности к формированию «человека мира»
pub -> «октябрьский лицей»
pub -> Самообследование гоу сош «Школа надомного обучения» №196 по направлениям деятельности. Общие вопросы
pub -> Занятие для математического кружка. Задачи работы
pub -> Доклад муниципальное образовательное
pub -> Публичный доклад. 2013 год Общая характеристика образовательного учреждения. Место расположения
pub -> Публичный доклад муниципального общеобразовательного учреждения средней общеобразовательной школы №13


Поделитесь с Вашими друзьями:
1   ...   24   25   26   27   28   29   30   31   ...   50


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал