WSL Arch 環境をサクっとモリモリ作り直した

そう、モリっと。


昨日、

と書いた様に、 昨日に Windows 10 Pro を再インストールとかしてたんですが、 その影響で WSL Arch も再構築になったんで、とりあえずその辺りの話を書きます。


まあ、 WSL Arch 環境の作り方としては、 僕が Development 系 Qiita の個人的代用として作った do:kalaclism と言うはてなブログの方に、

という感じでまとめた手法をほぼそのまま使ったんですが、 とりあえず rootfs を作る際の helper script がイケてなかったよなーと思ってたので、 その辺りは書き直していました。まあ使い方はほぼ一緒ですが。

で、その際に作り直した helper script は下記になります:

#!/usr/bin/zsh

set -e -u -o pipefail

autoload -Uz colors; colors

function has() {
which "${1}" 2>&1 >/dev/null
}

function msg() {
echo "${fg green }====> ${reset_color}${1}"
}

function file-pacman-conf() {
cat <<EOF
options 
Architecture = auto
Color
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
IgnorePkg = cryptsetup device-mapper dhcpcd jfsutils linux lvm2 mdadm netctl pciutils pcmciautils reiserfsprogs s-nail systemd-sysvcompat usbutils xfsprogs grep strace procps-ng
core 
Include = /etc/pacman.d/mirrorlist
extra 
Include = /etc/pacman.d/mirrorlist
community 
Include = /etc/pacman.d/mirrorlist
EOF
}

function file-libmockchroot-c() {
# copied from https://gist.githubusercontent.com/RoliSoft/84813cc353caec614dee8bf74c1b09ef/raw/409978e320084e645b60d86dff7775dc06e9bc1e/libmockchroot.c
cat <<EOF
#define _GNU_SOURCE
#include <unistd.h>
#include <libgen.h>
#include <dlfcn.h>
#include <linux/limits.h>
#include <string.h>
int chroot(const char *path)
{
// return 0 for pacman
char dest PATH_MAX ;
if (readlink("/proc/self/exe", dest, PATH_MAX) != -1) {
char* file = basename(dest);
if (strcmp(file, "pacman") == 0) {
return 0;
}
}
// passthrough for others,
// currently results in -1 and errno=38
int (*_chroot)(const char*);
_chroot = dlsym(RTLD_NEXT, "chroot");
return (*_chroot)(path);
}
EOF
}

function action-pacman-keyring() {
pacman-key --init
pacman-key --populate archlinux
}

function action-pacman-sync() {
pacman -Sy
}

function action-pacman-install() {
pacman --noconfirm --needed ${@:-}
}

function action-install-libmockchroot() {
test -d $HOME/tmp || mkdir -p $HOME/tmp
cd $HOME/tmp

action-pacman-install -S gcc

file-libmockchroot-c >libmockchroot.c
gcc libmockchroot.c -shared -fPIC -ldl -o /lib64/libmockchroot.so
echo "/lib64/libmockchroot.so" >>/etc/ld.so.preload
}

function main-bootstrap-rootfs() {
msg "Initialize pacman keyring"
action-pacman-keyring

msg "Initialize pacman database"
action-pacman-sync

msg "Install libmockchroot.so"
action-install-libmockchroot

msg "Bootstrap rootfs for Archlinux"
test -d $HOME/rootfs_arch || mkdir -p $HOME/rootfs_arch
test -d $HOME/tmp || mkdir -p $HOME/tmp
cd $HOME/tmp
file-pacman-conf > wslarch.conf
pacstrap -C wslarch.conf -c -d -G -i $HOME/rootfs_arch base base-devel git po4a

msg "Done. Please replace your rootfs by $HOME/rootfs_arch from Windows side."
}

function main-postinstall-rootfs() {
msg "Initialze pacman keyring"
file-pacman-conf >/etc/pacman.conf
action-pacman-keyring

msg "Install libmockchroot.so"
action-install-libmockchroot

msg "Install fakechroot"
action-pacman-install -S fakechroot
echo '/usr/lib/libfakeroot/fakechroot/libfakechroot.so' >/etc/ld.so.preload
pacman --noconfirm -Su
pacman-db-upgrade

msg "Reinstall ca-certificates"
pacman --noconfirm -R ca-certificates-mozilla ca-certificates
pacman --noconfirm -S ca-certificates
cp /etc/ca-certificates/extracted/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt

msg "Downgrade some packages"
pacman --noconfirm -U https://archive.archlinux.org/packages/g/grep/grep-2.26-1-$(uname -m).pkg.tar.xz
pacman --noconfirm -U https://archive.archlinux.org/packages/s/strace/strace-4.14-1-$(uname -m).pkg.tar.xz
pacman --noconfirm -U https://archive.archlinux.org/packages/p/procps-ng/procps-ng-3.3.9-3-$(uname -m).pkg.tar.xz

msg "Some fix for UTF-8 locales"
if test -e /usr/share/i18n/charmaps/UTF-8.gz ; then
if ! has gzip ; then
action-pacman-install -S gzip
fi

gzip -d /usr/share/i18n/charmaps/UTF-8.gz
fi

test -e /etc/locale.gen && rm /etc/locale.gen
echo 'en_US.UTF-8 UTF-8' >/etc/locale.gen
locale-gen

msg "Re-Install fakeroot with change compile options"
test -d $HOME/tmp || mkdir -p $HOME/tmp
cd $HOME/tmp

cat <<'EOF' >/usr/bin/fakeroot
#!/bin/bash
if  [ "$1" == "v"  ] ; then
echo "1.0"
exit
fi
export FAKEROOTKEY=1
exec "${@}"
unset FAKEROOTKEY
EOF
chmod +x /usr/bin/fakeroot
export PATH="/usr/bin/core_perl:/usr/bin/vendor_perl:$PATH"

git clone git://git.archlinux.org/svntogit/packages.git \
--depth=1 \
--branch=packages/fakeroot
cd packages/trunk

sed -i 's/--with-ipc=sysv$/--with-ipc=tcp/' PKGBUILD
sed -i 's/EUID\s*==\s*0/EUID == 99999/' /usr/bin/makepkg
makepkg -si --noconfirm
sed -i 's/EUID\s*==\s*99999/EUID == 0/' /usr/bin/makepkg
sed -i -e 's/IgnorePkg\s*=/IgnorePkg = fakeroot /' -e 's/^\s*#\s*IgnorePkg/IgnorePkg/' /etc/pacman.conf

rm -rf $HOME/tmp

msg "Done."

# sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /usr/share/dbus-1/session.conf
}

# main

umask 022
export LANG="C.UTF-8"

case "${1:-}" in
bootstrap)    main-bootstrap-rootfs   ;;
postinstall)  main-postinstall-rootfs ;;
*)
echo "Usage: ${0}  bootstrap|postinstall " 2>&1
exit 1
;;
esac

あとはまあ、WSL Arch の rootfs をサックリと作った後、 モリっと Syncthing とか Yaourt をセットアップしてから、 dotfiles の packgage installer script でモリモリっとパッケージを突っ込みました。

で、割と短時間で環境構築まで一括で出来たんで、個人的には満足なんですが、 いかんせんこの環境でモノを開発する作業自体があんまり出来てないんで、 その辺りいかんよなーとか思っています。はい。

まあでもこの辺り、先月に来たキャッツ達が家の子になって、 その後自分がキャッツの居る環境にようやく馴染め初めた影響も有るんで、 あんまりくよくよしてもしゃーないよなーとは思ってはいますが。


という事で今日の話は以上です。 もうそろそろ寝る時間となったので終わります。はい。

nyarlaが大体

Scrapbox.io でコメントや意見を書く