URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 67531
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Автоматизированная сборка загрузочн..."

Отправлено auto_tips , 31-Май-10 14:45 
Ниже представлен вариант автоматизированной сборки DVD из CD-образов Russian Remix Fedora (RFRemix). Тестировалось под OS RFRemix 11 и RFRemix 12.

Изложенные в инструкции действия следует выполнять под пользователем root.
Создаем каталог куда копируем 6-ть образов CD (закачены с yandex):

   RFRemix-13-i386-disc1.iso
   RFRemix-13-i386-disc2.iso
   RFRemix-13-i386-disc3.iso
   RFRemix-13-i386-disc4.iso
   RFRemix-13-i386-disc5.iso
   RFRemix-13-i386-disc6.iso

В каталоге создаем bash-скрипт MakeDVD.sh со следующим содержимым:

   #!/bin/bash
   #Script create DVD ISO-image from CD ISO-images for Fedora 13

   RFREMIX13_MEDIA_ID="1274745691.442497"
   MAX_DISC_NUM=6
   RFREMIX_DISC_NAME="RFRemix-13-i386-disc"
   COMPS_FILE="RFRemix-13-comps.xml"
   RPM_DIR="Packages"
   DVD_LABEL="RFRemix 13"

   RFRENIX_VER11=`((cat /etc/system-release) | awk '{  if(match($0,"11")!=0) print "11" }')`
   RFRENIX_VER12=`((cat /etc/system-release) | awk '{ if(match($0,"12")!=0) print "12" }')`

   CURDIR="$(pwd)"
   COMPSFILE=$CURDIR"/srcdvd/repodata/"$COMPS_FILE
   SRCDVDDIR="$CURDIR""/srcdvd"
   DVDISOFILE="$CURDIR""/dvd-iso/RFRemix-13-i386-DVD.iso"

   cleandata()
   {
   echo
   echo 'Cleaning temporary data...'
   echo

   for ((i=1;i<=$MAX_DISC_NUM;i++)) ; do
       if [ -a ./mnt/disc$i ]; then
         umount -f ./mnt/disc$i ;
       fi
   done

   rm -f -R ./mnt
   rm -f -R ./srcdvd
   }

   echo
   echo 'Create directories...'
   echo

   cleandata
   rm -f -R ./dvd-iso

   mkdir ./srcdvd
   mkdir ./dvd-iso
   mkdir ./mnt
   for ((i=1;i<=$MAX_DISC_NUM;i++)) ; do mkdir ./mnt/disc$i ; done

   echo
   echo 'Mount a CD ISO-image...'
   echo

   for ((i=1;i<=$MAX_DISC_NUM;i++)) ; do mount -t iso9660  ./$RFREMIX_DISC_NAME$i.iso ./mnt/disc$i -o loop ; done

   echo
   echo 'Data preparation...'
   echo

   echo 'Copying packages from disc 1...'
   cp -f -R ./mnt/disc1/* ./srcdvd
   cp -f ./mnt/disc1/.discinfo ./srcdvd

   rm -f ./srcdvd/repodata/*
   cp ./mnt/disc1/repodata/*-comps.xml ./srcdvd/repodata/$COMPS_FILE
   rm -f `(find ./srcdvd/*.TBL ./srcdvd/ | grep .TBL)`

   for ((i=2;i<=$MAX_DISC_NUM;i++)) ; do
       echo 'Copying packages from disc '$i'...';
       cp ./mnt/disc$i/$RPM_DIR/* ./srcdvd/$RPM_DIR;
   done

   if [ "v"$RFRENIX_VER12 == "v12" ] && [ ! -e /usr/lib/python2.6/site-packages/createrepo/createrepo_rfremix12.patch ]; then
      echo
      echo 'Patching utility createrepo...'
      echo

      cp -f ./createrepo_rfremix12.patch /usr/lib/python2.6/site-packages/createrepo
      cp /usr/lib/python2.6/site-packages/createrepo/__init__.py /usr/lib/python2.6/site-packages/createrepo/__init__OLD.py
      patch -i /usr/lib/python2.6/site-packages/createrepo/createrepo_rfremix12.patch /usr/lib/python2.6/site-packages/createrepo/__init__.py
   fi

   if [ "v"$RFRENIX_VER11 == "v11" ] && [ ! -e /usr/lib/python2.6/site-packages/createrepo/createrepo.patch ]; then
      echo
      echo 'Patching utility createrepo...'
      echo

      cp -f ./createrepo.patch /usr/lib/python2.6/site-packages/createrepo
      cp /usr/lib/python2.6/site-packages/createrepo/__init__.py /usr/lib/python2.6/site-packages/createrepo/__init__OLD.py
      patch -i /usr/lib/python2.6/site-packages/createrepo/createrepo.patch /usr/lib/python2.6/site-packages/createrepo/__init__.py
    fi

   echo
   echo 'Creation of information repositories...'
   echo

   createrepo -g "$COMPSFILE" --baseurl "media://"$RFREMIX13_MEDIA_ID -d -o "$SRCDVDDIR" "$SRCDVDDIR"

   echo
   echo 'Checksum repodata/repomd.xml...'
   echo

   SHA256REPO=`(sha256sum ./srcdvd/repodata/repomd.xml) | awk '{ print $1 }'`
   REPOINFO="repodata/repomd.xml = sha256:""$SHA256REPO"
   (cat ./mnt/disc1/.treeinfo) | awk '{ if(match($0,"repodata")==0) print; else print "'"$REPOINFO"'" }' > ./srcdvd/.treeinfo

   echo
   echo 'Creating a bootable DVD ISO-image...'
   echo

   mkisofs -r -T -joliet-long -V "$DVD_LABEL" -b isolinux/isolinux.bin -c isolinux/boot.cat \
      -no-emul-boot -boot-load-size 4 -boot-info-table -o  "$DVDISOFILE" "$SRCDVDDIR" 2> ./make_iso.log

   cleandata

   ls -l ./dvd-iso

   echo
   echo 'Create DVD ISO completed!'
   echo


В каталоге размещаем два patch-файла для createrepo
(пакет должен быть установлен). Патчи необходимы, иначе
мы получим пропуск некоторых rpm-пакетов.

Файл createrepo.patch (для RFRemix 11):

   *** ./__init__.py    2010-05-29 22:51:15.000000000 +0300
   --- ./__init__update.py    2010-05-30 07:26:02.000000000 +0300
   ***************
   *** 72,78 ****
          self.oldpackage_paths = [] # where to look for the old packages -
          self.deltafile = 'prestodelta.xml.gz'
          self.num_deltas = 1 # number of older versions to delta (max)
   !      self.max_delta_rpm_size = 100000000
          self.update_md_path = None
          self.skip_stat = False
          self.database = False
   --- 72,78 ----
          self.oldpackage_paths = [] # where to look for the old packages -
          self.deltafile = 'prestodelta.xml.gz'
          self.num_deltas = 1 # number of older versions to delta (max)
   !      self.max_delta_rpm_size = 1000000000L
          self.update_md_path = None
          self.skip_stat = False
          self.database = False
   ***************
   *** 588,594 ****
          """
          
          # duck and cover if the pkg.size is > whatever
   !      if int(pkg.size) > self.conf.max_delta_rpm_size:
              if not self.conf.quiet:
                  self.callback.log("Skipping %s package " \
                                      "that is > max_delta_rpm_size"  % pkg)
   --- 588,594 ----
          """
          
          # duck and cover if the pkg.size is > whatever
   !      if long(pkg.size) > self.conf.max_delta_rpm_size:
              if not self.conf.quiet:
                  self.callback.log("Skipping %s package " \
                                      "that is > max_delta_rpm_size"  % pkg)
   ***************
   *** 638,644 ****
          for d in self.conf.oldpackage_paths:
              for f in self.getFileList(d, 'rpm'):
                  fp = d + '/' + f
   !              if int(os.stat(fp)[stat.ST_SIZE]) > self.conf.max_delta_rpm_size:
                      self.callback.log("Skipping %s package " \
                                        "that is > max_delta_rpm_size"  % f)
                      continue
   --- 638,644 ----
          for d in self.conf.oldpackage_paths:
              for f in self.getFileList(d, 'rpm'):
                  fp = d + '/' + f
   !              if long(os.stat(fp)[stat.ST_SIZE]) > self.conf.max_delta_rpm_size:
                      self.callback.log("Skipping %s package " \
                                        "that is > max_delta_rpm_size"  % f)
                      continue


Файл createrepo_rfremix12.patch (для RFRemix 12):


   *** ./__init__.py    2010-05-30 09:28:40.000000000 +0300
   --- ./__init__update_f12.py    2010-05-30 09:38:01.000000000 +0300
   ***************
   *** 74,80 ****
          self.oldpackage_paths = [] # where to look for the old packages -
          self.deltafile = 'prestodelta.xml.gz'
          self.num_deltas = 1 # number of older versions to delta (max)
   !      self.max_delta_rpm_size = 100000000
          self.update_md_path = None
          self.skip_stat = False
          self.database = False
   --- 74,80 ----
          self.oldpackage_paths = [] # where to alook for the old packages -
          self.deltafile = 'prestodelta.xml.gz'
          self.num_deltas = 1 # number of older versions to delta (max)
   !      self.max_delta_rpm_size = 1000000000L
          self.update_md_path = None
          self.skip_stat = False
          self.database = False
   ***************
   *** 613,619 ****
          """
          drpm_pkg_time = time.time()
          # duck and cover if the pkg.size is > whatever
   !      if int(pkg.size) > self.conf.max_delta_rpm_size:
              if not self.conf.quiet:
                  self.callback.log("Skipping %s package " \
                                      "that is > max_delta_rpm_size"  % pkg)
   --- 613,619 ----
          """
          drpm_pkg_time = time.time()
          # duck and cover if the pkg.size is > whatever
   !      if long(pkg.size) > self.conf.max_delta_rpm_size:
              if not self.conf.quiet:
                  self.callback.log("Skipping %s package " \
                                      "that is > max_delta_rpm_size"  % pkg)
   ***************
   *** 671,677 ****
              for f in self.getFileList(d, 'rpm'):
                  fp = d + '/' + f
                  fpstat = os.stat(fp)
   !              if int(fpstat[stat.ST_SIZE]) > self.conf.max_delta_rpm_size:
                      self.callback.log("Skipping %s package " \
                                        "that is > max_delta_rpm_size"  % f)
                      continue
   --- 671,677 ----
              for f in self.getFileList(d, 'rpm'):
                  fp = d + '/' + f
                  fpstat = os.stat(fp)
   !              if long(fpstat[stat.ST_SIZE]) > self.conf.max_delta_rpm_size:
                      self.callback.log("Skipping %s package " \
                                        "that is > max_delta_rpm_size"  % f)
                      continue


Установить атрибут MakeDVD.sh на выполнение.
Запустить файл MakeDVD.sh.
В каталоге dvd-iso получим DVD ISO-образ Russian Remix Fedora 13.
[[http://www.opennet.me/soft/fedora_dvd/ Исходники скрипта и патчей]].


URL:
Обсуждается: http://www.opennet.me/tips/info/2381.shtml


Содержание

Сообщения в этом обсуждении
"Автоматизированная сборка загрузочного DVD из CD-образов Russian Fedora 13"
Отправлено Igor , 31-Май-10 14:45 
Автор - не тот Igor, который зарегистрирован. :)