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をインストール。
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/ にあり。 どうにかならないかと思ったが以下で対処。
- RDPでLXDEに接続してメニューから「設定」「LXSessionのデフォルトのアプリケーション」を選択。
- 「コアアプリケーション」を選択して「Polkitエージェント」にlxpolkitが入力されているので消去。
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)があるとのこと。 windows側ubuntu側双方の設定が必要。やはり/dev/*でなんとかならないのか。これからを期待して、ここでは設定しない。
参考サイト:
ところが、この後の次期Windowsアップデート(2021年4月21日のWindows 10 Insider Preview Build 21364(CO_RELEASE))では RDP経由みたいなことをしなくてもGUIツールが起動できるようになるらしい。 この記事ではaudioツールを動かしているので音問題も解消されそうだし、 GUI画面出すまでの面倒なことがなくなりとてもいい感じになりそう。
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になっているとのこと。
随分触っていなかったんだけどそんなことになっていたんですね。知らなかった。 なのでインストールしてみた。
$ 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からアクセスする際のユーザアカウントをチェックする。
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と出力。
以下のサイトが詳しい。
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リファレンス系サイトの例も同じような思い込みしていて 間違っているような気がする。
気をつけるべし(危うくバグるところだった)。