電波ビーチ

☆(ゝω・)v

win11でwslを1から2にアップデートできないときにやったこと

経緯

wsl2でGUIアプリが使いたくなったので、放置していたwsl1をアップデートしようと試みた。

wsl --list --verbose
  NAME                      STATE           VERSION
* Ubuntu-20.04              Stopped         1
  Ubuntu-20.04-sandbox01    Stopped         2

これである。試すだけなら新しくいれればいいのだが、再度アプリをインストールするのが面倒なので、今回はアップデートしたいのである。アップデートは公式の方法によると以下 f:id:or3:20220115123113p:plain

そしてsudo apt updateしたのち、とりあえずsudo apt install gedit -yとしてテストがてらgeditを使おうとしたらば

$ gedit
Unable to init server: Could not connect: Connection refused

(gedit:7785): Gtk-WARNING **: 10:34:52.171: cannot open display:

などと言われおる。検索して10個ほど読んだが有益そうな情報はなかったため、今度はsudo apt install x11-apps -yとしてxeyesを使おうとした

$ xeyes
Error: Can't open display:

いずれもインストール時・アップデート時はSucces!もFailed!も言われていない。ここにきてなんかおかしいな~と思い、wsl --updateしてから確認してなかったのだがバージョンを再度みてみると

wsl --list --verbose
  NAME                      STATE           VERSION
* Ubuntu-20.04              Stopped         1
  Ubuntu-20.04-sandbox01    Stopped         2

変わっとらんやないかい!ということでwslをアップデートするコマンドを実行

wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
ディストリビューションのエクスポートが失敗しました。
: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket: tar format cannot archive socket

なんか無限にtar format cannot archive socketが出力されとる......

やったこと

/tmpを消す・--exportを使う・bsdtarを使う

ここにそう書いてあったので試した

github.com

まず/tmpを消すことについて。どうやらvscodeRemote-WSLでWSL環境を使うたびにソケットファイルが作成される?らしい。なんかたくさん残っていた

f:id:or3:20220116133033p:plain

それ以外のファイルやフォルダもあるが、まとめてrm /tmp/ -rで消した。そうすると無限に出力されるのは解決されたが、エラーメッセージなどなにひとつ出ずに「ディストリビューションのエクスポートが失敗しました」と出て以前解決されず。

次にwslコマンドのオプションである、--exportを使って環境をまるごと吐き出し、--importかつ--version 2を使うことでWSL2として読み込む方法である。ヘルプの内容は以下 f:id:or3:20220116134152p:plain

しかしこれでも「ディストリビューションのエクスポートに失敗しました。」というエラーが出て失敗する。エラーメッセージは無い。失敗してもtar.gzで固めたファイルができているがどうせ失敗している。本来ならこれを--importする際にバージョンを指定してやることができるらしい。

ここで、さきほどのissuesでは、exportではなく直接tarにするコマンドを使って成功したという。以下のようなやつ。適宜変更する。

PS C:\Users\XXX> wsl sudo /mnt/c/Windows/System32/lxss/tools/bsdtar --exclude="/dev/*" --exclude="/proc/\*" --exclude="/sys/\*" --exclude="/tmp/\*" --exclude="/run/\*" --exclude="/mnt/\*" --exclude="/media/\*" --exclude="/lost+found/\*" --exclude="\*\*/node_modules/\*" -C / --xattrs --one-file-system -czpvf '/mnt/c/Users/XXX/WLinux-full.tar.gz' 

わたしの場合はこれをしても失敗し、出来損ないのtarballが出来上がっただけであった。

ファイルサイズを減らす

今まで使っていたWSLはメディアファイル(動画や音楽ファイル)をDLしたり、適宜ffmpegで変換したりする目的で使うのが主であった。それらのファイル総量がわりとでかいことになっていた

f:id:or3:20220116135523p:plain

もうアップデートするのは諦めて、最悪WSL2環境を作ってこのディレクトリだけ移してやればいいか、と思い、一旦WSLの外に移動したあと、試しに変換してみた。

f:id:or3:20220116135701p:plain

なぜかあっさりとうまくいった......何故...... ちゃんとGUIアプリも動いた。

f:id:or3:20220116141156p:plain

原因はわからないが、同じような問題に直面したときは、とりあえず巨大なファイルやフォルダは一旦逃して試してみるのも手ということにしておく