Данная инструкция предназначена для подготовки окружения ALT-Linux Server 10.1/10.2 для установки воркспейса, версий 9.100.x.x 9.200.x.x без использования Vagrant
Установим базовые утилиты для дальнейшей работы
apt-get update
apt-get install nano wget zip unzip net-tools telnet htop
Устанавливаем из репозитория
apt-get install lxc lxc-net bridge-utils
Редактируем подсеть lxc-net
nano /etc/sysconfig/lxc-net
Меняем подсеть
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
Запускаем сервис и добавляем его в автозапуск
systemctl start lxc-net
systemctl enable lxc-net
systemctl start lxc
systemctl enable lxc
Для работы форвардинга портов на воркспейсе необходима утилита redir
.
В стандартном репозитории ее нет, поэтому необходимо скачать
исходники и установить ее из исходников
apt-get install autoconf automake gcc git
cd /opt
git clone https://github.com/troglobit/redir
cd redir
./autogen.sh
./configure --prefix=/usr
make -j5
make install-strip
Можно проверить наличие утилиты
which redir
На разделе куда идет установка оптимакрос не должно быть флагов nosuid
, usrquota
, grpquota
Рекомендуем оставлять только один флаг, relatime
, как это сделано на рутовом разделе
Воркспейс использует Ubuntu как ОС внутри контейнера, из-за того, что Alt-Linux по умолчанию использует dash и shotp там не поддерживается, а команды lxc-attach запускаются именно с хоста, при подключении к консоли контейнера можно увидеть следующие ошибки и кашу:
/bin/sh: 13: shopt: not found
/bin/sh: 21: shopt: not found
\[\e]0;\u@\h: \w\a\]\u@\h:\w$
Что бы избежать данного поведения сделаем скрипт-хук, который убдет запускаться до lxc-start автоматом и менять симлинки вместо dash на bash
mkdir -p /etc/lxc/hooks # Create hook directory
touch /etc/lxc/hooks/force-bash.sh # Create a hook script
chmod +x /etc/lxc/hooks/force-bash.sh # Make it executable
touch /var/log/lxc-force-bash.log # Create a log.file
chmod 644 /var/log/lxc-force-bash.log # Set premissions
vim /etc/lxc/hooks/force-bash.sh # Edit log.file
Далее вставляем тело скрипта:
В теле скрипта используется дефолтная директория lxc, при определении rootfs. её необходимо сменить на ту директорию, которая фактически является директорией с lxc, узнать можно с помощью команды:
lxc-config lxc.lxcpath
#!/bin/bash
LOG_FILE="/var/log/lxc-force-bash.log" # Define a log-file
CONTAINER_NAME="$1" # Get container name from installer
ROOTFS="/var/lib/lxc/$CONTAINER_NAME/rootfs" # Define rootfs directory.
# WARNING! This is the default lxc directory!
# CHECK `lxc-config lxc.lxcpath` and change the /var/lib/lxc/ accordingly
{
echo "[$(date)] Pre-start hook called"
echo " Container: $CONTAINER_NAME"
echo " Rootfs: $ROOTFS"
if [ ! -d "$ROOTFS" ]; then # Check if Defined ROOTFS directory exists, throw error and exit if it doesn't
echo " ERROR: Rootfs does not exist at: $ROOTFS"
exit 1
fi
TARGET_SH=$(readlink -f "$ROOTFS/bin/sh") # Chech where /bin/sh is linked to inside the container
RELATIVE_SH="${TARGET_SH#$ROOTFS}" # Strip rootfs prefix
echo " /bin/sh resolves to: $RELATIVE_SH"
if [ -e "$ROOTFS/usr/bin/bash" ]; then
if [ "$TARGET_SH" != "$ROOTFS/usr/bin/bash" ]; then # If our path differs from /usr/bin/bash we proceede
echo " Replacing /bin/sh symlink -> bash"
# Backup only if original doesn't exist
if [ ! -e "$ROOTFS/bin/sh.original" ]; then
cp -a "$ROOTFS/bin/sh" "$ROOTFS/bin/sh.original"
fi
rm -f "$ROOTFS/bin/sh" # Removing previous link
ln -s bash "$ROOTFS/usr/bin/sh" # Setting up new correct one
echo " Symlink updated: /usr/bin/sh -> bash"
else
echo " /bin/sh already points to bash, nothing to do"
fi
else
echo " ERROR: /usr/bin/bash not found in container"
fi
echo "done"
} >> "$LOG_FILE" 2>&1
exit 0
Сам по себе хук, лежащий в этой директории безобиден, поэтому нам необходимо сказать lxc что бы он его использовал. Для этого редактируем файл /etc/lxc/default.conf
vim /etc/lxc/default.conf
Добавляем туда строку:
lxc.hook.pre-start = /etc/lxc/hooks/force-bash.sh
после этого контейнер корректно будет запускать shell.
Пробелма возникает из-за того, что контейнер смотрит на параметр $TMPDIR
хоста, и ожидает шаблон /tmp/tmp.XXXXXXXXXX
, но на Alt-Linux по умолчанию включены персонализированные (именные) директории tmp поэтому шаблон так /tmp/.private/root/tmp.XXXXXXXXXX
таких директорий внутри контейнера нет, поэтому получаем ошибку.
Что бы избежать данной проблемы есть 2 способа:
/etc/lxc/default.conf
и добавляем туда строку:lxc.environment = TMPDIR=/tmp
После этого можно переходить к становке воркспейса.
Иногда при запуске вокрспейса на ОС AltLinux 10 можно получить ошибку запуска ссылающуюся на cgroups, это происходит из-за конфликта версий cgroup.
Shell error [1]: lxc-attach: optimacros_3a53fb66804e03d4d242967695c51a8b: attach.c: get_attach_context: 405 Connection refused - Failed to get init pid
lxc-attach: optimacros_3a53fb66804e03d4d242967695c51a8b: attach.c: lxc_attach: 1469 Connection refused - Failed to get attach context
Что бы избежать данной ошибки пы принудительно в манифесте, в блоке container
прописываем cgroup v2:
{
"container": {
"ip": "10.0.3.15",
"cpu": ,
"memory": ,
"ports": {},
"hosts": {},
"cgroup": {
"version": "v2"
}
},
...
}
после этого запуск воркспейса пройдёт без ошибок.