четверг, 7 февраля 2013 г.

Развёртывание репозиториев Linux

В полуавтоматическом режиме

Опять же фиксация на добрую память. Без синхронизаций и т.д., в варианте «есть хостинг» или «файловая помойка» и надо быстро выкатить хранилище пакетов для дистрибутива Linux (так чтобы можно было подключиться к этому репозиторию и поставить оттуда всё необходимое). Иногда обновляться в ручном режиме — копированием по тому же адресу с перезаписью. Раз в полгода или год. Задача типовая и я её опишу в полуавтоматическом режиме.

Репозиторий RHEL


1. Создаём ключ RPM-GPG-KEY. Стандартно.
$ cd ~
$ gpg --gen-key
$ gpg --export -a 'Name Surname (repo)' > RPM-GPG-KEY
2. Создаём файл ~/.rpmmacros следующего содержания:
%_signature gpg
%_gpg_path ~/.gnupg
%_gpg_name Name Surname (repo)
3. Создаём директорию repo, а в ней директории i386, i686 и x86_64.
Переносим туда ключ RPM-GPG-KEY
$ mkdir -p repo repo/i386 repo/i686 repo/x86_64
$ mv RPM-GPG-KEY repo/RPM-GPG-KEY
4. Скачиваем и раскладываем по директориям пакеты для соответствующих архитектур. Для i386 и i686 в большинстве случаев будут идентичные пакеты. Для x86_64 может не существовать пакета (например, TeamViewer), в этом случае кладётся соответствующий пакет i686 и в большинстве случаев он в RHEL работает.

5. Кладём в директорию repo скрипт для подготовки репозитория.
#!/bin/sh

_repo1=i386
_repo2=i686
_repo3=x86_64

read -p "You really want to sign repositary? (y/n) " sign
if [[ "$sign" == "y" ]]; then
printf "\n* Signing Repositary *\n"
rpm --quiet --quiet --resign $_repo1/*.rpm
rpm --quiet --quiet --resign $_repo2/*.rpm
rpm --quiet --quiet --resign $_repo3/*.rpm
fi

printf "\n* Create repodata *\n"
rm -rf $_repo1/repodata $_repo2/repodata $_repo3/repodata
createrepo --no-database --simple-md-filenames $_repo1
createrepo --no-database --simple-md-filenames $_repo2
createrepo --no-database --simple-md-filenames $_repo3
6. Запускаем скрипт и отвечаем парольной фразой ключика на запрос.
$ chmod a+x
$ ./repo_rhel.sh
7. Закачиваем на хостинг директорию repo и описываем репозиторий в /etc/yum.repos.d/nobody.repo
[nobody]
name=nobody repo
baseurl=http://«IP-адрес»/repo/$basearch
gpgkey=http://«IP-адрес»/repo/RPM-GPG-KEY
enabled=1
gpgcheck=1
priority=1
8. Проверяем работу репозитория
# yum clean all
# yum list | grep nobody

Репозиторий Debian


1. Создаём ключ DEB-GPG-KEY. Стандартно.
$ cd ~
$ gpg --gen-key
$ gpg --export -a 'Name Surname (repo)' > DEB-GPG-KEY
2. Создаём файл ~/.rpmmacros следующего содержания:
%_signature gpg
%_gpg_path ~/.gnupg
%_gpg_name Name Surname (repo)
3. Создаём директорию repo, а в ней директории dists и pool. В них уже будет система каталогов.
Переносим туда ключ DEB-GPG-KEY
$ mkdir -p repo/dists/nobody/soft/binary-i386
$ mkdir -p repo/dists/nobody/soft/binary-x86_64
$ mkdir -p repo/pool/soft/binary-i386/t/teamviewer
$ mkdir -p repo/pool/soft/binary-x86_64/t/teamviewer
$ mv DEB-GPG-KEY repo/DEB-GPG-KEY
4. В директории dists у нас будут храниться данные о пакетах, а в директории pool - сами пакеты. Причём из имени /binary-i386/t/teamviewer уже видно, что пакеты раскладываются по архитектурам, затем по буквенным директориям и затем по директориям с именами происходящими от названия содержащегося в них ПО (в них может лежать десяток пакетов необходимых конкретному ПО по его зависимостям). Т.е. имеется заданная иерархия.

5. Кладём в директорию repo скрипт для подготовки репозитория. Меняем в первой строчке скрипта key_pass=«password» на пароль Вашего ключа.
#!/bin/sh
 
# password for DEB-GPG-KEY
key_pass="password"
 
_soft1=soft/binary-i386
_soft2=soft/binary-x86_64
p_soft1=dists/nobody/soft/binary-i386/Packages
p_soft2=dists/nobody/soft/binary-x86_64/Packages
 
# i386
dpkg-scanpackages -m pool/soft > $p_soft1
cat $p_soft1 | gzip -9c > $p_soft1.gz
cat $p_soft1 | bzip2 -9 > $p_soft1.bz2
 
# x86_64
dpkg-scanpackages -m pool/soft > $p_soft2
cat $p_soft2 | gzip -9c > $p_soft2.gz
cat $p_soft2 | bzip2 -9 > $p_soft2.bz2
 
cd dists/nobody
 
# Create the Repositary Release file
 
cat > Release << END
Origin: nobody
Label: nobody repo
Suite: nobody
Codename: nobody
Version: 1.0
Architectures: i386
Components: soft
Description: nobody 1.0 repo
MD5Sum:
END
 
# Create Relases
 
cd $_soft1
cat > Release << END
Archive: nobody
Version: 1.0
Component: soft
Origin: nobody
Label: nobody packages
Architecture: i386
Description: nobody 1.0 repo
END
 
cd ../../$_soft2
cat > Release << END
Archive: nobody
Version: 1.0
Component: soft
Origin: nobody
Label: nobody packages
Architecture: x86_64
Description: nobody 1.0 repo
END
 
cd ../..
 
# MD5Sum Calculate for all files
 
# i386
 
md5sum=$(md5sum "$_soft1/Packages" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft1/Packages" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft1/Packages" $sizeinbytes >> Release
printf "\n" >> Release
md5sum=$(md5sum "$_soft1/Packages.bz2" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft1/Packages.bz2" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft1/Packages.bz2" $sizeinbytes >> Release
printf "\n" >> Release
md5sum=$(md5sum "$_soft1/Packages.gz" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft1/Packages.gz" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft1/Packages.gz" $sizeinbytes >> Release
printf "\n" >> Release
md5sum=$(md5sum "$_soft1/Release" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft1/Release" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft1/Release" $sizeinbytes >> Release
printf "\n" >> Release
 
# x86_64
 
md5sum=$(md5sum "$_soft2/Packages" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft2/Packages" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft2/Packages" $sizeinbytes >> Release
printf "\n" >> Release
 
md5sum=$(md5sum "$_soft2/Packages.bz2" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft2/Packages.bz2" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft2/Packages.bz2" $sizeinbytes >> Release
printf "\n" >> Release
 
md5sum=$(md5sum "$_soft2/Packages.gz" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft2/Packages.gz" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft2/Packages.gz" $sizeinbytes >> Release
printf "\n" >> Release
 
md5sum=$(md5sum "$_soft2/Release" | cut -d ' ' -f1)
sizeinbytes=$(ls -l "$_soft2/Release" | cut -d ' ' -f5)
printf " "$md5sum" %1d $_soft2/Release" $sizeinbytes >> Release
printf "\n" >> Release
 
# Signing all files
 
printf "\n* Singning Repositary *\n"
echo $key_pass | gpg --yes --no-use-agent --passphrase-fd 0 -bao Release.gpg Release
 
printf "\n* Singning i386 *\n"
cd $_soft1
echo $key_pass | gpg --yes --no-use-agent --passphrase-fd 0 -bao Release.gpg Release
 
printf "\n* Singning x86_64 *\n"
cd ../../$_soft2
echo $key_pass | gpg --yes --no-use-agent --passphrase-fd 0 -bao Release.gpg Release
6. Запускаем скрипт и ждём когда он отработает.
$ chmod a+x
$ ./repo_debian.sh
7. Закачиваем на хостинг директорию repo и описываем репозиторий в /etc/apt/sources.list
deb http://«IP-адрес»/repo nobody soft
8. Проверяем работу репозитория
$ wget http://«IP-адрес»/repo/DEB-GPG-KEY
$ sudo apt-key add DEB-GPG-KEY
$ sudo apt-get clean
$ sudo apt-get update

Комментариев нет:

Отправить комментарий