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

読了まで:約1分


そう、モリっと。


昨日、

  • [[Windows 10 Pro を再インストールした]]

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


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

  • [[【新版】Windows Subsystem for Linux で 普通の Archlinux を使う]]

という感じでまとめた手法をほぼそのまま使ったんですが、 とりあえず 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 でモリモリっとパッケージを突っ込みました。

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

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


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

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。