Начиная с версии базовой системы FreeBSD 12.2 появилась возможность использовать linuxulator для запуска Linux-приложений не только в стандартном пользовательском окружении на базе CentOS, но и в пользовательском окружении на базе Ubuntu. Поэтому в Ульяновск.BSD теперь можно установить некоторые приложения, версий которых для FreeBSD нет. Это, например, Chromium ГОСТ от КриптоПро, Яндекс.Браузер и Google Chrome с поддержкой Widevine (Netflix, Spotify, Amazon Prime Video, HBO Max и т.д.) и поддержкой российских криптографических плагинов.
Установка и настройка Ubuntu-окружения:
Для начала необходимо создать точки монтирования, требующиеся для правильной работы linuxulator:
mkdir -p /compat/ubuntu/{dev/fd,dev/shm,home,proc,sys,tmp}
Подмонтировать соответствующие файловые системы:
mount -t linprocfs linprocfs /compat/ubuntu/proc
mount -t linsysfs linsysfs /compat/ubuntu/sys
mount -t devfs devfs /compat/ubuntu/dev
mount -o linrdlnk -t fdescfs fdescfs /compat/ubuntu/dev/fd
mount -o mode=1777 -t tmpfs tmpfs /compat/ubuntu/dev/shm
mount -t nullfs /home /compat/ubuntu/home
mount -t nullfs /tmp /compat/ubuntu/tmp
И установить необходимые пакеты:
pkg install -r latest debootstrap linux-steam-utils
После этого можно приступить к установке и настройке Linux-окружения на базе Ubuntu (версия bionic или focal):
debootstrap --arch=amd64 --no-check-gpg focal /compat/ubuntu
printf 'deb http://archive.ubuntu.com/ubuntu/ focal multiverse main universe restricted\n' > /compat/ubuntu/etc/apt/sources.list
printf 'deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse\n' >> /compat/ubuntu/etc/apt/sources.list
printf 'deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse\n' >> /compat/ubuntu/etc/apt/sources.list
printf '0.0 0 0.0\n0\nUTC\n' > /compat/ubuntu/etc/adjtime
Далее необходимо сделать следующее исправление:
cd /compat/ubuntu/lib64/
rm ./ld-linux-x86-64.so.2
ln -s ../lib/x86_64-linux-gnu/ld-2.31.so ld-linux-x86-64.so.2
Во время настройки локали необходимо выбрать en_US.UTF-8 и ru_RU.UTF-8, а в качестве локали по умолчанию выбрать ru_RU.UTF-8:
chroot /compat/ubuntu /bin/bash
dpkg-reconfigure locales
dpkg-reconfigure tzdata
apt update
apt upgrade
apt install -y pulseaudio
apt install -y fonts-symbola
apt install -y ttf-mscorefonts-installer
exit
Если предполагается подключение к разным провайдерам, то в файл /compat/ubuntu/etc/resolv.conf необходимо внести хотя бы один постоянно доступный публичный DNS-сервер. Например, 8.8.8.8. Помните, что всего записей в этом файле должно быть не более трёх.
Так как Ubuntu-окружение устанавливается в каталог /compat/ubuntu/, а стандартным для Linux-окружения является каталог /compat/linux/, то необходимо предусмотреть возможность переключения между Linux-окружениями. Для этого можно создать скрипт /usr/local/etc/rc.d/ubuntu следующего содержания:
#!/bin/sh
# PROVIDE: ubuntu
# REQUIRE: linux
. /etc/rc.subr
name="ubuntu"
desc="Enable Ubuntu Linux environment"
rcvar=ubuntu_enable
start_cmd="${name}_start"
stop_cmd="${name}_stop"
load_rc_config $name
: ${ubuntu_enable:="NO"}
_emul_path="/compat/ubuntu"
unmounted()
{
[ `stat -f "%d" "$1"` == `stat -f "%d" "$1/.."` -a \
`stat -f "%i" "$1"` != `stat -f "%i" "$1/.."` ]
}
ubuntu_start()
{
if checkyesno linux_mounts_enable; then
mkdir -p ${_emul_path}/proc
mkdir -p ${_emul_path}/sys
mkdir -p ${_emul_path}/dev/fd
mkdir -p ${_emul_path}/dev/shm
mkdir -p ${_emul_path}/home
mkdir -p ${_emul_path}/tmp
unmounted "${_emul_path}/proc" && mount -t linprocfs linprocfs "${_emul_path}/proc"
unmounted "${_emul_path}/sys" && mount -t linsysfs linsysfs "${_emul_path}/sys"
unmounted "${_emul_path}/dev" && mount -t devfs devfs "${_emul_path}/dev"
unmounted "${_emul_path}/dev/fd" && mount -o linrdlnk -t fdescfs fdescfs "${_emul_path}/dev/fd"
unmounted "${_emul_path}/dev/shm" && mount -o mode=1777 -t tmpfs tmpfs "${_emul_path}/dev/shm"
unmounted "${_emul_path}/home" && mount -t nullfs /home "${_emul_path}/home"
unmounted "${_emul_path}/tmp" && mount -t nullfs /tmp "${_emul_path}/tmp"
true
fi
sysctl compat.linux.emul_path=${_emul_path}
}
ubuntu_stop()
{
if checkyesno linux_mounts_enable; then
! unmounted "${_emul_path}/proc" && umount "${_emul_path}/proc"
! unmounted "${_emul_path}/sys" && umount "${_emul_path}/sys"
! unmounted "${_emul_path}/dev/fd" && umount "${_emul_path}/dev/fd"
! unmounted "${_emul_path}/dev/shm" && umount "${_emul_path}/dev/shm"
! unmounted "${_emul_path}/dev" && umount "${_emul_path}/dev"
! unmounted "${_emul_path}/home" && umount "${_emul_path}/home"
! unmounted "${_emul_path}/tmp" && umount "${_emul_path}/tmp"
true
fi
sysctl compat.linux.emul_path=/compat/linux
}
load_rc_config $name
run_rc_command "$1"
И сделать этот скрипт исполняемым:
chmod +x /usr/local/etc/rc.d/ubuntu
Теперь можно переключиться в Ubuntu-окружение следующей командой:
service ubuntu onestart
В случае, если потребуется переключиться на стандартное Linux-окружение, то можно воспользоваться следующей командой:
service ubuntu onestop
Если предполагается постоянное использование Ubuntu-окружения, то в файл /etc/rc.conf можно добавить следующую запись:
ubuntu_enable="YES"
Важно помнить, что для работы linuxulator в файле /etc/rc.conf обязательно должна присутствовать следующая запись:
linux_enable="YES"
Для того, чтобы в устанавливаемых в Ubuntu-окружениии приложениях работал звук, необходимо использовать сервер pulseaudio. Для его запуска можно создать скрипт /compat/ubuntu/usr/local/bin/pulseaudio следующего содержания:
#!/bin/sh
get_pa_sock_path()
{
PA_SOCK_PATH=$(sockstat | awk -v me=$(whoami) -F'[ \t]+' '
$1 == me && $2 == "pulseaudio" && $6 ~ /native/ {
print $6;
exit 0
}'
)
}
get_pa_sock_path
if [ ! -S "$PA_SOCK_PATH" ]; then
while killall pulseaudio; do
sleep 0.5
done
pulseaudio --start
get_pa_sock_path
fi
[ -S "$PA_SOCK_PATH" ] && export PULSE_SERVER=unix:$PA_SOCK_PATH
START_SCRIPT=$1
shift
$START_SCRIPT $*
И сделать этот скрипт исполняемым:
chmod +x /compat/ubuntu/usr/local/bin/pulseaudio
Теперь можно переходить к установке приложений.
Установка Chromium ГОСТ:
Свежую версию Chromium ГОСТ можно скачать на сайте КриптоПро по ссылке https://update.cryptopro.ru/chromium-gost/. На момент создания данного документа это файл chromium-gost-88.0.4324.96-linux-amd64.deb. Для установки необходимо выполнить следующие команды:
fetch -o /tmp/chromium-gost.deb https://update.cryptopro.ru/chromium-gost/chromium-gost-88.0.4324.96-linux-amd64.deb
chroot /compat/ubuntu /bin/bash
apt install -y /tmp/chromium-gost.deb
exit
Далее необходимо создать скрипт запуска /compat/ubuntu/usr/local/bin/chromium-gost следующего содержания:
#!/compat/ubuntu/bin/bash
export START_PATH="/opt/chromium-gost/chrome"
export CHROME_WRAPPER="`readlink -f "$0"`"
export LD_LIBRARY_PATH=/usr/local/steam-utils/lib64/fakeudev:/compat/ubuntu/lib/x86_64-linux-gnu:/compat/ubuntu/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/local/steam-utils/lib64/webfix/webfix.so
export LIBGL_DRI3_DISABLE=1
exec -a "$0" "$START_PATH" --no-sandbox --no-zygote --in-process-gpu --test-type --v=0 "$@"
И сделать этот скрипт исполняемым:
chmod +x /compat/ubuntu/usr/local/bin/chromium-gost
В завершении необходимо создать ярлык для запуска /usr/local/share/applications/chromium-gost.desktop:
[Desktop Entry]
Type=Application
Version=1.0
Encoding=UTF-8
Name=Chromium GOST
Name[ru]=Chromium ГОСТ
Comment=Web browser based on Chromium with GOST cryptography
Comment[ru]=Веб-браузер на основе Chromium с криптографией ГОСТ
Icon=/compat/ubuntu/opt/chromium-gost/product_logo_256.png
Exec=/compat/ubuntu/usr/local/bin/pulseaudio /compat/ubuntu/usr/local/bin/chromium-gost %U
Categories=Network;WebBrowser
MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
StartupNotify=true
Установка Google Chrome:
Для установки Google Chrome необходимо выполнить следующие команды:
printf "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /compat/ubuntu/etc/apt/sources.list.d/google-chrome.list
fetch -o /tmp/ https://dl.google.com/linux/linux_signing_key.pub
chroot /compat/ubuntu /bin/bash
apt install -y gnupg
apt-key add /tmp/linux_signing_key.pub
apt update
apt install -y google-chrome-stable
exit
Далее необходимо создать скрипт запуска /compat/ubuntu/usr/local/bin/google-chrome следующего содержания:
#!/compat/ubuntu/bin/bash
export START_PATH="/opt/google/chrome/chrome"
export CHROME_WRAPPER="`readlink -f "$0"`"
export LD_LIBRARY_PATH=/usr/local/steam-utils/lib64/fakeudev:/compat/ubuntu/lib/x86_64-linux-gnu:/compat/ubuntu/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/local/steam-utils/lib64/webfix/webfix.so
export LIBGL_DRI3_DISABLE=1
exec -a "$0" "$START_PATH" --no-sandbox --no-zygote --in-process-gpu --test-type --v=0 "$@"
И сделать этот скрипт исполняемым:
chmod +x /compat/ubuntu/usr/local/bin/google-chrome
В завершении необходимо создать ярлык для запуска /usr/local/share/applications/google-chrome.desktop:
[Desktop Entry]
Type=Application
Version=1.0
Encoding=UTF-8
Name=Google Chrome
Name[ru]=Google Chrome
Comment=Web browser based on Chromium
Comment[ru]=Веб-браузер на основе Chromium
Icon=/compat/ubuntu/opt/google/chrome/product_logo_256.png
Exec=/compat/ubuntu/usr/local/bin/pulseaudio /compat/ubuntu/usr/local/bin/google-chrome %U
Categories=Network;WebBrowser
MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
StartupNotify=true
Установка Яндекс.Браузера:
Свежую версию Яндекс.Браузера можно скачать на сайте https://browser.yandex.ru. Для установки необходимо выполнить следующие команды:
fetch -o /tmp/Yandex.deb "https://browser.yandex.ru/download/?os=linux&x64=1&package=deb"
chroot /compat/ubuntu /bin/bash
apt install -y xz-utils
apt install -y /tmp/Yandex.deb
exit
Далее необходимо создать скрипт запуска /compat/ubuntu/usr/local/bin/yandex-browser следующего содержания:
#!/compat/ubuntu/bin/bash
export START_PATH="/opt/yandex/browser/yandex_browser"
export CHROME_WRAPPER="`readlink -f "$0"`"
export LD_LIBRARY_PATH=/usr/local/steam-utils/lib64/fakeudev:/compat/ubuntu/lib/x86_64-linux-gnu:/compat/ubuntu/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=/usr/local/steam-utils/lib64/webfix/webfix.so
export LIBGL_DRI3_DISABLE=1
exec -a "$0" "$START_PATH" --no-sandbox --no-zygote --in-process-gpu --test-type --v=0 "$@"
И сделать этот скрипт исполняемым:
chmod +x /compat/ubuntu/usr/local/bin/yandex-browser
В завершении необходимо создать ярлык для запуска /usr/local/share/applications/yandex-browser.desktop:
[Desktop Entry]
Type=Application
Version=1.0
Encoding=UTF-8
Name=Yandex.Browser
Name[ru]=Яндекс.Браузер
Comment=Web browser based on Chromium
Comment[ru]=Веб-браузер на основе Chromium
Icon=/compat/ubuntu/opt/yandex/browser/product_logo_256.png
Exec=/compat/ubuntu/usr/local/bin/pulseaudio /compat/ubuntu/usr/local/bin/yandex-browser %U
Categories=Network;WebBrowser
MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
StartupNotify=true
Примечание 1:
Пакет debootstrap позволяет установить верии Ubuntu bionic или focal. Чтобы обновиться до более поздней версии (например, jammy) необходимо выполнить следующие команды:
chroot /compat/ubuntu /bin/bash
do-release-upgrade -d
rm /run/reboot-required*
exit
Далее необходимо сделать следующее исправление:
cd /compat/ubuntu/lib64/
rm ./ld-linux-x86-64.so.2
ln -s ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2
После этого желательно перезагрузить машину.
Примечание 2:
Для обновления приложений в Ubuntu-окружении можно использовать следующую последовательность команд:
chroot /compat/ubuntu /bin/bash
apt update
apt list --upgradable
apt upgrade
apt autoremove
apt clean
exit
Примечание 3:
Команды, используемые для удаления пакетов в Ubuntu-окружении:
dpkg --list | grep <package-name> - определение полного имени пакета <package-name>
apt remove <package-name> - удаление пакета <package-name>
apt purge <package-name> - удаление пакета <package-name> и его конфигурационных файлов
apt autoremove - удаление ненужных пакетов
apt clean - очистка кэша от устаревших пакетов