Рубрики
kernel \ source \ пакеты \ исходники

debian 11 / vanile stable kernel / install / ванильное ядро / сборка ядра

Ссылки:

https://www.kernel.org/
https://debianforum.ru/index.php?topic=12392.0
https://stackoverflow.com/questions/46008624/how-to-fix-fatal-error-openssl-opensslv-h-no-such-file-or-directory-in-redhat
https://github.com/ROCm-Developer-Tools/HIP/issues/130
https://stackoverflow.com/questions/61657707/btf-tmp-vmlinux-btf-pahole-pahole-is-not-available

kernel / usb / blacklist / make
http://www.kroah.com/lkn/ https://cateee.net/lkddb/web-lkddb/ https://wiki.archlinux.org/title/Kernel_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)/Traditional_compilation_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) http://citforum.ru/operating_systems/linux/lkmpg/ https://wirenboard.com/wiki/How_To_Build_Linux_Kernel

make[2]: *** Нет правила для сборки цели «debian/certs/benh@debian.org.cert.pem», требуемой для «certs/x509_certificate_list». Останов.
make[1]: *** No rule to make target ‘debian/certs/debian-uefi-certs.pem’, needed by ‘certs/x509_certificate_list’. Stop.

Попробуй удалить строки с CONFIG_SYSTEM_TRUSTED_KEY и CONFIG_MODULE_SIG_KEY из .config файла. Очень похоже, на вот эту проблему

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

apt install dwarves

Не обходимые пакеты для сборки:

apt install git make gcc linux-libc-dev linux-headers-amd64 pkg-config libncurses-dev flex bison  libssl-dev libelf-dev dwarves rsync bc fakeroot build-essential  xz-utils  libncurses5-dev

git - отслеживает и записывает все изменения исходного кода во время разработки
fakeroot - упаковочный инструмент, создающий фальшивую корневую среду
build-essential - Устанавливает инструменты разработки, такие как C, C++, gcc и g++.
ncurses-dev - Библиотека программирования, предоставляющая API для текстовых терминалов
xz-utils - обеспечивает быстрое сжатие и распаковку файлов
libssl-dev - поддерживает SSL и TSL, которые шифруют данные и делают интернет-соединение безопасным
bc (Basic Calculator) - математический язык сценариев, поддерживающий интерактивное выполнение операторов
flex (Fast Lexical Analyzer Generator) - генерирует лексические анализаторы, преобразующие символы в токены
libelf-dev - выдает общую библиотеку для управления файлами ELF (исполняемые файлы, дампы ядра и объектный код)
bison - генератор парсера GNU, который преобразует описание грамматики в программу на языке C.

Сборка ядра(компиляция):

0. Переходим в каталог с исходниками:
cd /usr/src/ 

1. Скачиваем ядро с www.kernel.org:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.17.1.tar.xz

2. Распаковываем:
# tar xvf lilnux-X.X.X-rcX.tar.gz
tar xvf linux-5.17.1.tar.xz

3. Переходим в каталог ядра:
cd /usr/src/linux-5.17.1

4. Достаем настройки установленного ядра 
!!! make config если конфига нет создаем новый 
!!! make olddefconfig уведомит программу о том, что вы, как бы, ответили на все задаваемые ею вопросы положительно.
!!! make oldnoconfig даст понять команде, что на все вопросы вы дали отрицательные ответы.
!!! make oldconfig программа в интерактивной форме задаст вам вопросы
!!! make localmodconfig создаст конфигурацию на основе текущей конфигурации и загруженных модулей
!!!
!!! если не хотим выставлять все галочки в конфигурации нового ядра с нуля, берём готовый config либо из /boot либо из /proc:
!!! cp /boot/config-$( uname -r ) .config
!!! zcat /proc/config.gz > .config

make oldconfig

5. Если что то требуется добавить в ядро выполняем:
make menuconfig

6.0 Собираем модули ядра
make modules

6.1 Устанавливаем модули ядра в систему
make modules_install

6.2 Собираем ядро:
#make -j2 V=s - вывод "-j2" будет использовать два ядра, "V=s" подробный вывод сборки
make -j2 V=s 

7. Устанавливаем ядро в систему
make install

Собираем deb пакет для установки:

!!! make-kpkg находится на пенсии, официальный путь Debian — make deb-pkg.
!!! В официальном руководстве по ядру Debian используется make deb-pkg

make deb-pkg

Удаление ядра:

0. Удаляем файлы ядра:
rm /boot/vmlinuz-5.17.1
rm /boot/vmlinuz-5.17.1
rm /boot/config-5.17.1
rm /boot/initrd.img-5.17.1
rm /boot/System.map-5.17.1
rm -Rf /lib/modules/5.17.1/

1. А затем необходимо обновить конфигурацию Grub:
sudo update-grub2

Пере собираем ядро debian

0. ставим исходники
apt install linux-source-5.16

1. Идем в каталог /usr/src
cd /usr/src/

2. Распаковываем
tar xvf linux-source-5.16.tar.xz

3. Входим в каталог
cd linux-source-5.16

4. Приносим конфигурацию с текущей системы
cp /boot/config-$( uname -r ) .config

5. Готовим пакеты
make modules
make deb-pkg -j4

raspberry pi

sudo apt install raspberrypi-kernel-headers

Иногда очень надо поставить конкретное ядро:

apt search linux-image | grep 5.15 | grep 71
apt search linux-headers | grep 5.15 | grep 71

apt install linux-headers-5.15.0-71-generic linux-image-5.15.0-71-generic

Пример установки стороннего драйвера

cat README

cd install-dir/src/bh2_linux_driver
make modules
make modules_install

install -m 644 -D -t /lib/modules/$(uname -r)/extra bh2/bh2.ko
depmod


Как достать .config из рабочей системы:

https://wiki.gentoo.org/wiki/Kernel/IKCONFIG_support
https://wiki.gentoo.org/wiki/Kernel/Configuration/ru
загружаем модуль config ( часто включено по умолчанию)
modprobe configs 
после этого действия появится фай /proc/config.gz
Вот так его можно сохранить 
zcat /proc/config.gz > .config
Просто почитать его можно так:
less /proc/config.gz

Патчи на ядро:

Для применения патча используйте команду patch. 
Например, для применения патча 0001-arch-arm64-dts-lx2162-add-som-and-solidnet-device-tr.patch выполните следующую команду:
patch -p1 < 0001-arch-arm64-dts-lx2162-add-som-and-solidnet-device-tr.patch

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

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

Соберите ядро:
После применения патча можно приступить к сборке ядра. 
Обычно это делается с помощью следующих команд:
make menuconfig   # Настройка конфигурации ядра
make              # Сборка ядра
make modules_install
make install

Патчи на ядро скрипт:


#!/bin/bash
# Переменная с директорией, где находятся патчи
PATCH_DIR="./patches"

# Перейдите в каталог с исходным кодом ядра
cd linux

# Применение каждого патча в каталоге
for patch in $PATCH_DIR/*.patch; do
    echo "Применяем патч $patch"
    patch -p1 < "$patch"
    if [ $? -ne 0 ]; then
        echo "Ошибка при применении патча $patch"
        exit 1 # Иногда патч может быть уже применен и тогда скрипт тоже завершится 
               # Можно закомментировать "exit 1" и смотреть по случаю
    fi
done

echo "Все патчи применены успешно"


Еще один вариант применения патчей

Перейдем в каталог в котором будем производить сборку:
cd /usr/src

Патчи на ядро брать тут:
git clone https://github.com/SolidRun/lx2160a_build.git

Ядро и применять патчи вот так:
git clone --depth 1 https://github.com/nxp-qoriq/linux -b LSDK-21.08

Перейдем в скаченный каталог:
cd linux

Докинем конфиг:
cp ../lx2160a_build/configs/linux/lx2k_additions.config arch/arm64/configs/

Выполним слияние конфигов:                                  
./scripts/kconfig/merge_config.sh arch/arm64/configs/defconfig arch/arm64/configs/lsdk.config arch/arm64/configs/lx2k_additions.config 

Применяем патчи:
git am  ../lx2160a_build/patches/linux-LSDK-21.08/*.patch
Рубрики
kernel \ source \ пакеты \ исходники

Установка программ и сборка программ \ make \ install \ configure \ checkinstall

Лист

1 Зачем мне (не)нужно собирать программу из исходников ?
2 Как собрать программу из исходников? Как установить программу из tar.gz/tar.bz2?
3 Как удалить программу, собранную из исходников?
4 Почему после ручной сборки из исходников у программ получается большой размер?
5 Что прописать в настройках rpm, чтобы для всех собираемых программ выполнялся strip?
6 Что делать если configure говорит, что XXX не установлен, а на самом деле он установлен?
7 Я поставил пакет XXX-dev/XXX-devel, а configure все равно говорит, что XXX не установлен
8 Как собрать rpm пакет из src.rpm (srpm)?
9 Помогите собрать ядро
10 Как собрать ядро из src.rpm? Как собрать собственное ядро из src.rpm?
11 Как накладывать патчи? Как накладывать патчи на ядро? (patch, diff)? Как убирать патчи?
12 Нужно ли накладывать промежуточные патчи на ядро?
13 При сборке ядра make menuconfig ругается, что ncurses не установлен.
14 Зачем собирать модули? Почему бы не сделать монолит?
15 Как правильно собрать Gnome из исходников?
16 Как собрать KDE из исходников?
17 Что делать если программа не имеет скрипта configure?
18 Я не успеваю прочитать все сообщения на экране. Похоже там какие-то ошибки
19 Как запустить, протестировать, посмотреть программу до установки ее в систему ?
20 Как запустить программу не устанавливая её, сразу же после компиляции ?
21 Что такое сборка с обратной связью (FDO/PGO/LWP) ?
22 Как на 64-битной ОС собирать для 32-битной ?

1) Зачем мне (не)нужно собирать программу из исходников ?

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

2) Как собрать программу из исходников? Как установить программу из tar.gz/tar.bz2?

Скорее всего в tar.gz/tar.bz2 лежит не программа, а ее исходники. Прежде чем ее поставить, необходимо ее собрать. 
Для этого нужно выполнить (не бросайтесь сразу это делать):

user@linux$ tar zxf program.tar.gz # или tar jxf program.tar.bz2. А еще можно воспользоваться графическими средствами, в gnome и kde они есть
user@linux$ cd program # переходим в образовавшийся каталог с исходниками
user@linux$ ./configure # тут можно передать некоторые параметры сборки, см ./configure --help
user@linux$ make # компилируем
root@linux# make install # устанавливаем предварительно получив права root командой su. 

Либо используем sudo, что в принципе более правильно, а в некоторых дистрибутивах это еще и единственный способ (например Ubuntu)
Поскольку при таком способе установки информация о том, что ставилось и куда, остается только в памяти 
админа (которая частенько еще какая временная :), лучше для контроля этого процесса использовать checkinstall 
или похожие программы (почему выше и мы говорили не выполнять команды сразу). После того, как вы, прочитав документацию,
установите ее и настроите конфиг, на этапе установки программного обеспечения вместо make install будете писать checkinstall. 
Checkinstall соберет "настоящий" пакет для указанной (tgz, rpm и deb в зависимости от настроек), установит его в систему 
и поместит в указанный в конфигурационном файле каталог (удобно для централизованного обновления нескольких машин). 
Удаление установленных таким образом программ осуществляется стандартными средствами дистрибутива, 
например, removepkg для Slackware или dpkg для Debian/Ubuntu.

В rpm-based дистрибутивах собирайте программы из srpm или с использованием spec-файлов (для создания rpm). 
Не превращайте свою систему в помойку. В Slackware программы легко и непринуждённо собираются с помощью простого скрипта SlackBuild. 
Да и в потомках Debian'a тоже есть штатная система сборки программ в дистрибутивные пакеты и лучше пользоваться ей.


checkinstall -D

 

3) Как удалить программу, собранную из исходников?

Это неоднозначный вопрос. Дело в том, что если вы просто собрали программу с помощью ./configure && make && make install, 
то все зависит лишь от того, позаботился ли автор об удалении.

Для того, чтобы удалить программу, нужно зайти в каталог ее исходников, из которого она собиралась, и сделать make uninstall. 
Если каталог не сохранился, распакуйте исходники, запустите ./configure с теми же параметрами, с которыми собирали программу, 
и выполните make uninstall. 
А чтобы не полагаться на приличия автора, рекомендуется посмотреть предыдущий вопрос.

4) Почему после ручной сборки из исходников у программ получается большой размер?

По умолчанию программы собираются с отладочной информацией. 
Это, соответственно, увеличивает их размер, но на быстродействие и занимаемую оперативную память не влияет.
Можно собрать программу без отладочной информации, 
указав соответствующий ключ - ./configure --disable-debug
Удалить секции с отладочной информацией из уже собранной программы можно командой strip progfile. 
Посмотреть, что вышло можно командой file progfile, она напишет - stripped или not stripped.
А можно сделать более правильно:
root@linux# find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 
root@linux# find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded
 

5) Что прописать в настройках rpm, чтобы для всех собираемых программ выполнялся strip?

Создаем файл /etc/rpm/macros с таким содержанием:

%debug_package %{nil}
%_missing_doc_files_terminate_build 0
%_unpackaged_files_terminate_build 0
%__os_install_post    \
        /usr/lib/rpm/redhat/brp-compress \
        /usr/lib/rpm/redhat/brp-strip %{__strip} \
        /usr/lib/rpm/redhat/brp-strip-shared %{__strip} \
        /usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \
        /usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \
%{nil}
В будущем при смене версии rpm, не придется ничего править в самих макросах из rpm.
 

6) Что делать если configure говорит, что XXX не установлен, а на самом деле он установлен?

Для сборки нужны заголовочные файлы (headers). Во многих дистрибутивах библиотеки 
и программы поделены на два пакета - foo и foo-devel (Fedora, Mandriva) или foo-dev (Debian, Ubuntu). 
Соответственно нужно поставить foo-devel (foo-dev). 
Иногда надо вручную запустить ldconfig чтобы увиделись свежи установленные библиотеки.
Примечание: в пакетах Slackware почти всё вместе.
 

7) Я поставил пакет XXX-dev/XXX-devel, а configure все равно говорит, что XXX не установлен

Бывает так, что configure находит пакет XXX, но при попытке использовать файлы из него 
(в частности, собрать тестовую программу с заголовочными файлами из пакета) происходит какая-нибудь ошибка. 
configure не может точно определить, что происходит, и считает, что пакет просто не установлен.

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

8) Как собрать rpm пакет из src.rpm (srpm)?

В зависимости от дистрибутива rpm --rebuild название_пакета.src.rpm или rpmbuild --rebuild название_пакета.src.rpm
Кроме того ALT'овцы рекомендуется не собирать пакеты на работающей системе, а использовать hasher

Если вместо ожидаемого результата, на экран выводится список параметров командной строки, 
нужно установить rpm-devel. Ну а если все получилось, то пакеты будут лежать 
в /usr/src/название_дистрибутива/BUILD/название_архитектуры_процессора, например /usr/src/redhat/BUILD/i386.
 

9) Помогите собрать ядро

Помогаем:
http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html - хорошая, свежая документация
http://www.linuxcenter.ru/lib/articles/system/kernel26_install.phtml - русское пошаговое описание для новичков
http://kernel.xc.net/ - архив параметров ядра, разница между разными версиями
Если у вас rpm-based дистрибутив, то тогда прочитайте следующий вопрос.
 

10) Как собрать ядро из src.rpm? Как собрать собственное ядро из src.rpm?

Поскольку у меня (jackill) Fedora, то рассматривать мы будем именно ядра этого дистрибутива. 
Для других дистрибутивов чуть-чуть будут отличаться пути в /usr/src и, возможно, названия spec-файлов.
Самый простой случай
Мы скачали пакет вида kernel-2.x.x-1.xxx.src.rpm. Нас устраивает конфигурация по умолчанию,
но не устраивает сборка под i386.
Поэтому пишем:
root@linux# rpmbuild --rebuild --target=i686 
и забираем готовый пакет из /usr/src/redhat/RPMS/i686
Собираем собственное ядро
Распакуем srpm:
root@linux# rpm -i kernel-2.x.x-1.xxx.src.rpm
Далее перейдем в каталог /usr/src/redhat/SPECS и распакуем сами исходники, наложив при этом все патчи:
root@linux# rpmbuild -bp --target=i686 kernel-2.x.spec
Теперь переходим в каталог /usr/src/redhat/BUILD/kernel-2.x/linux-2.6, 
это исходники ядра с соответствующим конфигом. 
Здесь выполним две команды:

root@linux# make oldconfig
root@linux# make menuconfig
Теперь мы можем выставить желаемые параметры. В качестве помощи можете воспользоваться этим разделом. 
Я обычно включаю поддержку NTFS, выбираю свой тип процессора, убираю поддержку 4ГБ памяти, 
ставлю соответствующие параметры для samba, а если машина в домене MS Windows 2003, 
то добавляю поддержку CIFS, а лишнее убиваю.

После того, как вы закончили выставлять параметры, мы переименовываем наш файл конфигурации .config, 
например в kernel-2.6.8-i686.config и переписываем в каталог /usr/src/redhat/SOURCES.

Далее в kernel-2.x.spec выставляем какое нам нужно собрать ядро (обычное или smp), 
нужно ли собирать пакет с исходниками и пакет с документацией:

Summary: The Linux kernel (the core of the Linux operating system)

# What parts do we want to build?  We must build at least one kernel.
# These are the kernels that are built IF the architecture allows it.

%define buildup 1
%define buildsmp 0
%define buildsource 1
%define builddoc 0
После делаем как обычно.

Если нужно добавить патч

Алгоритм простой:
Накладываем этот патч на распакованные исходники, конфигурируем ядро, переписываем так же получившийся конфиг, 
затем прописываем патч в kernel.spec (в двух местах: в одном сам патч, например Patch10002: 
vesafb-tng-0.9-rc4-r3-2.6.9-rc3.patch, во втором способ его наложения, например, 
Patch10002 -p1 - все увидите и сделаете по аналогии).

Если после этого на сборке ядро вылетает, придется сделать make oldconfig для всех файлов конфигурации (
повод научиться писать скрипты ;), или убить все конфиги, кроме нужного вам, 
после чего повторить сборку.
Правда все просто?
 

11) Как накладывать патчи? Как накладывать патчи на ядро? (patch, diff)? Как убирать патчи?

Вообще было бы неплохо просто сделать man patch и все стало бы ясно (кстати, сделайте). 
А как накладывать патчи на ядро написано в самом README к ядру. Тем не менее.
Несжатый патч:
patch -p1 < my_patch.patch
p1 - уровень. Т.е. я захожу в каталог, где непосредственно находятся нужные мне файлы, 
копирую туда патч и оттуда запускаю эту команду. p0 - нулевой уровень вложенности
Сжатый патч. Это патчи вида mypatch.gz и mypatch.bz2, соответственно:

bzip2 -dc mypatch.bz2 | patch -p0
или

gzip -cd mypatch.gz | patch -p0
Чтобы откатить патч, нужно добавить в команду ключик -R

Или можно проще

bzcat mypatch.bz2 | patch -p0
или

zcat mypatch.gz | patch -p0
 

12) Нужно ли накладывать промежуточные патчи на ядро?

Есть ядро версии 2.6.6. Нужно получить ядро 2.6.9. Нужно ли накладывать ли patch-2.6.7 и patch-2.6.8? Нужно.
Есть ядро версии 2.6.17.3. Нужно получить ядро 2.6.17.5. Надо откатится обратно до 2.6.17 (patch -p1 -R) 
и наложить патч до 2.6.17.5
 

13) При сборке ядра make menuconfig ругается, что ncurses не установлен.

Установите ncurses-devel или как он там называется в вашем дистрибутиве.
 

14) Зачем собирать модули? Почему бы не сделать монолит?

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

15) Как правильно собрать Gnome из исходников?

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

16) Как собрать KDE из исходников?

В первую очередь убедитесь что у Вас установлены достаточно новые версии пакетов Qt , soprano, akonadi, boost , 
также могут потребоваться (для плазмоидов) Google Gadgets, для графического пакета потребуется exiv2, 
для pim (почтовый клиент, адресная книга и.т.п) - gpg, gpgme,

Большую часть исходников для предзависимостей КДЕ (KDE4) можно скачать с SVN командой
svn co svn://anonsvn.kde.org/home/kde/tags/kdesupport-for-4.3/kdesupport
Также Вам потребуется cmake

Порядок сборки - kdelibs , kdepimlibs , kdebase-runtime , kdebase-workspace , 
все остальные пакеты можно собирать в произвольном порядке.
собирается достаточно тривиально:
распаковываем пакет
tar -xvf kdelibs-4.3.2.tar.gz
создаем папку для сборки внутри распакованой папки
cd kdelibs-4.3.2
mkdir builddir
конфигурируем с помощью cmake , обязательным аргументом является путь к исходникам, в данном случае ..
cmake ..
команда cmake в отличие от ./configure воспринимает параметры в виде -DCMAKE_INSTALL_PREFIX=/usr (например вместо --prefix=/usr), 
можно также воспользоваться ccmake или cmake-gui
дальше обычная сборка (-j2 - использовать два потока сборки, для четырех ядерных процессоров можно задавать -j4 и так далее)
make -j2
после чего можно установить собранные программы с помощью
make install или make install DESTDIR=/путь/установки для последующего создания пакета
 

17) Что делать если программа не имеет скрипта configure?

Часто бывает так, что исходный код, загруженный из систем контроля версий не содержит скрипта configure. 
Иногда его нет и в обычных тарболлах, но есть autogen.sh. Запускаем сначала его, а потом при необходимости - ./configure. 
Если же отсутствует и он, но есть файлы configure.ac, Makefile.am, Makefile.in., то можно сделать так - autoreconf -v --install

Возможно, что программа использует другую систему сборки, например, scons или qmake (в случае qmake в исходниках будут присутствовать файлы .pro). 
Если используется cmake , то присутствует CMakeLists.txt и конфигурирование осуществляется командой cmake . 
(путь к исходникам обязателен, в случае если Вы собираете в корне распакованных исходников текущий путь указывается просто точкой, 
впрочем, некоторые программы Вам это сделать не дадут и попросят создать отдельный каталог.)
Читайте документацию, она рулит, скорее всего всё, что нужно, написано в README.

18) Я не успеваю прочитать все сообщения на экране. Похоже там какие-то ошибки

Во время компиляции или запуска различных команд на экране быстро появляется множество различных сообщений, ошибок.
Их трудно, почти невозможно прочитать, сохранить.
Для решения этой проблемы воспользуйтесь командой "script".
script
./configure
make
exit
В текущем каталоге появится файл typescript. 
Он будет содержать все сообщения которые появлялись на экране. 
Также можно использовать программу tee.
 

19) Как запустить, протестировать, посмотреть программу до установки ее в систему ?

Данное решение работает для множества программ, но не для всех.
Программу можно установить в каталог $HOME/usr. Для этого вместо команды "make install" воспользуйтесь командой
mkdir $HOME/usr
make install DESTDIR=$HOME/usr
Далее нужно изменить файл $HOME/.bash_profile добавив в него эти строки :

export PATH=\
$PATH:\
$HOME/usr/bin:\
$HOME/usr/local/bin:\
$HOME/usr/sbin:\
$HOME/usr/local/sbin

export LD_LIBRARY_PATH=\
$LD_LIBRARY_PATH:\
$HOME/usr/lib:\
$HOME/usr/local/lib

export MANPATH=\
$MANPATH:\
$HOME/usr/man:\
$HOME/usr/share/man:\
$HOME/usr/local/man:\
$HOME/usr/local/share/man

export INFOPATH=\
$INFOPATH:\
$HOME/usr/info:\
$HOME/usr/share/info:\
$HOME/usr/local/info:\
$HOME/usr/local/share/info

export PYTHONPATH=\
$PYTHONPATH:\
$HOME/usr/lib/python2.6/site-packages:\
$HOME/usr/local/lib/python2.6/site-packages

export PKG_CONFIG_PATH=\
$PKG_CONFIG_PATH:\
$HOME/usr/lib/pkgconfig:\
$HOME/usr/local/lib/pkgconfig

export C_INCLUDE_PATH=\
$C_INCLUDE_PATH:\
$HOME/usr/include:\
$HOME/usr/local/include

export CPLUS_INCLUDE_PATH=\
$CPLUS_INCLUDE_PATH:\
$HOME/usr/include:\
$HOME/usr/local/include

export LDFLAGS="\
-L$HOME/usr/lib \
-L$HOME/usr/local/lib \
$LDFLAGS"
После этого вам нужно перелогиниться в систему.

Будет доступен вызов программ, программы смогут найти свои библиотеки, 
можно будет вызывать их страницы man, info.
 

20) Как запустить программу не устанавливая её, сразу же после компиляции ?

Если программа при запуске требует библиотеки из других каталогов, 
то для этого скомпилированный elf-файл программы и её библиотеки положите в один каталог.
В этой папке создайте такой файл для запуска программы :
#!/bin/sh
export PATH=\
`pwd`:\
$PATH

export LD_LIBRARY_PATH=\
`pwd`:\
$LD_LIBRARY_PATH

./program_name
 

21) Что такое сборка с обратной связью (FDO/PGO/LWP) ?

Современные компиляторы (GCC => 4.3 или Intel C/C++) позволяют использовать автоматическое профилирование 
(в отличие от ручного (с помощью gprof например) поиска наиболее интенсивно нагружающих процессор функций и их переписывания более оптимальным образом), 
такая оптимизация называется оптимизацией с обратной связью (feedback directed optimization - FDO), 
легковесным профилированием (LWP - lightweight profiling, в отличие от "тяжеловесного" с помощью gprof и переписывания кода), 
оптимизацией ведомой профилем (PGO - profile guided optimization). Процедура состоит из 3 фаз, 
одна из которых может являться интерактивной, т.е. требующей действий от пользователя.

Этап 1: Сборка инструментированных бинарных файлов

Используются ключи компилятора -fprofile-gen (GCC) или -prof-gen (ICC) , целевые бинарные файлы будут содержать много служебного кода, 
который будет использоваться для сбора статистики во время выполнения программы, инструментированные бинарные файлы имеют низкую производительность сгенерированного кода.

Этап 2: Интерактивная фаза сбора статистики

Программа устанавливается обычным образом (или в отдельный префикс) и используется пользователем, 
во время работы программы собирается статистика промахов в кеш процессора, использования или неиспользования функций, 
переменных и так далее. В эту фазу важно постараться использовать программу максимальным образом, например и кодирование 
и декодирование разных форматов в случае с медиа кодеками, компрессию и декомпрессию с разными опцииями в случае архиваторов, 
использовать все пункты в меню и открыть все типы документов в случае программы с графическим интерфейсом, для неиспользованных 
функций информация по профилю собрана не будет. Файлы статистики обычно пишутся в каталог с файлами исходного кода или можно 
(например для Gentoo portage, при использовании стандартых ebuild'ов) 
задавать каталог с помощью ключей -fprofile-dir=путь (GCC) или -prof-dir путь (для ICC) на первом этапе.

Этап 3: Пересборка программы с учетом собранной статистики

Производится очистка собраных объектных файлов и пересборка с использованием собраной статистики, 
используются ключи компилятора -fprofile-use (GCC) или -prof-use (ICC), результирующие бинарные файлы обычно 
имеют максимально достигаемую с помощью опций компилятора оптимизацию под процессор. В случае с Mozilla Firefox 3.6 
оптимизация сборкой под процессор Intel Pentium IV повышает производительность в тестах Peacekeeper на 10%, 
в случае использования FDO получаем еще 10%, т.е. суммарное ускорение по тестам достигает 20%, неплохой результат не так ли?

Что говорит против использования FDO для сборки программ ?
Сборка длительна и трудоемка, возможно требует активных действий от пользователя.

GCC достаточно плохо реагирует на коллизии в статистике возникающие 
при многопоточности (или просто нескольких одновременных запусках) программы.

И наконец, какой ужас! Собранные бинарные файлы будут привязаны к типу процессора (конвееру, размеру кешей, 
конкретным ключам сборки, например -mfpmath=sse) , что может проявиться снижением производительности 
на других процессорах, особенно с меньшим кешем, типом конвеера (in order execution на Intel Atom например), 
что существенно ограничивает распространение собранных данным методом программ.

Многие алгоритмы уже были отпрофилированы авторами кода вручную, и некоторые даже переписаны на язык assembler, 
поэтому не удивляйтесь , если потратив уйму времени на профилирование вашего любимого медиа-кодека вы получите прирост менее 1% .

Какие пакеты поддерживают легкую сборку с профилированием?

Mozilla Firefox (make profiledbuild), существует также PKGBUILD для Arch Linux и (в багзилле) ebuild для Gentoo

x264 (make fprofiled VIDS="список файлов") интерактивная фаза тут не требует вмешательства пользователя,
кодек будет отпрофилирован на указанных пользователем файлах с использованием различных настроек кодирования и декодирования.

GCC (make profiledbootstrap) в процессе сборки GCC будет собран backend 
компилирующий код на C на 7% быстрее , чем без профилирования (для ветки 4.5 пока не работает)

Другие пакеты вам придется собирать по описанной выше трехэтапной схеме,
 вручную меняя CFLAGS, CXXFLAGS
 

22) Как на 64-битной ОС собирать для 32-битной ?

Обмануть автоматическое определение архитектуры помогает утилита setarch, вызвать ее можно как i386 
для установления 32-битности ОС. После вызова нужно заново задать переменные окружения, 
не забудьте и про добавление -m32 в флаги компилятора , а также другие значения, 
например --libdir=/usr/lib32 для ./configure (если ваша система содержит 32 битные библиотеки в /lib32)
 
Рубрики
kernel \ source \ пакеты \ исходники

kernel / usb / blacklist / make

 
1. Чем ядро из дистрибутива Debian отличается от “ванильного” ядра с kernel.org?
Во-первых, оттуда могут быть удалены части, которые не вписываются в DFSG - приложения о том, 
что есть действительно свободное ПО с точки зрения политики Debian. 
При этом люди, которые поддерживают пакет ядра Debian стараются сделать изменения между ванильным и дистрибутивным ядром минимальными. 
Кроме того, среди дистрибутивных ядер нередко можно найти уже готовые ядра со специально наложенными патчами vserver или xen.
Отдельно патчи можно получить, установив пакет linux-patch-debian-версия.
Подробнее о том, что изменяется в ядре можно почитать здесь, здесь и здесь.


2. Некоторые соглашения относительно названий и назначения пакетов, которые относятся к ядру Linux в составе дистрибутива.
Ядро Linux (не забывайте, что Debian портирован и на некоторые другие ядра, 
например Free или NetBSD или даже Hurd) собирается из пакета исходных текстов linux-версия.
В результате получаются независимые от архитектуры пакеты:
linux-source-версия - содержит исходные тексты ядра с уже наложенными патчами от Debian.
linux-manual-версия - содержит страницы руководства (man) по API ядра.
linux-doc-версия - содержит документацию ядра
linux-patch-debian-версия - содержит патчи, наложенные на ванильные исходные тексты ядра, чтобы получить linux-source-версия.
linux-tree-версия - это просто пакет, зависящий от других пакетов, необходимых для сборки ядра. 
Его установка повлечет за собой установку в систему всех необходимых пакетов (в том числе исходных текстов), 
нужных для сборки ядра нужной версии.
linux-support-версия-имяABI - содержит файлы для поддержки сборки сторонних модулей для ядра указанной версии и ABI.

Ну и зависимые от архитектуры пакеты:
linux-headers-версия-имяABI - заголовочные файлы ядра. Также могут быть дополнены разновидностями типа bigmem/smp/что-то еще.
linux-image-разновидность - специальный пакет, притягивающий в виде зависимостей последнюю версию ядра определенного типа. 
Например linux-image-alpha-smp. Возможны и варианты linux-image-главная_версия-разновидность 
для установки определенной линейки ядер (2.4 или 2.6).
linux-image-верися-архитектура-разновидность - образ ядра определенной версии для определенной архитектуры.

3. Сборка ядра
Как уже стало ясно, получить исходные тексты ядра Debian можно путем установки соответствующего пакета, например:
# aptitude install linux-source-2.6.24
После этого нужно перейти в каталог /usr/src/ и распаковать полученный тарболл с исходными текстами:
# cd /usr/src
# tar xf linux-source-2.6.24.tar.bz2
Затем нужно перейти в директорию с исходными текcтами ядра:
# cd linux-source-2.6.24

Теперь ядро необходимо сконфигурировать перед сборкой 
(иначе зачем мы его вообще собираем собирать самостоятельно?).
Сделать это можно любым доступным способом:
make config - через простой текстовый интерфейс
make oldconfig - используя старый конфигурационный файл ядра
make menuconfig - используя ncurses интерфейс
make xconfig - используя графический интерфейс.
По окончанию конфигурации мы готовы собирать ядро в пакет.
Для этого прежде всего требуется утилита make-kpkg, 
предназначенная как раз для этого. 
Она содержится в пакете kernel-package:

# aptitude install kernel-package
# make-kpkg clean
# make-kpkg –initrd kernel-image
либо, если хочется добавить дополнительную “ревизию” к версии ядра -
# make-kpkg –initrd –revision=10.0 kernel-image
или даже “разновидность”
# make-kpkg –initrd –append-to-version=k7 kernel-image
То же самое с помощью make-kpkg можно проделать и используя оригинальное ядро с kernel.org.
В результате в директории уровнем выше появится пакет linux-image-версия, который можно без опаски устанавливать 
с помощью dpkg -i - ядро будет автоматически установлено и даже прописано в меню загрузчика.

4. Сборка дополнительных модулей для ядра.
Сюда относятся разнообразные драйверы устройств и файловых систем, не включенные в дерево исходных текстов ядра.
Для их установки желательно пользоваться утилитой module-assistant, особенно если их исходные тексты уже включены в репозитарий дистрибутива.

# m-a a-i nvidia-kernel

Как пример, эта команда вызовет установку пакета nvidia-kernel-source последней доступной версии, 
сборку пакета с модулем для текущего ядра и его автоматическую установку. 
Для этого потребуется только пакет linux-headers той же версии, что и текущее ядро.

Модули ядра:

 
lsmod - Показать все модули загруженные в ядро
modprobe isdn - Загрузить модуль (в данном случае isdn)
modinfo module_name - показать информацию о модуле
systool -v -m module_name - вывести список опций, с которыми загружен модуль
modprobe -c | less - отобразить настройки для всех модулей
modprobe -c | grep module_name -  отобразить настройки для отдельного модуля
modprobe --show-depends module_name - узнать зависимости модуля (или его псевдонима), включая сам модуль
modprobe module_name - загрузка модуля
modprobe -r module_name - выгрузка модуля

Отмена загрузки модуля (драйвера):

nano /etc/modprobe.d/blacklist.conf
blacklist snd_hda_intel - отключить драйвер звука intel
blacklist snd-usb-audio - отключить драйвер usb звука
blacklist nouveau - отключить драйвер nvidia

Перезагрузка USB порта без перезагрузки системы:

modprobe -r usbhid - отключаем
modprobe usbhid - включаем 

Перезагрузка USB порта без перезагрузки системы,
Внешние накопители (диски, флешки):

modprobe -r usb-storage - отключаем
modprobe usb-storage - включаем 

Перезагрузка USB порта без перезагрузки системы,

lsusb - смотрим общую информацию о том какое устройство к какому порту подключено
lsusb -t - древовидный вид подключения. Здесь видно какой драйвер используется
lsusb -v -s 4:1 | grep iSerial - определяем адрес устройства, где параметр -s содержит номер bus:device
echo -n «0000:00:1d.0» | tee /sys/bus/pci/drivers/ehci-pci/unbind - отключам устройство ehci-pci
echo -n «0000:00:1d.0» | tee /sys/bus/pci/drivers/ehci-pci/bind - подключаем устройство ehci-pci

Сборка ядра(компиляция):

 
cd /usr/src/linux - переходим в каталог с исходниками ядра
make mrproper - Очистка, включая файлы конфигурации
make oldconfig - Повторно использовать старые конфиги, если есть 
make menuconfig - xconfig (Qt) или gconfig (GTK)
make - Создание сжатого образа ядра
make modules - Компиляция модулей
make modules_install - Установка модулей
make install - Установка ядра
reboot
Рубрики
kernel \ source \ пакеты \ исходники

kernel \ modules \ модули ядра

Информация uname

Команда uname дает множество интересной информации о вашей системе. 
Вот пример вывода на моей рабочей машине, после того, как я набрал uname -a, 
что говорит команде uname напечатать всю имеющуюся информацию:

$ uname -a
Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 AMD Athlon(tm) XP 2100+ AuthenticAMD GNU/Linux

Подробнее о uname
Теперь, давайте посмотрим, какую же информацию о системе может дать uname
тип информации             аргумент   пример
имя ядра                   -s         "Linux"
имя хоста                  -n         "inventor"
релиз ядра                 -r         "2.4.20-gaming-r1"
версия ядра                -v         "#1 Fri Apr 11 18:33:35 MDT 2003"
архитектура                -m         "i686"
процессор                  -p         "AMD Athlon(tm) XP 2100+"
платформа                  -i         "AuthenticAMD"
операционная система       -o         "GNU/Linux"
Интригующе! А что напечатает uname -a у вас?

Релиз ядра uname -r

А теперь небольшой трюк. 
Для начала выполните uname -r чтобы программа напечатала релиз ядра, которое работает в данный момент.
Теперь посмотрите в директорию /lib/modules и — опа! — Я уверен, что вы обнаружили каталог с точно таким же именем! 
OK, никакой магии, теперь самое время поговорить о значении каталогов в /lib/modules, а также объяснить, что такое модули ядра.

Ядро

Ядро Linux это сердце того, что обычно называют «Linux» — это кусок кода, который напрямую 
взаимодействует с вашим железом и абстрагирует от него обычные программы. 
Благодаря ядру, вашему текстовому редактору не нужно беспокоиться на какой диск, SCSI или IDE, а может даже в RAM, он производит запись. 
Редактор просто записывает в файловую систему, а ядро заботится обо всем остальном.

Введение в модули ядра

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

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

Модули ядра вкратце lsmod

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

lsmod
Для просмотра загруженных модулей на вашей 
системе используйте команду lsmod:
# lsmod
Module                  Size  Used by    Tainted: PF
vmnet                  20520   5
vmmon                  22484  11
nvidia               1547648  10
mousedev                3860   2
hid                    16772   0  (unused)
usbmouse                1848   0  (unused)
input                   3136   0  [mousedev hid usbmouse]
usb-ohci               15976   0  (unused)
ehci-hcd               13288   0  (unused)
emu10k1                64264   2
ac97_codec              9000   0  [emu10k1]
sound                  51508   0  [emu10k1]
usbcore                55168   1  [hid usbmouse usb-ohci ehci-hcd]

Список модулей

Как видите, на моей системе загружено достаточно немного модулей. vmnet и vmmon модули, 
обеспечиваю необходимую функциональность для VMWare Workstation, 
которая позволяет мне запускать виртуальные машины в окне рабочего стола. 
Модуль nvidia выпущен NVIDIA corporation и позволяет использовать 3D-ускорение в Linux.

Дальше у меня есть набор модулей, которые используются для поддержки USB устройств ввода — mousedev, hid, usbmouse, input, usb-ohci, ehci-hcd и usbcore. 
Имеет смысл сконфигурировать ваше ядро для поддержки USB модулей. 
Почему? Потому что USB девайсы это «plug and play» (подключай и работай) девайсы и если у вас есть поддержка USB в модулях, 
вы можете спокойно пойти и купить новое USB устройство, подключить его, и ваша система автоматически загрузит соответствующие модули для этого устройства. 
Это удобный способ сделать что-то.

Сторонние модули

Завершают этот список модули: emu10k1, ac97_codec и sound, которые вместе обеспечиваю поддержку моей звуковой карты Audigy.
Следует отметить, некоторые из моих модулей доступны прямо в исходниках ядра. 
Например, все USB-модули были скомпилированы из стандартных исходных текстов ядра Linux. 
Однако, nvidia, emu10k1 и VMWare-модули были получены из других источников. 
Это подчеркивает другую важную особенность модулей ядра — возможность сторонних производителей добавлять необходимую 
функциональность в ядро и включать ее прямо в запущенное ядро. 
Без перезагрузки.

depmod и компания

В моей папке /lib/modules/2.4.20-gaming-r1/, есть несколько файлов которые начинаются со строки «modules.»:
$ ls /lib/modules/2.4.20-gaming-r1/modules.*
/lib/modules/2.4.20-gaming-r1/modules.dep
/lib/modules/2.4.20-gaming-r1/modules.generic_string
/lib/modules/2.4.20-gaming-r1/modules.ieee1394map
/lib/modules/2.4.20-gaming-r1/modules.isapnpmap
/lib/modules/2.4.20-gaming-r1/modules.parportmap
/lib/modules/2.4.20-gaming-r1/modules.pcimap
/lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap
/lib/modules/2.4.20-gaming-r1/modules.usbmap

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

Как получить модули

Некоторые модули ядра разработаны для работы со специальными устройствами, как например emu10k1 — модуль для поддержки моей звуковой карты. 
Для этого типа модулей, приведенные выше файлы включают также информацию о PCI IDs и прочие идентификационные метки оборудования, которое они поддерживают. 
Эта информация может быть  использована различными скриптами, например «hotplug» (который мы рассмотрим в следующих руководствах)
для автоматического определения оборудования и загрузки соответствующих модулей.

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

Информация о зависимостях может становиться не актуальной, особенно в случае установки новых модулей. 
Чтобы ее обновить, просто введите depmod -a. 
Программа depmod просканирует модули из вашей папки /lib/modulesи обновит информацию о зависимостях. 
Она делает это сканируя модули в /lib/modules и проверяя так называемые «symbols» внутри модулей.

Расположение модулей ядра

Итак, как выглядят модули ядра? Для ядра 2.4, все файлы модулей обычно находятся в /lib/modules и имеют имя оканчивающееся на ".o" (для 2.6 ".ko" — прим. ред.). 
Чтобы увидеть все модули из /lib/modules, введите следующее:
# find /lib/modules -name '*.o'
/lib/modules/2.4.20-gaming-r1/misc/vmmon.o
/lib/modules/2.4.20-gaming-r1/misc/vmnet.o
/lib/modules/2.4.20-gaming-r1/video/nvidia.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o
[список обрезан для краткости]

insmod vs. modprobe

Итак, как же подгрузить модуль в работающее ядро? 
Один из вариантов, использовать команду
insmod и указать ей полный путь к модулю, 
который вы хотите загрузить:
# insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
# lsmod | grep fat
fat                    29272   0  (unused)

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

rmmod и modprobe в действии

Давайте выгрузим наш модуль fat.o и загрузим его обратно используя modprobe:
# rmmod fat
# lsmod | grep fat
# modprobe fat
# lsmod | grep fat
fat                    29272   0  (unused)

Как видите, работа команды rmmod очень похожа на работу modprobe, 
но имеет противоположный эффект — она выгружает указанный модуль.

Ваши помощники modinfo и modules.conf

Можете воспользоваться командой modinfo, 
чтобы узнать пару интересных вещей о своих любимых модулях:
# modinfo fat
filename:    /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
description: 
author:      
license:     "GPL"

Также обратите внимание на файл /etc/modules.conf. 
Он содержит настройки для modprobeи позволяет изменять поведение modprobe. 
Например, указывать какие модули загруть до/после загрузки остальных, запускать скрипты до и после загрузки модуля, и многое другое.

Структура modules.conf

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

Во-первых, многие дистрибутивы генерируют этот файл автоматически из набора файлов в других директориях, таких как /etc/modules.d/. 
Например, в Gentoo Linux есть такая папка, и запуск команды update-modules прочитает все файлы из /etc/modules.d/ и объединит их в новый /etc/modules.conf. 
Поэтому, сделав свои изменения в файлах из /etc/modules.d/ запустите update-modules, если вы используете Gentoo. 
В Debian, процедура очень похожа, за исключением того, что папка называется /etc/modutils/.

Для ядер версии 2.6 аналогичные по функциональности файл и папка из каталога etc называются modprobe.conf и modprobe.d соответственно. 
Синтаксис там упрощен, смотрите man modprobe.conf
Рубрики
kernel \ source \ пакеты \ исходники

kernel / компиляция ядра

www.kernel.org
tar xvf lilnux-X.X.X-rcX.tar.gz
make oldconfig — сценарий, который устанавливает значения по умолчанию без нашего ведома
make config — сценарий, который в командном интерпретаторе задает вам вопросы о параметрах будущего ядра и в зависимости от ваших ответов формирует конфигурационный файл для компиляции
make menuconfig — текстовая утилита. Наиболее удобный вариант конфигурирования из консоли
make xconfig — графическая утилита Наиболее удобный вариант конфигурирования ядра из графической оболочки Linux (qconf)
Рубрики
kernel \ source \ пакеты \ исходники

Компилирование программ

Информация:

Для компилирования и установки программ нужны три команды, которые иногда называются «три в одном»: 
./configure, make и make install (далее они будут описаны более подробно).
При этом должен быть открыт каталог с исходным кодом.

Сценарий configure:

 Это сценарий, который проверяет, доступны ли все необходимые программы и библиотеки. 
Поскольку сценарий находится в локальной папке, его нужно выполнять в виде ./configure. 
Этот сценарий адаптирует файл Makefile, содержащий все команды, для компилирования и компоновки различных файлов кода. 

!!!В некоторых (обычно небольших) программах configure может отсутствовать. 
!!!В таком случае сразу выполняйте make.

./configure

Команда make:

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

make

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

Команда make install:

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

Перед выполнением make install следует убедиться, что нужная программа еще не установлена!
В ином случае ее предварительно потребуется деинсталлировать.

make install

Команда uninstall:

Удаление собранной программы

make uninstall 

Возможные проблемы:

При компилировании программ могут возникать разнообразные проблемы. 
Чаще всего они связаны с отсутствием каких-либо вспомогательных компилирующих инструментов или библиотек. 
Как правило, такие проблемы идентифицирует уже configure и устранить их совсем не сложно — нужно просто установить недостающий пакет.

Ситуация осложняется, когда configure требует библиотеку, которая недоступна в вашем дистрибутиве, 
либо у вас нет необходимой версии этой библиотеки. 

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

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

Рубрики
kernel \ source \ пакеты \ исходники

Пакеты с исходным кодом

Пакеты с исходным кодом для Debian:

В дистрибутивах, построенных на основе Debian, исходный код находится в нескольких файлах, 
которые нужно установить в текущий каталог с помощью команды apt-get source.

cd /opt
apg-get source имя_пакета

Теперь в текущем каталоге вы найдете три новых файла и один каталог:
имя_пакета.dsc содержит краткое описание пакета;
имя_пакета.orig.tar.gz содержит TAR-архив с первоначальным исходным кодом, написанным разработчиком программы;
имя_пакета.diff.gz включает в себя все изменения оригинального исходного кода, характерные для Debian или Ubuntu;
новый каталог имя_пакета/ содержит информацию, уже извлеченную из имя_пакета.diff.gz, причем все изменения из DIFF-файла уже выполнены.

Рубрики
kernel \ source \ пакеты \ исходники

Библиотеки и запуск программ

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

Кроме того, компоновщик интерпретирует файл /etc/ld.so.cache. 
Это двоичный файл, содержащий всю важную информацию о библиотеке (номера версий, пути доступа и т. д.). 
Он нужен только для того, чтобы сэкономить время, которое компоновщик в противном случае потратил бы на поиск библиотек.

Файл /etc/ld.so.cache создается программой ldconfig, которая, в свою очередь, интерпретирует /etc/ld.so.conf. 
В этом файле обычно содержится список всех библиотечных каталогов 
или список ссылок на другие файлы с каталогами.

Каталоги /lib и /usr/lib учитываются в любом случае и поэтому отсутствуют в ld.so.conf или других конфигурационных файлах. 
Если кроме /lib и /usr/lib не придется учитывать никаких каталогов, то ld.so.conf можно вообще опустить.

В некоторых дистрибутивах команда ldconfig выполняется при каждом запуске компьютера, 
чтобы гарантировать максимально обновленное состояние файла кэша. 
Ее всегда нужно выполнять в тех случаях, когда вы вручную устанавливаете новую библиотеку, иначе система не увидит библиотек.
Если библиотеки находятся в новом каталоге, нужно соответствующим образом дополнить файл /etc/ld.so.conf. 
При установке пакетов с библиотеками эти задачи обычно выполняет менеджер пакетов.

32- и 64-битные библиотеки:

Большинство распространенных дистрибутивов в настоящее время существуют как минимум в двух вариантах сборки: 
для 32-битных процессоров, совместимых с Intel/AMD, и для 64-битных процессоров, совместимых с Intel/AMD. 
Разумеется, для 32-битных процессоров предусмотрены только 32-битные библиотеки. 

Однако, к сожалению, того же нельзя сказать о 64-битных дистрибутивах: 
были и остаются программы, которые не компилируются для 64-битных систем. 
Наиболее известная программа такого рода — Acrobat Reader компании Adobe.

/lib и /lib64. 
Для выполнения 32-битных программ в 64-битных дистрибутивах вам потребуются 32-битные библиотеки. 
Чтобы можно было избежать конфликтов, библиотеки устанавливаются в различные каталоги. 
Среди-профессионалов в Linux этот метод называется мулътиархитектура, или биархитектура, 
так как параллельно поддерживается несколько (или две) архитектуры процессоров. 

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