wsl2でubuntuのデスクトップ表示までの手順ログ

WSL2を使ってubuntuのデスクトップを表示。 デスクトップ表示はVcXsrv(Xサーバ)Windowsに入れて表示するサイトが多いが 以下の参考サイトのとおりRDP(リモートデスクトップ)でいいのではないかと私も思う。

参考サイト: WSL2+ubuntu20.04: GUI化して使う方法

インストール

1. WSL2を有効にする

管理者でPowerShellを開いて以下を実行。

PS C:\windows\system32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.844

イメージのバージョン: 10.0.19042.867

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
PS C:\windows\system32>
PS C:\windows\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.844

イメージのバージョン: 10.0.19042.867

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
PS C:\windows\system32>

再起動する。

参考サイト: やさしいWSL2のインストール手順とエラー

2. WSL2をアップグレード

Windows 10 用 Windows Subsystem for Linux のインストール ガイド の「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」のリンクから。

3. WSL2をデフォルトに設定

PS C:\windows\system32> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
PS C:\windows\system32>

4. ubuntuのインストール

Microsoft Storeからubuntuで検索し、「Ubuntu 20.04 LTS」をインストール。 インストール終了後、Windowsの通知がポップアップするので「起動」してみる。 最初なのでubuntuのデフォルトアカウントを作成する。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: foobar
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)
....
~$

PowerShellで確認。

PS C:\windows\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
PS C:\windows\system32>

5. Windows ターミナルをインストール

便利なんでインストールしちゃう。 Microsoft Storeからterminalで検索し、Windows Terminalをインストール。

docs.microsoft.com

6. ubuntuのdesktop環境

参考にしたサイトではapt -y install xfce4としているが できるだけ軽いものをインストールしたくて とりあえずsudo apt install lxde lxde-common lxsession-logoutとした。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt install lxde lxde-common lxsession-logout
yを入力

7. xrdpの設定

$ sudo apt-get install xrdp
yを入力
$ sudo update-rc.d -f xrdp defaults
$ cd /etc/xrdp
$ sudo wget http://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
$ sudo mv km-e0010411.ini km-0411.ini
$ sudo chmod 644 km-0411.ini
$ sudo ln -s km-0411.ini km-e0010411.ini
$ sudo ln -s km-0411.ini km-e0200411.ini
$ sudo ln -s km-0411.ini km-e0210411.ini
$ sudo cp -ip xrdp.ini xrdp.ini_sv20210404
$ sudo vi xrdp.ini
port=3389から3390に変更
max_bpp=32から128に変更
$ sudo service xrdp restart

8. firefoxのインストール

$ sudo apt -y install firefox

9. 日本語表示・入力設定

sudo apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc fcitx fcitx-mozc
sudo update-locale LANG=ja_JP.UTF8

日本語は「半角/全角」キーで切り替え。

10. xrdpが起動していない。

SELinux辺りのせいで自動起動がenableになっていても起動していないとの情報もあるが SELinuxになっていないのになぜなのか今のところ不明。

$ systemctl list-unit-files -t service
....
xrdp-sesman.service     enabled enabled
xrdp.service            enabled enabled
$ service xrdp status
 * xrdp-sesman is not running
 * xrdp is not running
$ 

とりあえず起動時にxrdpを起動するように/etc/profileに追加して パスワードなしで起動するよう/etc/sudoersに追加する方法で回避。

$ sudo vi /usr/local/sbin/service_start.sh
#!/bin/sh

# xrdp
retval=$(service xrdp status >/dev/null 2>&1; echo $?)
if [ ! $retval -eq "0" ]; then
    service xrdp start
fi
$ sudo chmod 755 /usr/local/sbin/service_start.sh
$ sudo vi /etc/sudoers
# 以下を追加(先頭はユーザ名)
foo   ALL=(ALL:ALL) NOPASSWD: /usr/local/sbin/service_start.sh
$ sudo vi /etc/profile
# 以下を最後に追加
sudo /usr/local/sbin/service_start.sh

参考サイト: WSL2 でデスクトップ環境(xfce4)

11. No session for pid XXXの対処

RDPで接続するとNo session for pid XXXというダイアログを表示する。 XXXのPIDはlxpolkitというプロセスで、これは https://wiki.archlinux.jp/index.php/Polkit には、

polkit は非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。

と記載されているもののLXDE版(man lxpolkit)。 本家は https://gitlab.freedesktop.org/polkit/polkit/ にあり。 どうにかならないかと思ったが以下で対処。

  1. RDPでLXDEに接続してメニューから「設定」「LXSessionのデフォルトのアプリケーション」を選択。
  2. 「コアアプリケーション」を選択して「Polkitエージェント」にlxpolkitが入力されているので消去。

参考サイト: https://note.com/catmanp/n/nd53ac1e47d7c

12. その他

メモリ制限

.wslconfigにメモリの制限を入れておかないとどんどん増えるらしい。

C:\User\foo> type .wslconfig
[wsl2]
memory=8G
C:\User\foo>

参考サイト: WSL2(Ubuntu18.04 LTS)をセットアップしてDocker(on Ubuntu)とGUIアプリを使う

systemdの問題

WSL2ではpid=1がsystemdでなくinitとのこと。そのため、 systemctlなどでsystemdを使用する場合は失敗してしまう。 解決策の一つとしてgenieをインストールするらしいが現状何もしない。

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: ホストが落ちています

参考サイト: WSL2でSystemdを使うハック

音がならない

今のところ、tcp経由で出力してwindows側で受け取るようにする方法(PulseAudio)があるとのこと。 windowsubuntu側双方の設定が必要。やはり/dev/*でなんとかならないのか。これからを期待して、ここでは設定しない。

参考サイト:

WSL2+Ubuntu 20.04LTSでデスクトップ(xfce4)を表示する。

WSL2+Ubuntu 20.04環境から音声を出力する

ところが、この後の次期Windowsアップデート(2021年4月21日のWindows 10 Insider Preview Build 21364(CO_RELEASE))では RDP経由みたいなことをしなくてもGUIツールが起動できるようになるらしい。 この記事ではaudioツールを動かしているので音問題も解消されそうだし、 GUI画面出すまでの面倒なことがなくなりとてもいい感じになりそう。

https://forest.watch.impress.co.jp/docs/news/1320369.html

Chromeをインストール

wgetをインストールし、公開鍵の登録とリポジトリの追加後、Google Chromeのインストール。

sudo apt install wget
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo apt update
sudo apt install google-chrome-stable

終了方法

PS C:\windows\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
PS C:\windows\system32> wsl --shutdown
PS C:\windows\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
PS C:\windows\system32>

その他の参照

open-vm-toolsのインストール

VMware Fusion上のubuntuをupgrade(18.04 LTS)したらホストとゲスト間のファイルコピーができなくなっていたので VMware Toolsをインストールしようと思ったら、VMwareの「仮想マシン」の「VMware Toolsの再インストール」が 選択できなくなっていた。最近はvmware-toolsはopen-vm-toolsになっているとのこと。

今どきVMwareでゲストOSを入れたら、VMware Toolsじゃくてopen-vm-toolsらしい

随分触っていなかったんだけどそんなことになっていたんですね。知らなかった。 なのでインストールしてみた。

$ sudo apt-get install open-vm-tools

しかし、以下のようなエラーが発生。

dpkg: パッケージ systemd-shim の処理中にエラーが発生しました (--remove):

そこで以下のサイトを参考にやってみる。

dpkgやapt-get関連でエラーが出た時の対処法 【LIVA】【Ubuntu server14.04】apt-getでエラー発生(post-installationスクリプトエラー)

~$ sudo dpkg --audit
以下のパッケージはインストール時に問題が発生したため、インストールが完了して
いません。再度行えばインストールが完了する場合があります:
これらのパッケージは dselect か dpkg --remove を使用して削除できます:
 systemd-shim         shim for systemd

apt-getでも同じエラーだったんだけどな。一応やってみよう。

~$ sudo dpkg --remove systemd-shim
(データベースを読み込んでいます ... 現在 244985 個のファイルとディレクトリがインストールされています。)
systemd-shim (9-1bzr4ubuntu1) を削除しています ...
'systemd-shim による /usr/share/dbus-1/system-services/org.freedesktop.systemd1.service から /usr/share/dbus-1/system-services/org.freedesktop.systemd1.service.systemd への退避 (divert)' を削除しています
dpkg-divert: エラー: 名前変更は `/usr/share/dbus-1/system-services/org.freedesktop.systemd1.service' を異なるファイル `/usr/share/dbus-1/system-services/org.freedesktop.systemd1.service.systemd' で上書きすることを伴います。
これは許可されていません。
dpkg: パッケージ systemd-shim の処理中にエラーが発生しました (--remove):
 installed systemd-shim package post-removal script subprocess returned error exit status 2
処理中にエラーが発生しました:
 systemd-shim

やっぱ同じで削除できない。 なので/var/lib/dpkg/info配下のパッケージ名.{postinst,postrm,prerm}を削除。

~$ cd /var/lib/dpkg/info
/var/lib/dpkg/info$ ls | grep systemd-shim
systemd-shim.list
systemd-shim.md5sums
systemd-shim.postinst
systemd-shim.postrm
systemd-shim.preinst
systemd-shim.prerm
/var/lib/dpkg/info$ sudo rm systemd-shim.postinst systemd-shim.postrm systemd-shim.prerm 

で再度インストール。

/var/lib/dpkg/info$ sudo apt-get install open-vm-tools

おかげでインストール成功。再起動後ホストとゲスト間のファイルコピーができることを確認。

Macのフォルダを共有

WindowsからMacのファイルを持ってくる場合ポータブルHDDはWindowsで認識しないため、 簡単に済ませるにはUSBメモリを使用するぐらいしかないが、ファイルサイズが大きい場合などは使用できない。

そのためMacのフォルダを共有する。

方法

1. システム環境設定を開き「共有」を選択

システム環境設定の共有を選択

2. 「ファイル共有」をチェックして「オプション」を選択

ファイル共有をチェックしてオプションを選択

3. 「SMBを使用してファイルやフォルダを共有」をチェック

また、Windowsからアクセスする際のユーザアカウントをチェックする。 SMBを使用してファイルやフォルダを共有

4. Windowsエクスプローラから「¥¥MacのIPaddress¥」でアクセス

ユーザ/パスワードを聞かれた場合はMacで指定したアカウントのユーザ/パスワードを入力。

テーブルスペースの削除

テーブルスペースを削除する際に実際のデータファイルも削除するとき、 [INCLUDING CONTENTS]のあとに[AND DATAFILES]をつける([AND DATAFILES]だけでは削除文として成立しない)。

表領域のオブジェクト、実際のデータファイル、参照整合性制約も削除。

SQL> DROP TABLESPACE INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_9004.htm

Oracle アーカイブログモードの確認

アーカイブログ(archive log)モードかどうかを確認する。SYS権限でログインして以下を実行。

SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG

noarchive logモードであれば、NOARCHIVELOGと出力。

以下のサイトが詳しい。

ORACLE アーカイブログモード確認

PL/SQLの添字配列の値が配列

何度やっても忘れちまうんで備忘録。

ちなみにPL/SQLの通常の配列インデックスは1オリジン参考

SET SERVEROUTPUT ON

--
-- 添字配列の値が配列の例
--
DECLARE
  TYPE tNameArray IS VARRAY(2) OF VARCHAR2(128);
  TYPE tSoejiArray IS TABLE OF tNameArray INDEX BY VARCHAR2(6);
  vTargetArray tSoejiArray;
  vKey         VARCHAR2(6);

  -- 配列初期設定
  PROCEDURE initArray(P_ARRAY OUT tSoejiArray) IS
  BEGIN
    p_ARRAY('000001') := tNameArray('ラーメン’、’らあめん');
    p_ARRAY('000002') := tNameArray('つけ麺’、’つけめん');
  END;

BEGIN
  initArray(vTargetArray);

  DBMS_OUTPUT.PUT_LINE('コード,名前,ふりがな');
  vKey := vTargetArray.FIRST;
  WHILE vKey IS NOT NULL LOOP
    DBMS_OUTPUT.PUT_LINE(vKey || ',' || vTargetArray(vKey)(1) || ',' || vTargetArray(vKey)(2));
    vKey := vTargetArray.NEXT(vKey);
  END LOOP;

EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('その他エラー');
    DBMS_OUTPUT.PUT_LINE('ErrCode: ' || sqlcode);
    DBMS_OUTPUT.PUT_LINE('ErrMsg : ' || sqlerrm);
END;
/

VBの配列の大きさ

配列を大きさを初期化するときって配列の要素数を指定するものだと思ってた(知っている言語がすべてそうだった)が VBでの配列の初期化は配列の最終index値を指定するらしい。

Public Sub Main()
    Dim index As Integer

    '配列の大きさをDimやReDimで指定するが、指定する数値はindex値。つまり配列の要素数はindex+1となる。
    Dim ary(3) As String 'index=0, 1, 2, 3となり配列の要素数は4となる。
    ary(0) = "A"
    ary(1) = "B"
    ary(2) = "C"
    ary(3) = "D"
   'index最大値までループ
    For index = 0 To UBound(ary)
        MsgBox (ary(index))
    Next
End Sub

私の思い込みもよくないが、ネット上のVBリファレンス系サイトの例も同じような思い込みしていて 間違っているような気がする。

気をつけるべし(危うくバグるところだった)。