Автообновление Gentoo.

 
+
-
edit
 

Balancer

администратор
★★★★★
Ответ на gentoo handsfree system update - Desktop - Форум

Пока - просто кучка скриптов. Писалось всё с полгода назад "на коленке", с тех пор причесать руки так и не дошли, ибо работает :)

Впоследствии буду подправлять статейку. Дополнения приветствуются. Полагаю, сейчас вместо знаков > в блоках кода вылезут > - завтра поправлю парсер.

1. В /usr/local/bin/cron/nightly лежит скриптик ночной работы с системой. Подразумевается, что у вас будет свой. У меня же оно такое (комментарии добавляю для пояснений):
code bash
  1. #!/bin/bash
  2.  
  3. # Синхронизируем время
  4. /usr/sbin/ntpdate -s ntp.cs.strath.ac.uk
  5.  
  6. # Остатки старых оверлеев, может быть снесу.
  7. /usr/bin/gensync -a
  8.  
  9. # Обновления "ручных" оверлеев (SVN добавленные ручками)
  10. /usr/local/overlays/ups
  11.  
  12. # esync и смотрим утром в логе, какой софт вообще обновлялся в стандартных репозиториях
  13. /usr/sbin/esync >> /var/log/esync.log
  14.  
  15. # Обновляем репозитории по layman
  16. /usr/bin/layman -S >> /var/log/layman.log
  17.  
  18. # Чистим ненужные файлы в distfiles
  19. /usr/bin/eclean-dist >> /var/log/portage/eclean-dist.log &
  20.  
  21. # Вот она! Обновляем мир. Запускаем процесс в screen'е, чтобы потом глянуть можно было, если что.
  22. /usr/bin/screen -t EmergeUWorld -S auto -d -m eupdate-all.sh
  23.  
  24. # Обновляем базу eix'а.
  25. /usr/bin/update-eix
  26.  
  27. # Делаем на всё прелинк... Хотя говорят, что растёт уровень фрагментации. М.б. и снесу когда-нибудь.
  28. /usr/sbin/prelink -avmfR > /dev/null
  29.  
  30. # Ищем потерянные связи. По идее, нужно комбинировать с автообновлением. Чтобы пакеты, требующие пересборки сами пересобирались.
  31. /usr/bin/revdep-rebuild -i --package-names -- -pv > /var/log/portage/revdep-rebuild.log
  32.  
  33. # Ищем в системе файлы, которых нет в портеже. На предмет ликвидации мусора.
  34. /usr/bin/findcruft > /var/log/portage/cruft.lst
  35.  
  36. # Наконец, чистим /tmp
  37. find /tmp -type f -mtime +30 -exec rm {} \;


По "ночному скрипту" нам наиболее интересен eupdate-all.sh:

code bash
  1. #!/bin/bash
  2.  
  3. if [[ `pgrep -f $0|wc -l` != 2 ]]; then exit; fi
  4.  
  5. /usr/local/bin/tools/portage/lists/make-world-update.sh
  6. /usr/local/bin/tools/portage/eupdate.sh /var/tmp/portage/world-update.txt


Тут всё просто, как видим. Проверка на то, что не запущен ли он уже и вызов двух скриптов.

/usr/local/bin/tools/portage/lists/make-world-update.sh делает файл со списком пакетов, требующих обновления:

code bash
  1. #!/bin/bash
  2.  
  3. # Собираем список пакетов, требующих обновления
  4. emerge -puN world | grep -v UD\] | grep '\[ebuild' | sed -r 's/\[ebuild[^]]+\]\s+(\S+)\s+.*$/=\1/g' > /var/tmp/portage/world-update.txt
  5.  
  6. # Добавляем туда список пакетов, которые мы хотим поставить ручками
  7. for p in `cat /var/tmp/portage/append.txt`; do
  8.     emerge -puN $p | grep -v UD\] | grep '\[ebuild' | sed -r 's/\[ebuild[^]]+\]\s+(\S+)\s+.*$/=\1/g'  >> /var/tmp/portage/world-update.txt
  9. done
  10.  
  11. # Добавляем список пакетов, которые должны пересобираться всегда
  12. for p in `cat /var/tmp/portage/append-must.txt`; do
  13.     emerge -p $p | grep -v UD\] | grep '\[ebuild' | sed -r 's/\[ebuild[^]]+\]\s+(\S+)\s+.*$/=\1/g'  >> /var/tmp/portage/world-update.txt
  14. done
  15.  
  16. # Чистим список, удаляя доубли и т.п.
  17. mv /var/tmp/portage/world-update.txt /tmp/portlist.txt
  18. /usr/local/bin/deldup < /tmp/portlist.txt > /var/tmp/portage/world-update.txt
  19. rm /tmp/portlist.txt


Собственно, сам сборщик, /usr/local/bin/tools/portage/eupdate.sh:
code bash
  1. #!/bin/bash
  2.  
  3. if [[ `pgrep -f $0|wc -l` != 2 ]]; then exit; fi
  4.  
  5. for i in `cat $1`; do
  6.     name=`echo $i|sed s/=//`
  7.     echo $name
  8.     subname=`echo $name|sed -r 's/^.+\///'`
  9.     emerge $i 2> /var/log/portage/fail/$subname.txt 1>&2
  10.     if [[ $? == 0 ]]; then
  11.         echo $i >> /var/log/portage/success.txt
  12.         mv -f /var/log/portage/fail/$subname.txt /var/log/portage/success/
  13.     else
  14.         echo $i >> /var/log/portage/fail.txt
  15.         rm /var/tmp/portage/$subname -rf
  16.     fi
  17. done


Итого:
- В /var/tmp/portage/append.txt кидаем имена новых пакетов, которые хотим видеть на машине утром.
- В /var/tmp/portage/append-must.txt добавляем пакеты, которые пересобирать нужно всегда. Например, SVN-версии или тестовые, которые могут сломаться от изменений в библиотеках.
- Утром в /var/log/portage/success.txt смотрим список удачно установленных пакетов.
- В /var/log/portage/fail.txt - список "обломов"
- В /var/log/portage/fail/ и В /var/log/portage/success/ - логи.

Вроде, всё. Задавайте вопросы :D Ну и, конечно, это всё нужно красиво подчистить со временем... Как руки дойдут.
 
+
-
edit
 

yarblc

втянувшийся

вопрос полу\офф...вчера хотел поставить шапку (RedHAt Enterprise LInux 3 AS вариант для amd64) на комп с саташным диском и контроллером саты nforce 430 - но она не видет контроллер и диск
генту (слил сёня install-amd64-minimal-2006.1.iso) увидит такой контроллер без подтыкания дополнительных драйверов?
читайте маны...они рулез  
+
-
edit
 

Balancer

администратор
★★★★★
Офтопик, но потом перекину ветку в новый топик.

yarblc> nforce 430

Судя по Драйвер nForce для Linux должно работать.

В конфиге ядра оно, как я понимаю, тут:
code text
  1.  Symbol: SCSI_SATA_NV [=n]
  2.  Prompt: NVIDIA SATA support
  3.   │   Defined at drivers/scsi/Kconfig:519
  4.   │   Depends on: SCSI!=n && SCSI_SATA && PCI && EXPERIMENTAL
  5.   │   Location:
  6.   │     -> Device Drivers
  7.   │       -> SCSI device support
  8.   │         -> SCSI device support (SCSI [=y])
  9.   │           -> SCSI low-level drivers
  10.   │             -> Serial ATA (SATA) support (SCSI_SATA [=n])


Посмотрел сейчас дефолтовое ядро в LiveCD - поддержка sata_nv там в виде модуля есть. Должен автоопределиться.
 
+
-
edit
 

yarblc

втянувшийся

ммм...вопрос больше серверрный.. вечера на свежепоставленную систему накатывал путём
emerge --sync
emerge --update --deep --newuse world && emerge --depclean && revdep-rebuild
чем чревато если я допустим раз в неделю буду её так апдейтить?
и этот апдейт на ядро распространятется или его надо руками обновлять?
читайте маны...они рулез  
+
-
edit
 

Balancer

администратор
★★★★★
Начну с конца.

- Ядро обновляется только вручную.

- Постоянный апдейт чреват потенциально тем, что можно что-то обрушить в системе на зависимостях

- Авиабаза обновляется ежедневно по расписанным вначале скриптам. Подводные камни - в append-must.txt прописана обязательная перекомпиляция PHP-компонентов, в первую очередь - eaccelerator. Иначе, при обновлении PHP, идентификатор API нередко меняется, что приводит к неработоспособности старых расширений. Дома всегда пересобирается beryl с компонентами - иногда бывало так, что обновится только какой-то один его компонент, а остальные с ним работать не могут. Хотя, слава оверлееклепателям, похоже, такого давно не было.

Общая рекомендация - сидеть или полностью на arch (x86/amd64 в противовес "нестабильным" ~arch - ~x86/~amd64 ), тогда обновления будут редкими и оттестированными, или же, как я, держать систему по умолчанию, в том числе, главное, все базовые библиотеки на arch, и только часть конечных продуктов (на десктопе это Xgl, Beryl, etc, на сервере - это все web-приложения, java, многие PEAR/SPAN пакеты...) - в ~arch.

В общем, тьфу-тьфу-тьфу, ездить к провайдеру и поднимать сервер после неудачного обновления ещё не приходилось :D

..

Ещё два замечания:
- Автоматическое обновление через emerge world не очень желательно, так как иногда способно приводить к "даунгрейду" ([ UD ]) пакетов. В моей системе я такие строчки специально выбрасываю. Кроме того, обновление прерывается при первом сбое, которые в ~arch случаются.

- ключик -D/--deep, по опыту его полутора(наверное)летнего использования, рекомендую убрать :) Ибо он чаще приводит к появлению проблем, которые приходится решать через revdep-rebuild. А реальной пользы с него не так уж много. Пока какая-то библиотека, не используемая тобой непосредственно, подходит для работы конечных продуктов - ну и пусть её, пускай старой остаётся. Как только перестанет подходить - она и без --deep обновится :) В общем, несколько месяцев назад отказался от этого ключика и на десктопах и на сервере. И машина стала к себе требовать ещё меньше внимания :)emerge -auvN world - и всё. Ну, ещё для визуализации иногда -t полезен.
 
+
-
edit
 

yarblc

втянувшийся

ммм..ну если я
CFLAGS="-march=k8 -O2 -pipe"
CHOST="x86_64-pc-linux-gnu"
поидее же это под arch amd64 заточенная сборка идёт?
или надо CHOST другой указать?
читайте маны...они рулез  
+
-
edit
 

Balancer

администратор
★★★★★
Нет, arch указывается в ACCEPT_KEYWORDS="amd64" (или, соответственно, ~amd64, x86, ~x86).

Индивидуально на каждый пакет keywords прописывается в /etc/portage/package.keywords
 

в начало страницы | новое
 
Поиск
Настройки






Твиттер сайта
Статистика
Рейтинг@Mail.ru
АвиаТОП
 
Яндекс.Метрика
website counter
 
free counters