Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Создайте и обновите новую VM

  2. Подготовьте окружение для создания новых зон

  3. Получите зависимости Подготовьте скрипт для получения зависимостей компонент

  4. Создайте зону для локального репозитроия

  5. Создайте в этой зоне локальны локальный репозиторий

  6. Создайте новую зону для сборки компонент

  7. Соберите компоненты

...

Code Block
languagebash
cat > create_zone.sh <<SCRIPT
#!/bin/bash

TYPE_ZONE=\$1
IP=\$2
SER=\$3

cat > \${HOME}/\${TYPE_ZONE}.cmd <<EOT
create
set zonename=\${TYPE_ZONE}
set zonepath=/zones/\${TYPE_ZONE}
set autoboot=false
set ip-type=exclusive
add net
set physical=iz\${SER}
set global-nic=vsw0
add property (name=ip,value="\${IP}.\${SER}")
add property (name=gateway,value="\${IP}.254")
add property (name=netmask,value="255.255.255.0")
add property (name=primary,value="true")
end
add attr
set name=resolvers
set type=string
set value=8.8.8.8
end
add fs
set dir="/export/home/admin"
set special="/export/home/admin"
set type="lofs"
end
add fs
set dir="/export/builds"
set special="/export/builds"
set type="lofs"
end
add fs
set dir="/data/repo"
set special="/data/repo"
set type="lofs"
end
verify
commit
exit
EOT
zonecfg -z \${TYPE_ZONE} -f \${HOME}/\${TYPE_ZONE}.cmd
zoneadm -z \${TYPE_ZONE} install && zoneadm -z \${TYPE_ZONE} boot
echo "127.0.0.1 localhost.\${TYPE_ZONE} \${TYPE_ZONE}" >> /zones/\${TYPE_ZONE}/root/etc/hosts
SCRIPT

...

Info

Теперь Вы можете запустить его в формате ./create_zone.sh <zone-name> <zone-ip-domain> <zone-ip-node> , например!:

./create_zone.sh zone02 192.168.0 3

3.

...

Подготовьте скрипт для получения зависимостей

Создайте папку для репозитория и перейдите туда:

Code Block
languagebash
catmkdir >-p /etcdata/aptrepo/sources.list <<EOT
deb http://apt.dilos.org/dilos dg2-unstable main contrib non-free
deb http://apt.dilos.org/dilos du2-unstable main contrib non-free
EOT
apt-get update

...

pkg
cd /data/repo/pkg

Чтобы нижеприведённый скрипт заработал, Вам нужно создать файл list_component , содержимое которого можно взять отсюда.

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

Code Block
languagebash
mkdircat -p /data/repo/pkg
cd /data/repo/pkg

Чтобы нижеприведённый скрипт заработал, Вам нужно создать файл list_component , содержимое которого можно взять отсюда.

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

Code Block
languagebash
cat > make_repo.sh <<EOT
#!/bin/bash

#DEP_> make_repo.sh <<EOT
#!/bin/bash

#DEP_FILE=""
DEP_FILE="req.txt"
LOG_FILE=""
#LOG_FILE="errors.log"
function print_log {
  if [[ "\$LOG_FILE" != "" ]]; then
    echo "\$1" >> \$LOG_FILE
  fi
}

## Loop for get build components dependencies
echo "" > list_to_check
echo "publicsuffix" > final_list
sed -i '/^[ \\t]*\$/d' list_component
echo "" >> list_component
echo "" > temp
while read comp; do
  ## Skip empty line
  if [[ "" == "\$comp" ]]; then
    continue
  fi 
  echo -e "\\033[33m =====> Getting depends for \$comp... \\033[0m"
  res=\$(apt-rdepends --build-depends --follow=DEPENDS \$comp)
  echo "\$res" | grep 'Build-Depends:' > tmp
  echo "\$res" | grep 'Build-Depends-Indep:' >> tmp
  sed 's/^[ \\t]*Build-Depends:[ \\t]*//; s/^[ \\t]*Build-Depends-Indep:[ \\t]*//' tmp | sed 's/[ \\t]*(.*)[ \\t]*\$//' >> temp
  rm -f tmp
  if [[ "\$DEP_FILE" != "" ]]; then 
    sed "s/^/\$comp:/g" temp >> \$DEP_FILE
  fi
done < list_component

## Preparation of initial list of dependencies
sort -u temp > list_to_check
sed -i '/^[ \\t]*\$/d' list_to_check
end=\$(cat list_to_check)
echo "" >> list_to_check

mkdir /data/repo/pkg/_tdir
apt-get -R /data/repo/pkg/_tdir update

## Loop for get packages dependencies
while [[ "\$end" != "" ]]; do
  echo "" > temp
  while read comp; do
    ## Skip empty line
    if [[ "" == "\$comp" ]]; then
      continue
    fi
    ## Skip packages that are already checked for dependencies
    res=\$(grep "^[ \\t]*\$comp[ \\t]*\\\$" final_list)
    if [[ "" != "\$res" ]]; then
      continue
    fi
    echo "=====> Getting depends for \$comp..."
    apt-get -R /data/repo/pkg/_tdir install --dry-run \$comp | grep "^Inst " | sed 's/^Inst //; s/ .*\$//' >> temp
    ##apt-cache## depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances apt-cache depends --no-pre-depends --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances \$comp | sed 's/^[ \t|]*Depends: //; /</d; s/^[ \\t]*//' | sed 's/^[ \\t|]*Depends: //; /</d; s/^[ \\t]*//' >> temp
    ## Add checked package to the list of already checked packages
    echo "\$comp" >> final_list
    if [[ "\$DEP_FILE" != "" ]]; then
      sed "s/^/\$comp:/g" temp >> \$DEP_FILE
    fi
  done < Add checked package to the list of already checked packages
    echo "\$comp" >> final_list
    if [[ "\$DEP_FILE" != "" ]]; then
      sed "s/^/\$comp:/g" temp >> \$DEP_FILE
    fi
  done < list_to_check

  ## Remove repeated records from the list
  sort -u temp > list_to_check
  ## Remove empty lines if any
  sed -i '/^[ \\t]*\$/d' list_to_check
  sed ## Remove repeated records from the list
  sort -u temp >-i '/^[ \\t]*\$/d' final_list
  end=\$(cat list_to_check)
  echo "" >> list_to_check
done

## Remove empty lines if any
  Loop for check and download dependencies
rmdir -p --ignore-fail-on-non-empty /data/repo/pkg/_tdir
sed -i '/^[ \\t]*\$/d' list_to_check
  sed -i '/^[ \\t]*\$/d'final_list
sort -u final_list >  end=\$(cat list_to_check)
 temp
mv -f temp final_list
echo "" >> final_list
rm -f list_to_check
donewhile read ##pkg; Loopdo
for check andif download[[ dependencies"" rmdir -p --ignore-fail-on-non-empty /data/repo/pkg/_tdir
sed -i '/^[ \\t]*\$/d' final_list
sort -u final_list > temp
mv -f temp final_list
echo "" >> final_list
rm -f list_to_check
while read pkg; do== "\$pkg" ]]; then
    continue
  fi
  echo -e "\\033[36m =====> Check \$pkg... \\033[0m"
  ## Check if a package exists
  res=\$(apt-cache show \$pkg | grep "Package: \$pkg")
  if [[ "\$res" !== "\$pkg" ]]; then
    ## continueDownload existed package
 fi   echo -e "\\033[36m35m =====> Downloading Checkpackage \$pkg... \\033[0m"
  ## Check if a package exists
  res=\$(apt-cache showget -R /data/repo/pkg/_tdir download \$pkg | grep "Package: \$pkg"'E:' | sed -n 's/E://')
    if [[ "\$res" !== "" ]]; then
      print_log "\$pkg : OK"
   ## Downloadelse
existed package     echo -e "\\033[35m =====> Downloading package \$pkg...31;1;4m \$res \\033[0m"
    res=\$(apt-get -R /data/repo/pkg/_tdir download \$pkg | grep 'E:' | sed -n 's/E://') print_log "\$pkg: \$res"
      if [[ "\$res$DEP_FILE" !== "" ]]; then
        print_log "\$pkg : OK"
    elseecho "=======================================" >> errors.log
        echo -e "\\033[31;1;4m$pkg: \$res \\033[0m"" >> errors.log
      print_log "  grep ":\$pkg: \$res"
 " \$DEP_FILE >> errors.log
      fi     
    fi
  else
 if [[ "\$DEP_FILE" != "" ]]; then
    ## Put error message if package doesn't exist
    echo "======== -e "\\033[31;1;4m\$pkg: No package found \\033[0m"
    print_log "\$pkg: No package found"
    if [[ "\$DEP_FILE" != "" ]]; then
      echo "===============================" ========" >> errors.log
 
      echo "\$pkg: \$res No package found" >> errors.log
 
      grep ":\$pkg" \$DEP_FILE >> errors.log

     fi    
     fi
done < else
final_list

  ## PutDownloading error message if package doesn't exist
   *.deb packages
echo -e "\\033[31;1;4m\$pkg: No package found32;1m =====> Uploading *.deb packages... \\033[0m"
reprepro -b /data/repo --export=never -C main includedeb du4-prebuild /data/repo/pkg/*.deb

## Loop print_log "\$pkg: No package found"
 for download sources
while read component; do
  if [[ "\$DEP_FILE" !== "\$component" ]]; then
    continue
  fi
  echo -e "\\033[33;1m =======================================" >> errors.log
      echo "\$pkg: No package found" >> errors.log
      grep ":\$pkg" \$DEP_FILE >> errors.log
    fi
  fi
done < final_list

## Downloading *.deb packages
> Downloading sources for \$component... \\033[0m"
  apt-get source --download-only \$component
  echo -e "\\033[32;1m =====> Uploading sources *.deb packagesfor \$component... \\033[0m"
  reprepro -b /data/repo --export=never -C main includedebincludedsc du2du4-prebuild /data/repo/pkg/\$component*.debdsc
 ## Loop for download sources
while read component; do
  if [[ "" == "\$component" ]]; then
    continue
  fi
  rm -rf \$component*
done < list_component

## Creating index for local repo
echo -e "\\033[3332;1m =====> DownloadingCreating sourcesindices for local \$componentrepo... \\033[0m"
reprepro  apt-get source --download-only \$component
  Vb /data/repo export du4-prebuild
echo -e "\\033[32;1m =====> Uploading sources for \$component...DONE \\033[0m"
if  reprepro -b /data/repo --export=never -C main includedsc du2-prebuild \$component*.dsc
  rm -rf \$component*
done < list_component

## Creating index for local repo
echo -e "\\033[32;1m =====> Creating indices for local repo... \\033[0m"
reprepro -Vb /data/repo export du2-prebuild
echo -e "\\033[32;1m =====> DONE \\033[0m"
if [[ "\$LOG_FILE" != "" ]]; then
  echo "Downloaded package list is put to \$LOG_FILE"
fi
EOT

Сделайте этот файл исполняемым:

Code Block
languagebash
chmod 777 ./make_repo.sh

...

[[ "\$LOG_FILE" != "" ]]; then
  echo "Downloaded package list is put to \$LOG_FILE"
fi
EOT

Сделайте этот файл исполняемым:

Code Block
languagebash
chmod 777 ./make_repo.sh

Если Вы хотите получить лог с ошибками, то в строку LOG_FILE="" впишите имя файла, куда будет записываться сообщения о ходе выполнения, например:

...

Code Block
languagebash
cat > /etc/apt/sources.list <<EOT
deb http://apt10.20.dilos60.org188/dilosdilos4 dg2du4-unstable main contrib non-free
deb http://apt10.20.dilos50.org188/dilos du2dg2-unstable main contrib non-free
deb-src http://apt10.20.dilos60.org188/dilosdilos4 du2du4-unstable main contrib non-free
EOT
apt-get update

...

Code Block
languagebash
echo -n "Codename:  du2-prebuild
Suite:  prebuild
Version: 2.0
Origin: DilOS
Label: DilOS prebuild
Description: DilOS Prebuild Repository
Architectures: solaris-i386 solaris-sparc source
Components: main contrib non-free
##SignWith: default
DebIndices: Packages Release . .gz .bz2 .xz
DscIndices: Sources Release . .gz .bz2 .xz
Contents: . .gz .bz2 .xz
" > /data/repo/conf/distributions
Note

Workaround : Для создания локального репозитория нужен reprepro версии 5.3 и выше. В настоящее время его пока нет в DU2. До момента его появления там нужно выполнить следующие действия для его установки:

mv /etc/apt/sources.list /etc/apt/sources.list.bak

cat > /etc/apt/sources.list <<EOT

deb http://apt.dilos.org/dilos du3-unstable main contrib non-free

EOT

apt-get update && apt-get install reprepro -y

mv /etc/apt/sources.list.bak /etc/apt/sources.list

apt-get update
 Release . .gz .bz2 .xz
DscIndices: Sources Release . .gz .bz2 .xz
Contents: . .gz .bz2 .xz
" > /data/repo/conf/distributions

5. Выполните эти команды для добавления пакетов и исходных файлов в репозиторий:

...

Expand
titleЗапуск при помощи утилиты screen

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду:

Code Block
screen ./make_repo.sh

Дальше в любой момент Вы можете нажать Ctrl-A d, после чего отключиться от сессии SSH.

Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите команду:

Code Block
screen -r

...

Expand
titleЗапуск при помощи утилиты screen

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду:

Code Block
screen ./build_all.sh

Дальше в любой момент Вы можете нажать Ctrl-A d, после чего отключиться от сессии SSH.

Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите команду:

Code Block
screen -r

...