Ubuntu26.04LTS リブート後にリモート接続可能にする

自動ログインを有効にする。 自動ログインできても、キーリング解除要求ポップアップがリモートログインをブロックする。 これを回避する。 デスクトップなしで起動。

sudo systemctl set-default multi-user.target

sshでリモート接続したいPCにログイン

#!/bin/bash

export XDG_RUNTIME_DIR="/run/user/$(id -u)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

read -rsp "Unlock Login Keyring Password: " pass
echo

printf '%s' "$pass" |
    /usr/bin/gnome-keyring-daemon --replace --unlock >/dev/null

grdctl rdp set-credentials "$(whoami)" "$pass"

unset pass

デスクトップ起動

sudo systemctl isolate graphical.target

これで画面共有のリモート接続できた。 (リモート接続だけだと、ログアウトしたとたんにデスクトップから起動していたプロセスは終了するけど、上記の方法だと、Windowsリモート接続と同じような使い方ができる)

リモートデスクトップ用仮想4Kモニタ追加 (Ubuntu26.04LTS)

  1. 現在のdrop-inを確認

まず二重設定を避けるため、確認します。

find ~/.config/systemd/user/org.gnome.Shell@ubuntu.service.d \
  -maxdepth 1 -type f -print -exec cat {} \; 2>/dev/null

何も表示されなければ、まだユーザー側drop-inはありません。

  1. 4K仮想画面の設定を作成
mkdir -p ~/.config/systemd/user/org.gnome.Shell@ubuntu.service.d

以下をそのまま実行します。

cat > ~/.config/systemd/user/org.gnome.Shell@ubuntu.service.d/virtual-monitor.conf <<'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/gnome-shell --mode=ubuntu --virtual-monitor 3840x2160
EOF

ExecStart=の空行は、元の起動コマンドをいったん消すために必要です。

Ubuntu 26.04で公開されている構成例でも、systemd drop-inで既存のExecStartを消してから、gnome-shell --virtual-monitorを指定しています。

  1. systemdに読み込ませる
systemctl --user daemon-reload

警告が消えたことを確認します。

systemctl --user cat org.gnome.Shell@ubuntu.service

末尾に次が表示されるはずです。

# ~/.config/systemd/user/org.gnome.Shell@ubuntu.service.d/virtual-monitor.conf
[Service]
ExecStart=
ExecStart=/usr/bin/gnome-shell --mode=ubuntu --virtual-monitor 3840x2160

最終的にsystemdが認識した起動コマンドも確認します。

systemctl --user show org.gnome.Shell@ubuntu.service \
  --property=ExecStart --no-pager

出力内に次があれば設定成功です。

--mode=ubuntu --virtual-monitor 3840x2160
  1. ログアウトして再ログイン

WaylandではGNOME Shell/Mutterが画面サーバーそのものなので、現在の端末からサービスを再起動しないでください。

特にこのunitには、

RefuseManualStop=on
Restart=no

と設定されています。したがって、次は実行しません。

systemctl --user restart org.gnome.Shell@ubuntu.service

作業中のファイルを保存して、GUIからログアウトして再ログインしてください。再起動でも構いません。

  1. 再ログイン後に確認

実際の起動引数:

pid=$(pgrep -n gnome-shell)
tr '\0' ' ' < "/proc/$pid/cmdline"
echo

期待値:

/usr/bin/gnome-shell --mode=ubuntu --virtual-monitor 3840x2160

続いて、

設定 → ディスプレイ

を開き、4K仮想画面が追加されているか確認します。

ログも確認できます。

journalctl --user -b \
  -u org.gnome.Shell@ubuntu.service \
  --no-pager | tail -n 100

元に戻す方法

画面構成がおかしくなった場合は、TTYへ移動します。

Ctrl + Alt + F3

ログインして以下を実行します。

rm ~/.config/systemd/user/org.gnome.Shell@ubuntu.service.d/virtual-monitor.conf
systemctl --user daemon-reload
reboot

なお、最初は安全確認として4KではなくFHDで試すなら、設定中の解像度だけを次に変えます。

ExecStart=/usr/bin/gnome-shell --mode=ubuntu --virtual-monitor 1920x1080

古いPCの場合、まずFHDで仮想画面の生成を確認し、成功後に3840x2160へ上げる手順も現実的です。

JavaScriptで変数名?でつまづいた

7年以上、JavaScriptから離れたいたので気づかなかった、Optional Chaining。

result = function_x()

if (!result?.code || !result?.msg) {
    return null;
}

!result? 何コレ?変数の中身に正規表現かけて評価? JavaScript 変数名 + ? で検索しても全くわからず。 いろいろ検索したら、 ES2020で追加された使用らしい。 result.code が定義されていなかったら undefined 、TypeError にならずに済む。 result.code が定義されていたら、その値。 いちいち変数が定義されているかチェック手間が省けて便利。

Docker install

sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce

Ubuntu 16.04 Docker を GUI つきで動作させる (ローカルホスト)

Ubuntu 16.04 Docker を GUI つきで動作させる (ローカルホスト)

コンテナイメージのダウンロード

Get Docker for Ubuntu

sudo gpasswd -a your-login-name docker

ubuntu-desktop-lxde-vnc

docker pull dorowu/ubuntu-desktop-lxde-vnc

新規コンテナ起動

(localhost の場合)

docker run -d --name lxde -p 6080:80 -p 6022:22 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix dorowu/ubuntu-desktop-lxde-vnc

(remote host の場合)

docker run -d --name lxde -p 6080:80 -p 6022:22 dorowu/ubuntu-desktop-lxde-vnc

WebブラウザからVNC接続する

localhost:lxde

コンテナのターミナルで。

adduser your-login-name
gpasswd -a your-login-name sudo
service ssh restart

(localhostの場合) localhostからX-Serverへのアクセス許可を出す。

xhost local:

コンテナにSSH接続

ssh your-login-name@ip-address -p 6022 -X

(localhostの)コンテナにSSHで接続したターミナルで。

export DISPLAY=:0
gnome-www-browser

(remote hostの)コンテナにSSHで接続したターミナルで。

gnome-www-browser

コンテナ新規起動後にホストをリブートしたあとの作業

作成済みコンテナの開始

docker run を使用するのではない。

docker start lxde

sshデーモンの開始

docker exec lxde service ssh start