120 lines
3.6 KiB
Bash
120 lines
3.6 KiB
Bash
#!/bin/bash
|
|
|
|
IMAGE_ARCH="e2kv6" # possible values are e2k, e2kv4, e2kv5, e2kv6
|
|
IMAGE_VERSION="20240705"
|
|
IMAGE_PATH="/ALTLinux/images/Sisyphus/docker/docker-$IMAGE_VERSION-$IMAGE_ARCH.tar.xz"
|
|
MIRRORS=("http://elbrus.ivk.ru/pub" "http://setwd.ws/altlinux")
|
|
|
|
QEMU_CONFIGURE_FLAGS="--disable-werror --disable-pie"
|
|
QEMU_CFLAGS="-march=native"
|
|
QEMU_BRANCH="e2k-v9.0.0"
|
|
|
|
CHROOT_DIR="chroot-$IMAGE_ARCH"
|
|
|
|
BINFMT_REGISTER_FLAGS=""
|
|
|
|
# this is taken from qemu's binfmt set up script because I don't want to pollute
|
|
# binfmt_misc with unrelated stuff
|
|
e2k_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xaf\x00'
|
|
e2k_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
|
e2k_old_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x31\x00'
|
|
e2k_old_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
|
|
qemu_target_list="e2k e2k_old"
|
|
|
|
if ! command -v git > /dev/null; then
|
|
echo "To build qemu-e2k, we need to clone git repository. Install git."
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v xz > /dev/null; then
|
|
echo "To unpack ALTLinux Docker image, we need xz. Install it."
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v wget > /dev/null; then
|
|
echo "To download ALTLinux Docker image, we need wget. Install it."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$(uname -m)" == "e2k" ]; then
|
|
echo "This script is for emulating Elbrus and you're already running on this architecture"
|
|
exit 1
|
|
fi
|
|
|
|
echo "WARNING: this script just set ups basic chroot to play with."
|
|
echo "Do not use this in production!\n"
|
|
echo "During installation, you will be asked for root access to properly"
|
|
echo "unpack image and install binfmt_misc rule\n"
|
|
read -p "Did you read and understood the message above? [Yn] " yn
|
|
|
|
case $yn in
|
|
[yY|""] ) echo "Continuing..."; ;;
|
|
[nN] ) echo "Exiting"; exit 0;;
|
|
[*] ) echo "Unrecognized answer"; exit 1;;
|
|
esac
|
|
|
|
set -x
|
|
|
|
git clone https://git.mentality.rip/OpenE2K/qemu-e2k -b $QEMU_BRANCH --depth=1 || exit 2
|
|
pushd qemu-e2k || exit 2
|
|
CFLAGS=${QEMU_CFLAGS} ./configure --target-list=e2k-linux-user --static $QEMU_CONFIGURE_FLAGS || exit 2
|
|
make -j$(nproc) || exit 2
|
|
popd || exit 2
|
|
|
|
for i in "${MIRRORS[@]}"; do
|
|
echo -n "Probing mirror $i..."
|
|
if wget -q -O/dev/null "$i"; then
|
|
SELECTED_MIRROR=$i
|
|
|
|
echo "OK"
|
|
break;
|
|
else
|
|
echo "BAD"
|
|
fi
|
|
done
|
|
|
|
if [ -z "$SELECTED_MIRROR" ]; then
|
|
echo "Can't find working mirror, exiting..."
|
|
exit 2
|
|
fi
|
|
|
|
qemu_register_interpreter() {
|
|
echo "Setting $qemu as binfmt interpreter for $cpu"
|
|
qemu_generate_register | sudo tee /proc/sys/fs/binfmt_misc/register || exit 2
|
|
}
|
|
|
|
qemu_generate_register() {
|
|
flags="${BINFMT_REGISTER_FLAGS}"
|
|
|
|
echo ":qemu-$cpu:M::$magic:$mask:$qemu:$flags"
|
|
}
|
|
|
|
wget -Odocker.txz "$SELECTED_MIRROR$IMAGE_PATH"
|
|
mkdir -p $CHROOT_DIR || exit 2
|
|
pushd $CHROOT_DIR
|
|
sudo tar -xJf ../docker.txz || exit 2
|
|
sudo cp ../qemu-e2k/build/qemu-e2k usr/bin || exit 2
|
|
|
|
# Change default mirror in case if ivk is unreachable (it's kinda stupid to block non-Russian IP addresses, isn't it?)
|
|
if [ "$SELECTED_MIRROR" != "http://elbrus.ivk.ru/pub" ]; then
|
|
sed "s|http://elbrus.ivk.ru/pub|$SELECTED_MIRROR|g" etc/apt/sources.list.d/ivk.list | sudo tee etc/apt/sources.list.d/mirror.list
|
|
|
|
sudo mv etc/apt/sources.list.d/ivk.list etc/apt/sources.list.d/ivk.list.disabled
|
|
fi
|
|
|
|
sudo cp /etc/resolv.conf etc/resolv.conf
|
|
|
|
for cpu in ${qemu_target_list} ; do
|
|
qemu="/usr/bin/qemu-e2k"
|
|
magic=$(eval echo \$${cpu}_magic)
|
|
mask=$(eval echo \$${cpu}_mask)
|
|
qemu_register_interpreter
|
|
done
|
|
popd || exit 2
|
|
|
|
set +x
|
|
|
|
echo "All done."
|
|
echo "Keep in mind, it's up to you to set up binfmt_misc so it doesn't get lost between reboots"
|
|
echo "Now you can do 'sudo chroot $CHROOT_DIR /bin/bash' and have some fun!"
|