Установка программного обеспечения

Спецсеминар "Разработка свободного ПО": http://uucode.com/oss2004/. 3-я лекция.

Пакеты, тарболлы, сборка

Крупнейшие репозитории:

Надо проверять подпись или md5. (тема для доклада: прикладная криптография)

Всё под управлением rpm. В Debian -- deb. Во FreeBSD -- ports. В других системах тоже что-то есть. Без пакетов -- никак. Нельзя превращать систему в свалку.

# rpm -i foo-0.2-alt1.rpm     // установить пакет из файла
# rpm -qa                     // список всех установленных пакетов
# rpm -ql foo                 // список файлов в пакете
# rpm -qi foo                 // информация о пакете
# rpm -qpl foo-0.2-alt1.rpm   // список файлов в файле пакета
# rpm -qf /bin/bash           // какому пакету принадлежит /bin/bash
# rpm -qf `which xpdf`        // какому пакету принадлежит xpdf

Следующий упровень -- apt. В ALT -- надстройка над rpm.

# apt-cache search bar   // поиск 'bar' по базе пакетов
# apt-get install gcc    // установка 'gcc' из репозитория

Сборка из srpm (source rpm). В ALT с этим тонкости, т.к. root не должен собирать пакеты.

Остаётся качать tarball или из cvs. Последнее не рассматриваем.

tarball -- это обычно .tar.gz или .tar.bz2. Раскрывается с помощью Total Commander (плохо, права теряются) или mc. А ещё проще:

$ tar zxf foobar-2.5.2.tar.gz
$ tar jxf foobar-2.5.2.tar.bz2

В архиве -- README, INSTALL, configure, ChangeLog, license. INSTALL обычно сводится к:

$ ./configure
$ make
$ make test
$ make install

Нельзя собирать под root'ом. Для сборки должен быть специальный пользователь. Он создаёт rpm, и уже rpm можно устанавливать. Нечего превращать систему в свалку. Это часто сложно.

Непривилегированный пользователь обычно говорит:

./configure --prefix=/home/luser/opt

А также, возможно, что-нибудь, связанное с shared libraries.

У configure бывает много ключей.

$ ./configure --help | less
$ ./configure --help | gvim -

Имеет смысл сделать файл "forconf", в котором прописать вызов configure в нужными ключами. И запустить:

$ sh forconf

Файл "forconf" пригождается через несколько месяцев.

Какие ещё make targets бывают

* clean
* distclean

Библиотеки. Статическая и динамическая линковка

Обычно не сразу си->исполняемая программа, а набор си-файлов-> набор объектных файлов->исполняемая программа.

* инкременальная сборка
* стандартные библиотеки

Проблема: в каждой из 100 программ одна и та же библиотека размером 1 Мб. Потеря 100 Мб. Решение: shared library (.so, unix) или dynamic link library (.dll, win32).

Также польза: если в библиотеке ошибка, то можно просто заменить so-файл, а не перекомнилировать всё.

Посмотреть зависимости от .so:

$ ldd /usr/bin/cat
libc.so.6 => /lib/libc.so.6 (0x00129000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

Часто зависимости относительные. И тогда система должна как-то найти, где лежат .so.

"man ld.so" для подробностей.

Линкер имеет флаги для управления so. Например, "-static".

Обычно configure и Makefile позволяет передавать параметры.

$ CFLAGS='-O3' LDFLAGS='-static' ./configure --prefix=/home/xxx/opt/

Благодаря LD_LIBRARY_PATH можно подставить свой код. Так можно вклиниться в нормальный процесс работы и создать "обёртку". Например, составить список файлов, переданных open().

Безопасность и so

Планировал рассказать, но не успел:

Примерная схема логина:

Примерная схема логина по сети:

Когда-то давно была ошибка: вначале устанавливалось окружение, а затем выполнялось нечто типа /bin/login. Пользователи стали делать так:

Ещё возможная проблема (к счастью, её нет). Рассмотрим suid-программу:

#  ldd /usr/sbin/passwd
libc.so.6 => /lib/libc.so.6 (0x00129000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

Кто нам мешает подставить свой "libc.so.6"? (домашнее задание)

Не работает также: chroot чтобы подставить свой /lib.

Вывод: при написании программ, связанных с безопасностью, надо не забывать про атаку с помощью shared libs.

Домашние задания:

Попробовать собрать из исходников и локально установить какую-нибудь программу. Например, xbill: http://www.xbill.org/

Посмотреть на so-зависимости, пересобрать без них.

Кто нам мешает подставить свой "libc.so.6" при запуске passwd?

Разобраться, подвержен ли so-атаке suexec.

Отвлечения:

170 iPod Mini от IBM http://sourceforge.net/ppc_contest.php Для лучших портов на LinuxPPC. Deadline прошёл.

Google Code Jam 2004 http://www.google.com/codejam/ Deadline прошёл.

Яндекс учреждает научные стипендии http://company.yandex.ru/news/2004/0922/