Технология сборки пакетов RPM: различия между версиями

Материал из ALT Linux Wiki
 
(не показаны 33 промежуточные версии 6 участников)
Строка 1: Строка 1:
{{Тимовец| ruslandh | Автор статьи }}


{{Тимовец| ruslandh | Автор статьи }}


== Классическая сборка пакетов rpm ==
== Классическая сборка пакетов rpm ==
Прежде всего, всем советую прочесть [https://alt-packaging-guide.github.io Новое "Руководство по сборке RPM-пакетов для дистрибутивов Альт"]


Классическая сборка пакета '''rpm'''  состоит из следующих этапов :
Во многом эта статья повторяет статью [[Сборка_пакета_с_нуля]], и возможно со временем их надо объединить.


Во многом эта статья повторяет статью [[Сборка_пакета_с_нуля]], и возможно со временем иx надо обЪединить
Классическая сборка пакета '''rpm'''  состоит из следующих этапов:


=== Нахождение исходного текста пакета ===
=== Нахождение исходного текста пакета ===


Обычно мы находим исходный текст программы. Обычно исходный текст программы можно получить на официальном сайте программы.
Обычно мы находим исходный текст программы. Часто исходный текст программы можно получить на официальном сайте программы.


Это может быть готовы архив в виде tar, упакованный каким-нибудь компрессором, типа gzip, bzip и т.п..
Это может быть готовый архив в виде tar, упакованный каким-нибудь компрессором, типа gzip, bzip и т.п.
Так-же это может быть репозиторий git, cvs , меркурий и т.п.
Также, это может быть репозиторий git, cvs, меркурий и т.п.


В любом случае мы получаем каталог с текстом программы и инструкцией, как можно программу собрать.
В любом случае мы получаем каталог с текстом программы и инструкцией, как можно программу собрать.


Отдельным источником можно назвать пакет src.rpm или deb-src из другого дистрибутива.
Отдельным источником можно назвать пакет src.rpm или deb-src из другого дистрибутива.
В этом случае можно "подсмотреть как собирают пакеты другие" этот пакет.
В этом случае можно «подсмотреть» как собирают этот пакет другие.


На этом этапе надо понять как в принципе собирается данный пакет.
На этом этапе надо понять как в принципе собирается данный пакет.
Строка 25: Строка 25:
=== Написание инструкции сборки пакета ===
=== Написание инструкции сборки пакета ===


Хорошая статья, как писать spec файл [[Spec |   Руководство по написанию спек файла для rpm]]
Хорошая статья, как писать spec-файл<ref>Для совсем начинающих две ссылкм
* [http://www.tldp.org/HOWTO/RPM-HOWTO/ RPM-HOWTO]
* [https://www.opennet.ru/docs/HOWTO-RU/RPM-HOWTO-48.html RPM-HOWTO перевод на русский]</ref>
[[Spec | Руководство по написанию спек файла для rpm]]. И ещё одна: [[Общие_правила_написания_спек_файлов_в_ALT_Linux]].


На втором этапе, зная алгоритм сборки пакета, мы записываем алгоритм в виде '''spec'''-файла.
На втором этапе, зная алгоритм сборки пакета, мы записываем алгоритм в виде '''spec'''-файла.


Сборку пакета из исходников можно разделить на следующие основные этапы :
Сборку пакета из исходников можно разделить на следующие основные этапы:


* Распаковка исходного текста пакета и наложение патчей на него (например, исправляющие makefile пакета, чтобы он собирался не куда-нибудь в '''/opt''', а каталог предназначенный для сборки пакета).
* распаковка исходного текста пакета и наложение патчей на него (например, исправляющие makefile пакета, чтобы он собирался не куда-нибудь в {{path|/opt}}, а каталог предназначенный для сборки пакета) (секция '''%prep''');
(секция '''%prep''')


* Компиляция и линковка программ пакета (секция '''%build''')
* компиляция и линковка программ пакета (секция '''%build''');


* Размещение программ в каталог, который будет упаковываться в rpm (секция '''%install''')
* размещение программ в каталог, который будет упаковываться в rpm (секция '''%install''');


* Написание скриптов  нестандартных действий, которые выполняться при установке и удалении пакета (секции '''%post''' и '''%postust''')
* написание скриптов  нестандартных действий, которые выполняются при установке и удалении пакета (секции '''%post''' и '''%postust''');


* Сама упаковка пакета и проверка его "правильности" (верификация пакета).
* сама упаковка пакета и проверка его «правильности» (верификация пакета).


Для тренировки сборки пакета, советую попробовать взять готовый пакет [https://git.altlinux.org/gears/h/hello.git], готовый src.rpm можно взять из репозитория, Например из Сизифа  
Для тренировки сборки пакета, советую попробовать взять готовый пакет [https://git.altlinux.org/gears/h/hello.git], готовый src.rpm можно взять из репозитория, например из Сизифа  
(ссылка скоро может устареть,в случае смены версии пакета) [http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm]
(ссылка скоро может устареть, в случае смены версии пакета) [http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm].


=== Непосредственная сборки пакета ===
=== Непосредственная сборка пакета ===


Полезная ссылка для начинающего [[Сборка_пакетов_(etersoft-build-utils) | Краткая инструкция по сборке пакетов с помощью etersoft-build-utils ]]  
Полезная ссылка для начинающего [[Сборка_пакетов_(etersoft-build-utils) | Краткая инструкция по сборке пакетов с помощью etersoft-build-utils]].


Кстати, для генерации основы spec-файла, установите пакет '''genspec''' , запустите скрипт '''gensprec''' и ответьте на вопросы.
Кстати, для генерации основы spec-файла, установите пакет {{pkg|genspec}}, запустите скрипт {{cmd|gensprec}} и ответьте на вопросы. А скрипт из пакета {{pkg|github2spec}} умеет создавать полный gear репозиторий для сборки пакета.


После того, как вы написали спек и подготовили исходники, можно переходить непосредственно к сборке пакета.
После того как вы написали спек и подготовили исходники, можно переходить непосредственно к сборке пакета.


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


Каждому этапу сборки можно привести опцию rpm, которая это выполняет:
Каждому этапу сборки можно привести опцию rpm, которая это выполняет:
Строка 59: Строка 61:
* '''Распаковка исходника  (секция %prep)''':
* '''Распаковка исходника  (секция %prep)''':


  '''rpmbuild -bp имя_спек_файла.spe'''c
  '''rpmbuild -bp имя_спек_файла.spec'''


* '''Компиляция и линковка программ (сборка) пакета (секция %build)'''
* '''Компиляция и линковка программ (сборка) пакета (секция %build)''':


  '''rpm -bc имя_спек_файла.spec'''
  '''rpm -bc имя_спек_файла.spec'''
Строка 69: Строка 71:
  '''rpm -bc --short-circuit  имя_спек_файла.spec'''
  '''rpm -bc --short-circuit  имя_спек_файла.spec'''


разница состоит в том, что если запустить с ключом -bc, то rpm заново повторит распаковку пакета , а потом уже начнёт компиляцию. Если вы собираете пакет первый раз,по шагам, то вы могли внести в исходный текст пакета исправления, которые можно потом оформить в патчи, то распаковка исходников заново уничтожит ваши исправления.
разница состоит в том, что если запустить с ключом -bc, то rpm заново повторит распаковку пакета, а потом уже начнёт компиляцию. Если вы собираете пакет первый раз по шагам, то вы могли внести в исходный текст пакета исправления, которые можно потом оформить в патчи, то распаковка исходников заново уничтожит ваши исправления.


* '''Установка пакета в заданный каталог  (%install)'''
* '''Установка пакета в заданный каталог  (%install)''':
   
   
  '''rpm -bi --short-circuit  имя_спек_файла.spec'''
  '''rpm -bi --short-circuit  имя_спек_файла.spec'''


* '''Создание непосредственно самого пакета rpm (и src.rpm)'''
* '''Создание непосредственно самого пакета rpm (и src.rpm)''':


  '''rpm -ba --short-circuit  имя_спек_файла.spec'''
  '''rpm -ba --short-circuit  имя_спек_файла.spec'''


* '''Упаковка src.rpm пакета'''
* '''Упаковка src.rpm пакета''':
   
   
  '''rpm -bs - имя_спек_файла.spec'''
  '''rpm -bs - имя_спек_файла.spec'''


Для ключа '''bs''' не требуется параметр '''--short-circuit''' , так как он непосредственно упаковывает ваши исходники и патчи в src.rpm, не выполняя действий по распаковке, компиляции и установке пакета.
Для ключа '''bs''' не требуется параметр '''--short-circuit''', так как он непосредственно упаковывает ваши исходники и патчи в src.rpm, не выполняя действий по распаковке, компиляции и установке пакета.


=== Пример классической сборки пакета ===
=== Пример классической сборки пакета ===


Для всех примеров мы будем использовать пакет hello. Он есть и в репозитории и в git.altlinux.org [https://git.altlinux.org/gears/h/hello.git  https://git.altlinux.org/gears/h/hello.git]  
Для всех примеров мы будем использовать пакет {{pkg|hello}}. Он есть и в репозитории и в git.altlinux.org [https://git.altlinux.org/gears/h/hello.git  https://git.altlinux.org/gears/h/hello.git].


Готовый src.rpm мохно взять их сорцов Сизифа [http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm  http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm] - ссылка может устареть с выходом новой версии пакета, поэтому текущую версию пакета, всегда можно найти здесь : [https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/  https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/ ]  
Готовый src.rpm можно взять их сорцов Сизифа [http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm  http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm] ссылка может устареть с выходом новой версии пакета, поэтому текущую версию пакета, всегда можно найти здесь: [https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/  https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/ ]  


Допустим, мы скачали '''hello-2.10-alt1.1.src.rpm''' , от имени пользователя устанавливаем его от имени пользователя:
Допустим, мы скачали {{pkg|hello-2.10-alt1.1.src.rpm}}, устанавливаем его от имени пользователя:


'''rpm -ihv путь_до_каталога_с_файлом/hello-2.10-alt1.1.src.rpm
  $ '''rpm -ihv путь_до_каталога_с_файлом/hello-2.10-alt1.1.src.rpm
'''
'''
В результате в каталоге пользователя ~/RPM/SPEC/<ref>в '''.rpmmacros'''  прописаны стандартные для ALT пути:
В результате в каталоге пользователя {{path|~/RPM/SPEC/}}<ref>в '''.rpmmacros'''  прописаны стандартные для ALT пути:


  %_topdir        %homedir/RPM
  %_topdir        %homedir/RPM
Строка 101: Строка 103:
  %_tmppath      %homedir/tmp
  %_tmppath      %homedir/tmp


</ref> появвляется файл  '''hello.spec''', а в '''~/RPM/SOURCE''' файл '''hello-2.10.tar.gz'''
</ref> появляется файл  '''hello.spec''', а в {{path|~/RPM/SOURCE}} файл '''hello-2.10.tar.gz'''.


Теперь зайдем в каталог '''~/RPM/SPEC'''/ и изучим содержание файла spec:
Теперь зайдем в каталог {{path|~/RPM/SPEC/}} и изучим содержание файла spec:


Шапка пакета - его описание, лицензия, откуда можно скачать исходник, или домашняя страница проекта, параметр '''BuildRequires''' указывает какой "нестандартный" пакет требуется для сборки:
Шапка пакета его описание, лицензия, откуда можно скачать исходник, или домашняя страница проекта, параметр '''BuildRequires''' указывает какой «нестандартный» пакет требуется для сборки:


<source lang=txt>
<syntaxhighlight lang="ini">
Name: hello
Name: hello
Version: 2.10
Version: 2.10
Строка 127: Строка 129:
would otherwise be unavailable to them.  Because it is protected by the
would otherwise be unavailable to them.  Because it is protected by the
GNU General Public License, users are free to share and change it.
GNU General Public License, users are free to share and change it.
</source>
</syntaxhighlight>


Описание распаковки исходников и наложение патчей (Этап '''rpmbuild -bp'''):
Описание распаковки исходников и наложение патчей (этап '''rpmbuild -bp'''):
<source lang=txt>
<syntaxhighlight lang="ini">
%prep
%prep
%setup -a0bp
%setup -a0
</source>
</syntaxhighlight>
Распаковывается первый исходник (Source - hello-2.10.targz) в каталог:
'''~/RPM/BUILD/hello-2.10'''


Распаковывается первый исходник (Source — hello-2.10.targz) в каталог {{path|~/RPM/BUILD/hello-2.10}}.


Этап построения пакета (этап '''rpm -bc --short-circuit'''), выполняются команды {{cmd|autoreconf}}, {{cmd|configure}}, {{cmd|make}} с параметрами по умолчанию для сборки пакетов '''rpm''':


Этап построения пакета (этап '''rpm -bc --short-circuit'''), выполняются команды
<syntaxhighlight lang="ini">
 
'''autoreconf''', '''configure''', '''make''' с параметрами по-умолчанию для сборки пакетов '''rpm''' :
 
<source lang=txt>
%build
%build
%autoreconf
%autoreconf
%configure
%configure
%make_build
%make_build
</source>
</syntaxhighlight>


Этап перемещения пакетов в каталог упаковки ('''rpm -bi --short-circuit'''), выполняются команды  
Этап перемещения пакетов в каталог упаковки ('''rpm -bi --short-circuit'''), выполняются команды make install и поиск файлов перевода на различные языки:


make install и поиск файлов перевода на различные языки:
<syntaxhighlight lang="ini">
 
<source lang=txt>
%install
%install
%makeinstall
%makeinstall
%find_lang %name
%find_lang %name
</source>
</syntaxhighlight>


Перечень файлов, которые должны войти в пакет (этап '''rpm -ba --short-circuit'''):
Перечень файлов, которые должны войти в пакет (этап '''rpm -ba --short-circuit'''):
<source lang=txt>
<syntaxhighlight lang="ini">
%files -f %name.lang
%files -f %name.lang
%doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO
%doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO
Строка 169: Строка 164:
%_infodir/*
%_infodir/*
%_mandir/man?/*
%_mandir/man?/*
</source>
</syntaxhighlight>


Перечень людей пересобиравших пакет и изменения в пакете:
Перечень людей пересобиравших пакет и изменения в пакете:
<source lang=txt>
<syntaxhighlight lang="ini">
%changelog
%changelog
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
Строка 183: Строка 178:




</source>
</syntaxhighlight>


Расшифровку макросов входящих в spec файл, можно получить выдав команду<ref>нужно установить пакет '''rpm-utils'''</ref> :
Расшифровку макросов входящих в spec файл, можно получить выдав команду<ref>нужно установить пакет '''rpm-utils'''</ref>:


'''rpm -bE hello.spec'''
  $'''rpm -bE hello.spec'''


Теперь попробуем собрать пакет hello в вашем текущем бренче, даём команду:
Теперь попробуем собрать пакет {{pkg|hello}} в вашем текущем бранче, даём команду:


'''rpm -ba hello.spec'''
  $ '''rpm -ba hello.spec'''


Скорей всего в вам выскочит сообщение, что для сборки пакета, нужно установить пакет texinfo, для этого вам надо установить пакет texinfo
Скорей всего в вам выскочит сообщение, что для сборки пакета, нужно установить пакет {{pkg|texinfo}}:


'''apt-get install texinfo'''
  # '''apt-get install texinfo'''


Это просто для одного недостающего пакета, сложнее для установки "кучи" необходимых для сборки пакетов.
Это просто для одного недостающего пакета, сложнее для установки «кучи» необходимых для сборки пакетов.


Для этого можно применить интересный приём :
Для этого можно применить интересный приём:


* Собираем пакет src.rpm (если его у вас нет, или вы добавили в spec свои патчи) :
* Собираем пакет src.rpm (если его у вас нет, или вы добавили в spec свои патчи):


'''rpm -bs --nodeps hello.spec'''<ref>Дальше для простоты, я не буду указывать путь до файла, подразумевая, что вы предварительно перешли в каталог с файлом</ref>  
  $ '''rpm -bs --nodeps hello.spec'''<ref>Дальше для простоты, я не буду указывать путь до файла, подразумевая, что вы предварительно перешли в каталог с файлом</ref>  


результат сборки вы увидите в ~/RPM/SRPMS/
результат сборки вы увидите в {{path|~/RPM/SRPMS/}}.


Далее настраиваем свой конфиг apt, что-бы он умел ставить пакеты, необходимые для сборки пакета указываем, где лежат пакеты src.rpm.
Далее настраиваем свой конфиг apt, что-бы он умел ставить пакеты, необходимые для сборки пакета указываем, где лежат пакеты src.rpm.


Например, у меня локальное зеркало Сизифа с источниками установки прописаны в файле  
Например, у меня локальное зеркало Сизифа с источниками установки прописаны в файле {{path|/etc/apt/sources.list.d/10-local.list}} c следующим содержанием:


'''/etc/apt/sources.list.d/10-local.list''' c следующим содержанием:
<syntaxhighlight lang="ini">
 
<source lang=txt>
# local (ALT Linux)
# local (ALT Linux)


Строка 222: Строка 215:
rpm-src  [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic
rpm-src  [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic


</source>
</syntaxhighlight>


Тогда можно установить пакеты, необходимые для сборки пакета hello, командой :
=== Установка пакетов, необходимых для сборки ===


'''apt-get build-dep hello.src.rpm'''
Тогда можно установить пакеты, необходимые для сборки пакета {{pkg|hello}}, одной из команд:
 
<syntaxhighlight lang="bash">$ rpmgp -i hello.src.rpm</syntaxhighlight>
(требуется установить {{pkg|etersoft-build-utils}})
 
<syntaxhighlight lang="bash"># apt-get build-dep hello.src.rpm</syntaxhighlight>
(сейчас не работает) <ref>смотри {{altbug|}}</ref>


== Сборка внутри хэшера ==
== Сборка внутри хэшера ==


Описанный выше способ сборки пакета, как уже описано выше, имеет один существенный недостаток - в живую систему приходится  
Описанный выше способ сборки пакета, как уже описано выше, имеет один существенный недостаток в живую систему приходится устанавливать пакеты, не нужные в обычной жизни, например для сборки пакета {{pkg|hello}}, требуется пакет {{pkg|texinfo}}.


устанавливать пакеты, не нужные в обычной жизни, например для сборки пакета hello, требуется пакет texinfo.
Для сборки внутри хэшера, надо установить и настроить пакет [[hasher]], кратко смотри  [[Hasher/Краткое_руководство | Hasher быстрый старт]], [[Hasher/FAQ | Hasher Faq]].
 
Для сборки внутри хэшера, надо установить и настроить пакет [[hasher]], кратко смотри  [[Hasher/Краткое_руководство | Hasher быстрый старт]], [[Hasher/FAQ | Hasher Faq ]].


=== Классическое использование хэшера ===
=== Классическое использование хэшера ===
Строка 240: Строка 237:
Классическое использование хэшера, это запуск его командой:
Классическое использование хэшера, это запуск его командой:


'''hsh путь/имя.src.rpm
  $ hsh путь/имя.src.rpm


Возьмём для примера наш hello...src.rpm
Возьмём для примера наш hello...src.rpm


Для начала настроим работу хэшера
Для начала настроим работу хэшера:


* установим hasher   
* установим hasher<ref># - это не комментарий, а знак что для выполнения  команды apt-get  нужно получить права [[root |root]] </ref>:  
   
   
# apt-get install hasher <ref># - это не комментарий, а знак что для выполнения команды apt-get  нужно получить права [[root |root]] </ref>
<syntaxhighlight lang="bash"># apt-get install hasher</syntaxhighlight>   
 
*  добавим аккаунты псевдопользователей для работы с хэшером:
*  добавим аккаунты псевдопользователей для работы с хэшером:


# hasher-useradd имя_вашего_пользователя
<syntaxhighlight lang="bash"># hasher-useradd имя_вашего_пользователя</syntaxhighlight>


* создадим окружение для работы хэшера:
С версии 2.0 пакета hasher-priv (бренча <= p10 не касается) нужно запустить сервис hasher-privd:


В домашнем каталоге пользователя создаём каталог, имя которого начинается с точки:
<syntaxhighlight lang="bash"># systemctl enable --now hasher-privd.service</syntaxhighlight>


$ cd <ref> $ - это знак, что команду cd надо выполнять вашим обычным пользователем </ref>
* создадим окружение для работы хэшера:
$ mkdir .hasher
 
$ cd  .hasher
 
$ > config


$ mcedit config
В домашнем каталоге пользователя создаём каталог, имя которого начинается с точки <ref> $ — это знак, что команду {{cmd|cd}} надо выполнять вашим обычным пользователем </ref>:


В файле ~.hasher/config прописываются значения опций пользователя по-умолчанию. Эти опции можно изменить, указав их  
<syntaxhighlight lang="bash">$ cd$ mkdir .hasher
непосредственнр в самой команде вызова хэшера, например:
$ cd  .hasher
$ > config
$ mcedit config
</syntaxhighlight>
В файле {{path|~.hasher/config}} прописываются значения опций пользователя по умолчанию. Эти опции можно изменить, указав их непосредственно в самой команде вызова хэшера, например:


<source lang=text>
<syntaxhighlight lang="ini">


def_repo=/home/$HOME/hasher-repo
def_repo=/home/$USER/hasher-repo


install -d /tmp/private/$HOME/hasher
install -d /tmp/private/$HOME/hasher
Строка 287: Строка 281:
if [ ! `uname -m` = x86_64 ]; then def_target=i586; fi
if [ ! `uname -m` = x86_64 ]; then def_target=i586; fi


</source>
</syntaxhighlight>


Создаём файл ~/apt/apt.conf.s64 такого содержания :
Создаём файл {{path|~/apt/apt.conf.s64}} такого содержания:


<source lang=text>
<syntaxhighlight lang="ini">
Dir::Etc::main "/dev/null";
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::parts "/var/empty";
Строка 298: Строка 292:


RPM::Ignore { "vim-plugin-vimruby"; };
RPM::Ignore { "vim-plugin-vimruby"; };
</source>
</syntaxhighlight>


И файл apt/sources.list.s64, например такого содержания:
И файл {{path|apt/sources.list.s64}}, например, такого содержания:


<source lang=text>
<syntaxhighlight lang="ini">
rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64 classic gostcrypto
rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64 classic gostcrypto
rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64-i586 classic
rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64-i586 classic
rpm [p10] file:/mnt/Arhiv/Branch-p10/ noarch classic
rpm [p10] file:/mnt/Arhiv/Branch-p10/ noarch classic
</source>
</syntaxhighlight>


Здесь /mnt/Arhiv/Branch-p10/ - путь для локального репозитория p10
Здесь {{path|/mnt/Arhiv/Branch-p10/}} — путь для локального репозитория p10.


Создаем символьную ссылку на расположение хэшера (например так):
Создаем символьную ссылку на расположение хэшера, например, так:


ln -fs  /tmp/private/$USER/hasher /home/$USER/hasher
<syntaxhighlight lang="ini">$ ln -fs  /tmp/private/$USER/hasher /home/$USER/hasher</syntaxhighlight>
   
   
И теперь запускаем саму сборку в хэшере, заходим в каталог с файлом и даём команду:
И теперь запускаем саму сборку в хэшере, заходим в каталог с файлом и даём команду:


  hello-2.10-alt1.1.src.rpm
<syntaxhighlight lang="ini">$  hsh hello-2.10-alt1.1.src.rpm</syntaxhighlight>
   
   
В результате этой команды внутри хэшера соберётся пакет hello-2.10-alt1.1.x86_64.rpm, который мы увидим (при приведённом выше конфиге)  
В результате этой команды внутри хэшера соберётся пакет {{pkg|hello-2.10-alt1.1.x86_64.rpm}}, который мы увидим (при приведённом выше конфиге)  
в ~/hasher_repo
в {{path|~/hasher_repo}}.
 
В качестве примера приведу команду сбора 32 разрядного приложения в хэшере на  64 - битной машине:


В качестве примера приведу команду сбора 32 разрядного приложения в хэшере на 64-битной машине:
   
   
$ setarch i586 hsh -v --apt-config=$HOME/apt/apt.conf.s32  $HOME/hasher
<syntaxhighlight lang="ini">$ setarch i586 hsh -v --apt-config=$HOME/apt/apt.conf.s32  $HOME/hasher</syntaxhighlight>


 
где apt/apt.conf.s32 описание 32 битного репозитория.
apt/apt.conf.s32 - описание 32 битного репозитория


=== Использование хэшера как изолированной среды сборки ===
=== Использование хэшера как изолированной среды сборки ===


То есть для сборки пакета hello, со своими патчами, мы можем собрать свою версию src.rpm командой
То есть для сборки пакета {{pkg|hello}}, со своими патчами, мы можем собрать свою версию src.rpm командой:


  $ '''rpm -bs hello.spec'''
<syntaxhighlight lang="ini">$ rpm -bs hello.spec</syntaxhighlight>


И дальше собираем свой вариант hello:
И дальше собираем свой вариант hello:


  $ '''hsh hello-2.10-alt1.1.src.rpm'''
<syntaxhighlight lang="ini">$ hsh hello-2.10-alt1.1.src.rpm</syntaxhighlight>


Но гораздо интереснее, использовать хэшер на этапе изучения пакета.
Но гораздо интереснее, использовать хэшер на этапе изучения пакета.
Устанавливаем "чистый" хэшер:
Устанавливаем "чистый" хэшер:


  $ '''hsh --initroot --pkg-build-list=+mc,rpm-utils'''
<syntaxhighlight lang="ini">$ hsh --initroot --pkg-build-list=+mc,rpm-utils</syntaxhighlight>


Кладём в hasher/in нужные исходники, заходим внутрь хэшера:
Кладём в hasher/in нужные исходники, заходим внутрь хэшера:


  $ '''hsh-shell --mount=/dev/pts shell=mc'''
<syntaxhighlight lang="ini">$ hsh-shell --mount=/dev/pts shell=mc</syntaxhighlight>


Теперь копируем эти файлы в /usr/src/RPM/BUILD хэшера, и начинаем экспериментировать со сборкой пакета.
Теперь копируем эти файлы в {{path|/usr/src/RPM/BUILD}} хэшера, и начинаем экспериментировать со сборкой пакета.


Расположив спек в /src/RPM/SPECS, а исходники в /src/RPM/SOURCE , можно внутри хэшера собирать пакеты "классическим" способом.
Расположив спек в {{path|/src/RPM/SPECS}}, а исходники в {{path|/src/RPM/SOURCE}}, можно внутри хэшера собирать пакеты «классическим» способом.


Для установки пакета внутрь пакета, нужно выйти из хэшера:
Для установки пакета внутрь пакета, нужно выйти из хэшера:


  $ '''exit'''
<syntaxhighlight lang="ini">$ exit</syntaxhighlight>


и дать команду:
и дать команду:


  $ '''hsh-install имя_пакета'''
<syntaxhighlight lang="ini">$ hsh-install имя_пакета</syntaxhighlight>


== Сборка с использованием инструментов работы с git репозиториями ==
== Сборка с использованием инструментов работы с git репозиториями ==
Строка 365: Строка 357:
Для работы с ними и для сборки из них '''rpm''' существует пакет [[gear]].
Для работы с ними и для сборки из них '''rpm''' существует пакет [[gear]].


Для примера рассмотрим сборку пакета hello из git репозитория [https://git.altlinux.org/gears/h/hello.git https://git.altlinux.org/gears/h/hello.git]
Для примера рассмотрим сборку пакета hello из git репозитория [https://git.altlinux.org/gears/h/hello.git https://git.altlinux.org/gears/h/hello.git].


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


<source lang=bash>
<syntaxhighlight lang="bash">
$ mkdir My_Repo (не обязательно)
$ mkdir My_Repo (необязательно)
$ cd My_Repo   
$ cd My_Repo   
$ git clone  https://git.altlinux.org/gears/h/hello.git
$ git clone  https://git.altlinux.org/gears/h/hello.git
</source>
</syntaxhighlight>


Заходим в каталог hello и изучаем его.
Заходим в каталог hello и изучаем его.


<source lang=text>
<syntaxhighlight lang="bash">$ cd hello
$ cd hello


$ ls -al
$ ls -al
   
   
итого 24
итого 24
drwxr-xr-x  5 writer writer 4096 мая 15 19:58 .
drwxr-xr-x  5 writer writer 4096 мая 15 19:58 .
drwxr-xr-x 32 writer writer 4096 мая 15 19:58 ..
drwxr-xr-x 32 writer writer 4096 мая 15 19:58 ..
drwxr-xr-x  2 writer writer 4096 мая 15 19:58 .gear
drwxr-xr-x  2 writer writer 4096 мая 15 19:58 .gear
drwxr-xr-x  8 writer writer 4096 мая 15 19:58 .git
drwxr-xr-x  8 writer writer 4096 мая 15 19:58 .git
drwxr-xr-x 11 writer writer 4096 мая 15 19:58 hello
drwxr-xr-x 11 writer writer 4096 мая 15 19:58 hello
-rw-r--r--  1 writer writer 1680 мая 15 19:58 hello.spec
-rw-r--r--  1 writer writer 1680 мая 15 19:58 hello.spec
</source>
</syntaxhighlight>


<source lang=bash>  
<syntaxhighlight lang="bash">  
$ cd .gear
$ cd .gear
$ cat rules  
$ cat rules  
tar.gz: hello
tar.gz: hello
</source>
</syntaxhighlight>


Правило tar.gz: hello , указывает, что каталог hello упаковывается в hello.tar.gz
Правило tar.gz: hello, указывает, что каталог hello упаковывается в hello.tar.gz.


Установим пакет gear.
Установим пакет {{pkg|gear}}:
   
   
# apt-get install gear
<syntaxhighlight lang="bash"># apt-get install gear</syntaxhighlight>


И дадим команду из каталога hello:
И дадим команду из каталога hello:
   
   
  $ gear-hsh  
<syntaxhighlight lang="bash">$ gear-hsh </syntaxhighlight>


И у нас в хэшере собирается пакет (для 64 битной архитектуры) hello-2.10-alt1.1.x86_64.rpm
И у нас в хэшере собирается пакет (для 64 битной архитектуры) {{pkg|hello-2.10-alt1.1.x86_64.rpm}}.
 
== Примечания ==
<references/>


== Ссылки ==
== Ссылки ==
Полезные ссылки:
Полезные ссылки:
* [http://www.tldp.org/HOWTO/RPM-HOWTO/ RPM-HOWTO]
* [https://www.opennet.ru/docs/HOWTO-RU/RPM-HOWTO-48.html RPM-HOWTO перевод на русский]
* [[Сборка_пакета_с_нуля]]
* [[Сборка_пакета_с_нуля]]
* [[О_стратегии_сборки_RPM_пакетов]]
* [[Spec  |  Руководство по написанию спек файла для rpm]]
* [[Spec  |  Руководство по написанию спек файла для rpm]]
* [[Сборка_пакетов_(etersoft-build-utils) | Краткая инструкция по сборке пакетов с помощью etersoft-build-utils ]]
* [[Сборка_пакетов_(etersoft-build-utils) | Краткая инструкция по сборке пакетов с помощью etersoft-build-utils ]]
* [[Краткое_руководство_по_сборке_с_gear]]
* [[Краткое_руководство_по_сборке_с_gear]]
* [[RPMMacrosDescription | Макросы RPM]]
* [[Git.alt/Путь_пакета_в_сизиф | Путь пакета в Cизиф]]
* [[Git.alt | Cервер совместной разработки ALT Linux Team]]
* [[Git.alt/FAQ | FAQ по работе с сервером совместной разработки ALT Linux Team]]
* [[git]]
* [[git]]
* [[gear]]
* [[gear]]
* [[hasher]]
* [[hasher]]
* [https://alt-packaging-guide.github.io Разрабатываемое новое "Руководство по сборке RPM-пакетов для дистрибутивов Альт"]


{{Category navigation|title=devel|category=devel|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=devel|category=devel|sortkey={{SUBPAGENAME}}}}
 
{{Category navigation|title=Сборка пакетов|category=Сборка пакетов|sortkey={{SUBPAGENAME}}}}
[[Категория:devel]][[Категория: Неоконченные страницы]][[Категория:RPM_spec]][[Категория:RPM]]

Текущая версия от 21:58, 30 августа 2024

Alt linux team.png Этот участник состоит в ALT Linux Team под ником ruslandh / ruslandh .

e-mail: [mailto: ruslandh @altlinux.org ruslandh @altlinux.org]



Классическая сборка пакетов rpm

Прежде всего, всем советую прочесть Новое "Руководство по сборке RPM-пакетов для дистрибутивов Альт"

Во многом эта статья повторяет статью Сборка_пакета_с_нуля, и возможно со временем их надо объединить.

Классическая сборка пакета rpm состоит из следующих этапов:

Нахождение исходного текста пакета

Обычно мы находим исходный текст программы. Часто исходный текст программы можно получить на официальном сайте программы.

Это может быть готовый архив в виде tar, упакованный каким-нибудь компрессором, типа gzip, bzip и т.п. Также, это может быть репозиторий git, cvs, меркурий и т.п.

В любом случае мы получаем каталог с текстом программы и инструкцией, как можно программу собрать.

Отдельным источником можно назвать пакет src.rpm или deb-src из другого дистрибутива. В этом случае можно «подсмотреть» как собирают этот пакет другие.

На этом этапе надо понять как в принципе собирается данный пакет.

Написание инструкции сборки пакета

Хорошая статья, как писать spec-файл[1] Руководство по написанию спек файла для rpm. И ещё одна: Общие_правила_написания_спек_файлов_в_ALT_Linux.

На втором этапе, зная алгоритм сборки пакета, мы записываем алгоритм в виде spec-файла.

Сборку пакета из исходников можно разделить на следующие основные этапы:

  • распаковка исходного текста пакета и наложение патчей на него (например, исправляющие makefile пакета, чтобы он собирался не куда-нибудь в /opt, а каталог предназначенный для сборки пакета) (секция %prep);
  • компиляция и линковка программ пакета (секция %build);
  • размещение программ в каталог, который будет упаковываться в rpm (секция %install);
  • написание скриптов нестандартных действий, которые выполняются при установке и удалении пакета (секции %post и %postust);
  • сама упаковка пакета и проверка его «правильности» (верификация пакета).

Для тренировки сборки пакета, советую попробовать взять готовый пакет [1], готовый src.rpm можно взять из репозитория, например из Сизифа (ссылка скоро может устареть, в случае смены версии пакета) [2].

Непосредственная сборка пакета

Полезная ссылка для начинающего Краткая инструкция по сборке пакетов с помощью etersoft-build-utils.

Кстати, для генерации основы spec-файла, установите пакет genspec, запустите скрипт gensprec и ответьте на вопросы. А скрипт из пакета github2spec умеет создавать полный gear репозиторий для сборки пакета.

После того как вы написали спек и подготовили исходники, можно переходить непосредственно к сборке пакета.

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

Каждому этапу сборки можно привести опцию rpm, которая это выполняет:

  • Распаковка исходника (секция %prep):
rpmbuild -bp имя_спек_файла.spec
  • Компиляция и линковка программ (сборка) пакета (секция %build):
rpm -bc имя_спек_файла.spec

или

rpm -bc --short-circuit  имя_спек_файла.spec

разница состоит в том, что если запустить с ключом -bc, то rpm заново повторит распаковку пакета, а потом уже начнёт компиляцию. Если вы собираете пакет первый раз по шагам, то вы могли внести в исходный текст пакета исправления, которые можно потом оформить в патчи, то распаковка исходников заново уничтожит ваши исправления.

  • Установка пакета в заданный каталог (%install):
rpm -bi --short-circuit  имя_спек_файла.spec
  • Создание непосредственно самого пакета rpm (и src.rpm):
rpm -ba --short-circuit  имя_спек_файла.spec
  • Упаковка src.rpm пакета:
rpm -bs - имя_спек_файла.spec

Для ключа bs не требуется параметр --short-circuit, так как он непосредственно упаковывает ваши исходники и патчи в src.rpm, не выполняя действий по распаковке, компиляции и установке пакета.

Пример классической сборки пакета

Для всех примеров мы будем использовать пакет hello. Он есть и в репозитории и в git.altlinux.org https://git.altlinux.org/gears/h/hello.git.

Готовый src.rpm можно взять их сорцов Сизифа http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/files/SRPMS/hello-2.10-alt1.1.src.rpm — ссылка может устареть с выходом новой версии пакета, поэтому текущую версию пакета, всегда можно найти здесь: https://packages.altlinux.org/ru/sisyphus/srpms/hello/rpms/

Допустим, мы скачали hello-2.10-alt1.1.src.rpm, устанавливаем его от имени пользователя:

 $ rpm -ihv путь_до_каталога_с_файлом/hello-2.10-alt1.1.src.rpm

В результате в каталоге пользователя ~/RPM/SPEC/[2] появляется файл hello.spec, а в ~/RPM/SOURCE файл hello-2.10.tar.gz.

Теперь зайдем в каталог ~/RPM/SPEC/ и изучим содержание файла spec:

Шапка пакета — его описание, лицензия, откуда можно скачать исходник, или домашняя страница проекта, параметр BuildRequires указывает какой «нестандартный» пакет требуется для сборки:

Name: hello
Version: 2.10
Release: alt1.1

Summary: GNU hello, THE greeting printing program
Group: Development/C
License: GPLv3+

Url: ftp://ftp.gnu.org/gnu/hello/

Source: %name-%version.tar.gz
# explicitly added texinfo for info files
BuildRequires: texinfo

%description
The GNU `hello' program produces a familiar, friendly greeting.  It
allows nonprogrammers to use a classic computer science tool which
would otherwise be unavailable to them.  Because it is protected by the
GNU General Public License, users are free to share and change it.

Описание распаковки исходников и наложение патчей (этап rpmbuild -bp):

%prep
%setup -a0

Распаковывается первый исходник (Source — hello-2.10.targz) в каталог ~/RPM/BUILD/hello-2.10.

Этап построения пакета (этап rpm -bc --short-circuit), выполняются команды autoreconf, configure, make с параметрами по умолчанию для сборки пакетов rpm:

%build
%autoreconf
%configure
%make_build

Этап перемещения пакетов в каталог упаковки (rpm -bi --short-circuit), выполняются команды make install и поиск файлов перевода на различные языки:

%install
%makeinstall
%find_lang %name

Перечень файлов, которые должны войти в пакет (этап rpm -ba --short-circuit):

%files -f %name.lang
%doc AUTHORS ChangeLog ChangeLog.O NEWS README THANKS TODO
%doc %name-%version
%_bindir/*
%_infodir/*
%_mandir/man?/*

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

%changelog
* Thu Dec 03 2015 Igor Vlasenko <viy@altlinux.ru> 2.10-alt1.1
- NMU: added BR: texinfo

......

* Thu Oct 23 2003 Andrey Rahmatullin <wrar@altlinux.ru> 2.1.1-alt1
- initial build

Расшифровку макросов входящих в spec файл, можно получить выдав команду[3]:

 $rpm -bE hello.spec

Теперь попробуем собрать пакет hello в вашем текущем бранче, даём команду:

 $ rpm -ba hello.spec

Скорей всего в вам выскочит сообщение, что для сборки пакета, нужно установить пакет texinfo:

 # apt-get install texinfo

Это просто для одного недостающего пакета, сложнее для установки «кучи» необходимых для сборки пакетов.

Для этого можно применить интересный приём:

  • Собираем пакет src.rpm (если его у вас нет, или вы добавили в spec свои патчи):
 $ rpm -bs --nodeps hello.spec[4] 

результат сборки вы увидите в ~/RPM/SRPMS/.

Далее настраиваем свой конфиг apt, что-бы он умел ставить пакеты, необходимые для сборки пакета указываем, где лежат пакеты src.rpm.

Например, у меня локальное зеркало Сизифа с источниками установки прописаны в файле /etc/apt/sources.list.d/10-local.list c следующим содержанием:

# local (ALT Linux)

rpm      [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64 classic gostcrypto
rpm      [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic
rpm      [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64-i586 classic
rpm-src  [p10] file:/mnt/Arhiv_ext/Branch-p10/ x86_64 classic
rpm-src  [p10] file:/mnt/Arhiv_ext/Branch-p10/ noarch classic

Установка пакетов, необходимых для сборки

Тогда можно установить пакеты, необходимые для сборки пакета hello, одной из команд:

$ rpmgp -i hello.src.rpm

(требуется установить etersoft-build-utils)

# apt-get build-dep hello.src.rpm

(сейчас не работает) [5]

Сборка внутри хэшера

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

Для сборки внутри хэшера, надо установить и настроить пакет hasher, кратко смотри Hasher быстрый старт, Hasher Faq.

Классическое использование хэшера

Классическое использование хэшера, это запуск его командой:

 $ hsh путь/имя.src.rpm

Возьмём для примера наш hello...src.rpm

Для начала настроим работу хэшера:

  • установим hasher[6]:
# apt-get install hasher
  • добавим аккаунты псевдопользователей для работы с хэшером:
# hasher-useradd имя_вашего_пользователя

С версии 2.0 пакета hasher-priv (бренча <= p10 не касается) нужно запустить сервис hasher-privd:

# systemctl enable --now hasher-privd.service
  • создадим окружение для работы хэшера:

В домашнем каталоге пользователя создаём каталог, имя которого начинается с точки [7]:

$ cd$ mkdir .hasher
$ cd  .hasher
$ > config
$ mcedit config

В файле ~.hasher/config прописываются значения опций пользователя по умолчанию. Эти опции можно изменить, указав их непосредственно в самой команде вызова хэшера, например:

def_repo=/home/$USER/hasher-repo

install -d /tmp/private/$HOME/hasher

ln -fs  /tmp/private/$HOME/hasher /home/$HOME/hasher

known_mountpoints=/dev/pts

lock_nowait=1

apt-config=$HOME/apt/apt.conf.s64

if [ ! `uname -m` = x86_64 ]; then def_target=i586; fi

Создаём файл ~/apt/apt.conf.s64 такого содержания:

Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::SourceParts "/var/empty";
Dir::Etc::sourcelist "/home/$USER/apt/sources.list.s64";

RPM::Ignore { "vim-plugin-vimruby"; };

И файл apt/sources.list.s64, например, такого содержания:

rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64 classic gostcrypto
rpm [p10] file:/mnt/Arhiv/Branch-p10/ x86_64-i586 classic
rpm [p10] file:/mnt/Arhiv/Branch-p10/ noarch classic

Здесь /mnt/Arhiv/Branch-p10/ — путь для локального репозитория p10.

Создаем символьную ссылку на расположение хэшера, например, так:

$ ln -fs  /tmp/private/$USER/hasher /home/$USER/hasher

И теперь запускаем саму сборку в хэшере, заходим в каталог с файлом и даём команду:

$  hsh hello-2.10-alt1.1.src.rpm

В результате этой команды внутри хэшера соберётся пакет hello-2.10-alt1.1.x86_64.rpm, который мы увидим (при приведённом выше конфиге) в ~/hasher_repo.

В качестве примера приведу команду сбора 32 разрядного приложения в хэшере на 64-битной машине:

$ setarch i586 hsh -v --apt-config=$HOME/apt/apt.conf.s32  $HOME/hasher

где apt/apt.conf.s32 — описание 32 битного репозитория.

Использование хэшера как изолированной среды сборки

То есть для сборки пакета hello, со своими патчами, мы можем собрать свою версию src.rpm командой:

$ rpm -bs hello.spec

И дальше собираем свой вариант hello:

$ hsh hello-2.10-alt1.1.src.rpm

Но гораздо интереснее, использовать хэшер на этапе изучения пакета. Устанавливаем "чистый" хэшер:

$ hsh --initroot --pkg-build-list=+mc,rpm-utils

Кладём в hasher/in нужные исходники, заходим внутрь хэшера:

$ hsh-shell --mount=/dev/pts shell=mc

Теперь копируем эти файлы в /usr/src/RPM/BUILD хэшера, и начинаем экспериментировать со сборкой пакета.

Расположив спек в /src/RPM/SPECS, а исходники в /src/RPM/SOURCE, можно внутри хэшера собирать пакеты «классическим» способом.

Для установки пакета внутрь пакета, нужно выйти из хэшера:

$ exit

и дать команду:

$ hsh-install имя_пакета

Сборка с использованием инструментов работы с git репозиториями

Git репозиторий, это удобное место для хранения исходного кода пакетов. Для работы с ними и для сборки из них rpm существует пакет gear.

Для примера рассмотрим сборку пакета hello из git репозитория https://git.altlinux.org/gears/h/hello.git.

Для начала склонируем git репозиторий в то место, где вы будете хранить свои рабочие исходники, например:

$ mkdir My_Repo (необязательно)
$ cd My_Repo  
$ git clone  https://git.altlinux.org/gears/h/hello.git

Заходим в каталог hello и изучаем его.

$ cd hello

$ ls -al
 
итого 24
drwxr-xr-x  5 writer writer 4096 мая 15 19:58 .
drwxr-xr-x 32 writer writer 4096 мая 15 19:58 ..
drwxr-xr-x  2 writer writer 4096 мая 15 19:58 .gear
drwxr-xr-x  8 writer writer 4096 мая 15 19:58 .git
drwxr-xr-x 11 writer writer 4096 мая 15 19:58 hello
-rw-r--r--  1 writer writer 1680 мая 15 19:58 hello.spec
 
$ cd .gear
$ cat rules 
tar.gz: hello

Правило tar.gz: hello, указывает, что каталог hello упаковывается в hello.tar.gz.

Установим пакет gear:

# apt-get install gear

И дадим команду из каталога hello:

$ gear-hsh

И у нас в хэшере собирается пакет (для 64 битной архитектуры) hello-2.10-alt1.1.x86_64.rpm.

Примечания

  1. Для совсем начинающих две ссылкм
  2. в .rpmmacros прописаны стандартные для ALT пути: %_topdir %homedir/RPM %_tmppath %homedir/tmp
  3. нужно установить пакет rpm-utils
  4. Дальше для простоты, я не буду указывать путь до файла, подразумевая, что вы предварительно перешли в каталог с файлом
  5. смотри bugzilla.altlinux.org
  6. # - это не комментарий, а знак что для выполнения команды apt-get нужно получить права root
  7. $ — это знак, что команду cd надо выполнять вашим обычным пользователем

Ссылки

Полезные ссылки: