Versions Compared

Key

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

...

...

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

  2. Создайте новую зону по умолчанию

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

  4. Создайте зону для получения зависимостей и получите зависимости

  5. Создайте новую зону для создания локального репозитория

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

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

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

Для создания новой VM в vmware/virtualbox/kvm воспользуйтесь этой инструкцией.

Для создания VM в vSphere SPB-LABS выполните шаги 1-5 из этой инструкции.

2. Залогиньтесь с правами root и создайте новую зону по умолчанию

Для KVM используйте следующие инструкции:

  1. Настройка сети

  2. Создание зоны по умолчанию

Для VM в vSphere:

...

Actions

  1. Create and update the new VM

  2. Prepare environment for creating new zones

  3. Get dependencies for components building

  4. Create a zone for local repository

  5. Create the local repository in this zone

  6. Create the new zone for components building

  7. Build components

1. Create and update the new VM

To create the new VM in vSphere SPB-LABS execute please steps 1-5 from this instruction.

2. Login with root account and prepare environment for zones creation

  1. Create the mountpoint for zones mounting:

Code Block
languagebash
root@dilos:~# zfs create -o mountpoint=/zones rpool/zones
root@dilos:~# mkdir /export/builds

2. Добавьте пользователя Add the admin user:

Code Block
languagebash
root@dilos:~# useradd -m -g staff admin
root@dilos:~# passwd admin
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@dilos:~# echo "admin ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/admin

3. Выполните Инструкцию по настройке сети до шага, на котором создаётся зона zone01. 4. Для автоматизации создания зон и входа в них можно скопировать этот скрипт в файл Execute Instruction for NET configuration till the step of zone01 creation.

4. To automate zone creation you can copy this script to create_zone.sh или выполнить команду file or execute the following command:

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

Cделайте его выполняемымMake it executable:

Code Block
languagebash
chmod 777 ./create_zone.sh

Info

Теперь Вы можете запустить его в формате Now you will be able to run it with the format of ./create_zone.sh <zone-name> <zone-ip-domain> <zone-ip-node> , напримерfor example!:

./create_zone.sh zone02 192.168.0 3

3

...

. Get dependencies for components building.

Update the /etc/apt/sources.list file:

Code Block
languagebash
cat > /etc/apt/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

Создайте папку для репозитория и перейдите тудаCreate a folder for the local repository and enter it:

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

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

Здесь же создайте скрипт для получения исходников и их зависимостей. Для этого скопируйте этот скрипт в файл, напримерTo make the following script workable you have to create the list_component file with a content from here.

Create here a script to obtain dependencies and repository creation. To do this copy please this script to the file, let say, make_repo.sh или выполните следующую команду or execute the following command:

Code Block
languagebash
cat > 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 < 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 -i '/^[ \\t]*\$/d' final_list
  end=\$(cat list_to_check)
  echo "" >> list_to_check
done

## Loop for check and 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
  if [[ "" == "\$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" != "" ]]; then
    ## Download existed package
    echo -e "\\033[35m =====> Downloading package \$pkg... \\033[0m"
    res=\$(apt-get -R /data/repo/pkg/_tdir download \$pkg | grep 'E:' | sed -n 's/E://')
    if [[ "\$res" == "" ]]; then
      print_log "\$pkg : OK"
    else
      echo -e "\\033[31;1;4m \$res \\033[0m"
      print_log "\$pkg: \$res"
      if [[ "\$DEP_FILE" != "" ]]; then
        echo "=======================================" >> errors.log
        echo "\$pkg: \$res" >> errors.log
        grep ":\$pkg" \$DEP_FILE >> errors.log
      fi     
    fi
  else
    ## 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: No package found" >> errors.log
      grep ":\$pkg" \$DEP_FILE >> errors.log
    fi
  fi
done < final_list

## Downloading *.deb packages
echo -e "\\033[32;1m =====> Uploading *.deb packages... \\033[0m"
reprepro -b /data/repo --export=never -C main includedeb du2-prebuild /data/repo/pkg/*.deb

## Loop for download sources
while read component; do
  if [[ "" == "\$component" ]]; then
    continue
  fi
  echo -e "\\033[33;1m =====> Downloading sources for \$component... \\033[0m"
  apt-get source --download-only \$component
  echo -e "\\033[32;1m =====> Uploading sources for \$component... \\033[0m"
  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

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

Code Block
languagebash
chmod 777 ./make_repo.sh

Если Вы хотите получить лог с ошибками, то в строку If you have to get the error log then put the log name to the string LOG_FILE="" впишите имя файла, куда будет записываться сообщения о ходе выполнения, например , for example:

Code Block
LOG_FILE="/export/admin/repo.log"

4.

...

Create a zone for local rpository

Create the new zone and enter it:

Code Block
languagebash
cd ~
./create_zone.sh zonerepo 192.168.0 2
zlogin zonerepo
Info

Команды ниже выполняются в зоне.

...

All the following commands are executed in the zonerepo.

Update the /etc/apt/sources.list file:

Code Block
languagebash
cat > /etc/apt/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
deb-src http://apt.dilos.org/dilos du2-unstable main contrib non-free
EOT
apt-get update

Установите в зоне необходимые пакеты для работы репозиторияInstall packets required for working in the zone:

Code Block
languagebash
apt-get install reprepro apache2 debhelper dpkg-dev dh-exec apt-rdepends screen -y
ln -s /data/repo /var/www/html/dilos
svcadm enable http
svcs http

Создайте директорию, где у вас будут лежать конфигурационные файлы для репозиторияCreate a folder for repository configuration files:

Code Block
languagebash
mkdir -p /data/repo/conf

и создайте конфигурационный файл репозиторияand create the repository configuration:

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 версии For local repository creation you need reprepro of version 5.3 и выше. В настоящее время его пока нет в DU2. До момента его появления там нужно выполнить следующие действия для его установки or higher. For the moment it is absent in DU2. So, till it is not there you need to get it from another place with help of the following commands:

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

...

5. Create the local repository:

Code Block
languagebash
cd /data/repo/pkg
./make_repo.sh
exit

Процедура создания репозитория может занять длительное время. Поэтому можно запустить скрипт при помощи утилиты screenCreating of the local repository can take a long time. So, you can run it with the screen utility.

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду
Expand
titleЗапуск при помощи утилиты screen
Running with the screen utility

If you are connected by SSH and would like to turn off SSH session or even temporary turn off your computer, then you have enter the following command for tests running:

Code Block
screen ./make_repo.sh

Дальше в любой момент Вы можете нажать Then you can in any time press Ctrl-A d , после чего отключиться от сессии SSH.Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите командуand after that close your SSH session.

When you would like to get back, login again to SSH please and enter the command:

Code Block
screen -r

5.

...

Create the new zone for components building

Create the new zone and enter it:

Code Block
languagebash
./create_zone.sh zonebld 192.168.0 3
zlogin zonebld
Info

Команды ниже выполняются в зоне.

...

All the following commands are executed in the zonebld.

Prepare the zone for components building. To do this please copy this script to, let say, the prepare.sh file or execute the following command:

Code Block
languagebash
cat > prepare.sh <<EOT
#!/bin/bash
WORKSPACE=/export/home/admin/du2

apt-get clean
apt-get autoclean
apt-get remove libiconv-dev -y

apt-get install -y acl iputils-ping kbd ksh scheduler system-data-console-fonts
apt-get install -y traceroute gmake build-essential man-db po-debconf po4a debhelper
apt-get install -y libx11-6 libxi6 libxtst6 liblua5.2-dev libnghttp2-dev libjansson-dev
apt-get install -y mawk doxygen graphviz libdb-dev libgdbm-dev libsqlite3-dev libpq-dev
apt-get install -y bison dh-exec cmake docbook-xml docbook-xsl libgtest-dev screen

#/usr/bin/ln -fs libX11.so.6 /usr/lib/64/libX11.so.4
#/usr/bin/ln -fs libXi.so.6 /usr/lib/64/libXi.so.5
#/usr/bin/ln -fs libXtst.so.6 /usr/lib/64/libXtst.so.1

cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo "" > /etc/apt/sources.list
echo "deb [trusted=yes] http://192.168.0.2/dilos du2-prebuild main contrib non-free" >> /etc/apt/sources.list
echo "deb-src [trusted=yes] http://192.168.0.2/dilos du2-prebuild main contrib non-free" 2>/dev/null >> /etc/apt/sources.list
cp /etc/apt/sources.list /etc/apt/sources.list.dev

apt-get update -y

#test -f /var/lib/dpkg/lock && rm -f /var/lib/dpkg/lock
#test -f /var/cache/apt/archives/lock && rm -f /var/cache/apt/archives/lock
#dpkg --configure -a
rm -rf \${WORKSPACE} && mkdir -p \${WORKSPACE}

apt-get upgrade -y

env DEBIAN_FRONTEND=noninteractive apt-get install -y -f
env DEBIAN_FRONTEND=noninteractive apt-get install -y git openssh-server
EOT

Сделайте его исполняемым и запуститеMake it executable and run:

Code Block
languagebash
chmod 777 ./prepare.sh
./prepare.sh

6.

...

Build components

Copy this script to, for example, thebuild_all.sh или выполните команду file or execute the following command:

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

BLD_PARALLEL="4"
WORKSPACE=/export/home/admin/du2

#STOP_ON_ERROR=1
STOP_ON_ERROR=0
#GCC_COMPILER="gcc-6"
GCC_COMPILER=""

# Build a component: \$1 - component name, \$2 - stop-on-error flag
function build_component {
  BLD_RESULT="/data/repo/du/\$1"
  test -z "\$1" && exit 1
  test -d \${BLD_RESULT} && rm -rf \${BLD_RESULT}
  DEB_BUILD_OPTIONS="nocheck notest parallel=\${BLD_PARALLEL}"
  export DEB_BUILD_OPTIONS
  test -d \${WORKSPACE}/\$1 && rm -rf \${WORKSPACE}/\$1
  mkdir -p \${WORKSPACE}/\$1
  cd \${WORKSPACE}/\$1
  echo "====================== \$1 ======================"  | tee berror.log
  if [[ \$2 -eq 0 ]]; then
    apt-get build-dep -y \$1 >> berror.log || return 0 2>&1
    apt-get source --compile \$1 >> berror.log || return 0 2>&1
  else
    apt-get build-dep -y \$1 >> berror.log || return 1 2>&1
    apt-get source --compile \$1 >> berror.log || return 1 2>&1
  fi
  mkdir -p \${BLD_RESULT}
  cp -ax *.deb \${BLD_RESULT}/ || exit 1
  cp -ax *.changes \${BLD_RESULT}/ || exit 1
  cp -ax *.buildinfo \${BLD_RESULT}/ || exit 1

}

if [[ "\$GCC_COMPILER" != "" ]]; then
  echo "====================== Building GCC ======================"
  build_component \$GCC_COMPILER 1
  if [[ \$? -eq 1 ]]; then
    exit 1
  fi
  dpkg -i \$WORKSPACE/\$GCC_COMPILER/*.deb
fi

while read COMP; do
  if [[ "" == "\$COMP" ]] || [[ "\$GCC_COMPILER" == "\$COMP" ]]; then
    continue
  fi
  build_component \$COMP \$STOP_ON_ERROR
  if [[ \$? -eq 1 ]]; then
    exit 1
  fi
done < /data/repo/pkg/list_component
EOT

Если Вы хотите, чтобы пстроение закончилось после первой же ошибки, присвойте 1 переменной If you’d like stop process on the first error, put 1 the STOP_ON_ERROR variable STOP_ON_ERROR=1. В противном случае скрипт будет строить все компоненты по-очереди, независимо от ошибок. При этом в директории каждого компонента будет создаваться файл berror.log, где вы сможете увидеть ошибки построения.Сделайте файл выполняемым и запустите егоIn other case it will build all components one-by-one regardless of errors. And in every component folder theberror.log file will be created, where build errors will be stored.

Make it executable and run:

Code Block
languagebash
chmod 777 ./build_all.sh
./build_all.sh

Построение компонент может занять длительное время. Поэтому можно запустить скрипт при помощи утилиты screenThe building process can take a long time. So, you can run it with the screen utility.

Если Вы подключились по SSH и хотите отключиться от сессии SSH или отключить свой компьютер на время, то выполните следующую команду
Expand
titleЗапуск при помощи утилиты screen
Running with the screen utility

If you are connected by SSH and would like to turn off SSH session or even temporary turn off your computer, then you have enter the following command for tests running:

Code Block
screen ./build_all.sh

Дальше в любой момент Вы можете нажать Then you can in any time press Ctrl-A d , после чего отключиться от сессии SSH.Затем когда Вы захотите вернуться, залогиньтесь снова по SSH и введите командуand after that close your SSH session.

When you would like to get back, login again to SSH please and enter the command:

Code Block
screen -r

Если Вы запустили построение всех компонент, то проверить, какие компоненты не построились, можно, выполнив командыIf you run all components building, then you can check what components were failed with the following commands:

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

#WDIR=\$1
WDIR=/export/home/admin/du2

subdirs=\$(ls -1 \$WDIR)

for dr in \$subdirs
do
  res=\$(tail -1 \$WDIR/\$dr/berror.log)
  if [[ "\$(echo \$res | grep 'Fetched')" == "" ]]; then
    echo "\$dr : \$res"
  fi
done
EOT
chmod 777 ./check_fails.sh
./check_fails.sh
Info

Note : Если Вам нужно сначала собрать компилятор GCC и провести построение при его помощи, то укажите имя компоненты компилятора в переменной GCC_COMPILER, например If you need first to build the GCC compiler and use it to build other components, then put the compiler component name to the GCC_COMPILER variable, for example:

GCC_COMPILER="gcc-6". Его точное имя можно посмотреть в файле Its exact name you can find in the list_component.

...

file.

After the build you an check the components installation by creating the new zone.