お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
2025/09/17 01:32 OS::Linux::Ubuntu

完全には解消していないが、とりあえず日本語が打てるようになったので記す。

確認環境

Ubuntu 24.04.3 LTS

起きていた事象

Ubuntu Serverとして導入した環境をUbuntu Desktop(GNOME)に置き換え、Xubuntu Desktopにマイグレーションしたところ、Ubuntu Desktopでは問題なかった日本語入力ができなくなった。

状況

IbusとMozcが自動起動せず、手動で起動させても日本語が打てず、systemctl --user show-environmentを叩いたときに以下の内容が出る状況だった。

HOME=/home/hoge
LANG=ja_JP.UTF-8
LOGNAME=hoge
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
SHELL=/usr/bin/zsh
USER=hoge
XDG_RUNTIME_DIR=/run/user/1000
GTK_MODULES=gail:atk-bridge
QT_ACCESSIBILITY=1
XDG_DATA_DIRS=/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:10.0
GSM_SKIP_SSH_AGENT_WORKAROUND=true
SSH_AUTH_SOCK=/tmp/ssh-80h84ldKtdNU/agent.2702
XAUTHLOCALHOSTNAME=

参考までに正常に動作する環境では以下の出力となる。こちらはUbuntu Desktop→Xubuntu Desktopと辿ってきており、Server由来要素がない環境だ。

HOME=/home/hoge
LANG=ja_JP.UTF-8
LOGNAME=hoge
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
SHELL=/usr/bin/zsh
USER=hoge
XDG_RUNTIME_DIR=/run/user/1000
GTK_MODULES=gail:atk-bridge
QT_ACCESSIBILITY=1
XDG_DATA_DIRS=/usr/share/xfce4:/usr/share/xubuntu:/usr/share/gnome:/usr/local/share:/usr/share:/var/lib/snapd/desktop
CLUTTER_BACKEND=x11
CLUTTER_IM_MODULE=ibus
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DEBUGINFOD_URLS=$'https://debuginfod.ubuntu.com '
DESKTOP_SESSION=xubuntu
DISPLAY=:0
GDMSESSION=xubuntu
GDM_LANG=ja_JP
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GSM_SKIP_SSH_AGENT_WORKAROUND=true
GTK_IM_MODULE=ibus
GTK_OVERLAY_SCROLLING=0
IM_CONFIG_PHASE=1
LANGUAGE=ja_JP
PWD=/home/hoge
QT_IM_MODULE=ibus
QT_QPA_PLATFORMTHEME=gtk2
SHLVL=0
SSH_AUTH_SOCK=/run/user/1000/gnupg/S.gpg-agent.ssh
XAUTHLOCALHOSTNAME=
XAUTHORITY=/home/hoge/.Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-xubuntu:/etc/xdg
XDG_CURRENT_DESKTOP=XFCE
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/hoge
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=xubuntu
XDG_SESSION_TYPE=x11
XMODIFIERS=@im=ibus
_=/usr/bin/dbus-update-activation-environment

対処法

/etc/environmentに以下の内容を追記し、OS起動ごとにWhinsker MenuからIbusの設定を叩いて起動させることにした。自動起動の実現は結構面倒そうだったので試していない。

GTK_IM_MODULE=ibus
QT_IM_MODULE=ibus
XMODIFIERS=@im=ibus

あとがき

本来あるべき姿で起動させたいが方法が全くわかっていないのが厳しい…。何より環境変数が圧倒的に足りていないので、色々不都合が起きてそうだ。

まぁ当該端末をデスクトップユースで使うことは滅多にないのでいいっちゃいいのだが…。

なんか昔のやり方が使えなくなってたので調べたメモ。

確認環境

Env Ver
OS Ubuntu 24.04.3 LTS
Docker version 28.1.1, build 4eba377
Docker Compose v2.35.1
Mastodonのバージョン v4.5.0-alpha.2
Mastodonのコミットハッシュ 06803422da3794538cd9cd5c7ccd61a0694ef921

手順

DEVELOPMENT.md#dockerの手順通りにやると行ける。

docker compose -f .devcontainer/compose.yaml up -d
docker compose -f .devcontainer/compose.yaml exec app bin/setup
docker compose -f .devcontainer/compose.yaml exec app bin/dev

コンテナへのアタッチ方法

# 方法1
docker compose -f .devcontainer/compose.yaml exec app zsh

# 方法2
cd .devcontainer
docker compose exec app zsh

VSCodeがあるならDockerやRemoteほげほげ系の拡張を使い、devcontainer-appにAttach Shellしてもよい。

検証ユーザーの作成

  1. 次のコマンドでユーザーを作る
    ./bin/tootctl accounts create hoge --email hoge@example.com --confirmed
    
  2. ユーザーの承認を行い、必要に応じてパスワードを使いやすいものに変更する
    rails console
    user = Account.find_by(username: 'hoge').user
    user.approve!
    # PW変更ここから
    user.password = 'password'
    user.skip_confirmation!
    # PW変更ここまで
    user.save!
    quit
    

フロントエンドのビルドとサーバー起動

bin/rails assets:precompile
bin/dev

トラブルシューティング

localhostではアクセスできるが、マシンのホスト名やhoge.testのようなローカルドメインでアクセスできない

.env.developmentALTERNATE_DOMAINS=hoge.testの行を追加することで他のドメインでもアクセスできる。

この設定があるとMastodonを別環境で動かしててリモートからドメインアクセスする場合に便利。

ActiveRecord::PendingMigrationErrorなど、ActiveRecord関係のエラーが出る

コンテナの中でrails db:setupを叩くことで解決する。

Unable to load application: NameError: uninitialized constant LetterOpenerWebというエラーが出る

リポジトリルートにあるdocker-compose.ymlを使うと発生するので、.devcontainer/compose.yamlを使う事で解決する。

あとがき

検証用にバニラなMastodon環境が欲しくて作ってみたが昔と変わっていて地味にハマった…。

Windows標準のOpenSSHを利用してSSHDを立てる方法。

SSHサーバーをインストールする

20分くらいかかるので、気長に待つ。

# 有効なバージョンの確認
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# インストール
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

SSHDサービスを構成する

# SSHDサービスの開始
Start-Service sshd
# 自動起動に設定
Set-Service -Name sshd -StartupType 'Automatic'

# 構成状況の確認
Get-Service -Name sshd
(Get-Service -Name "sshd").StartType

SSHDを鍵認証できるように設定する

%programdata%\ssh\sshd_configに設定ファイルがあるので、これを触る。

Ubuntuと同じOpenSSHであるため、設定方法は基本的に過去に書いたSSHDの設定方法と同じだが、管理者であればAuthorizedKeysFileのコメントを外す必要はない。

管理者である場合、authorized_keysadministrators_authorized_keysというファイル名にして%programdata%\sshに置く。

書き換えたらRestart-Service sshdで再起動する。

上手く繋がらない場合は、Stop-Service sshdでサービスを止めたうえでsshd.exe -ddd -eで直に起動するとデバッグログが見れるので参考にする。

ファイアーウォールへの穴開け

  1. コントロールパネル→Windows Defender ファイアウォール→詳細設定を開く
  2. 受信の規則にOpenSSHが登録されているが、ポート番号が変更不能なため削除する
  3. 次のコマンドを流し、規則を作りなおす

    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort <ポート番号>
    

Windowsノートに課題を長らく感じており、Ubuntuにしたら改善するのではないかという閃きでやってみたログ。

解決したかった課題

  • 120GB/256GBとストレージを食いすぎている
  • メモリが16GBしかなく、WSLをまともに使えない
  • 発熱が酷い
  • 電源を落として放置してると一週間でバッテリーが空になる
    • 高速スタートアップとか、電気を食いそうなのは軒並みOFFにしているつもりなのだが…

目指す環境

  • Windows 11っぽいデスクトップ環境
  • VSCodeを使った簡単なWeb開発や、Markdownライティングが可能
  • SSHで任意のサーバーに接続できる
  • PHPとNode.jsが動く
  • Xfce4を使った軽量なデスクトップ
  • スクショが撮れる
  • リサイズやモザイク、トリミングなどの簡単な画像編集が出来る

対象端末

NEC Lavie PC-GN20D72DYEDYH2YAA

環境構築

Ubuntuの入手とインストール

  1. Ubuntu公式からAMD64向けのイメージをダウンロード
  2. RufusでUSBメモリに焼く
  3. ノートPCにUSBメモリを挿す
  4. ノートPCを起動しF2を連打
  5. BIOSからUbuntuの入ったUSBを起動
  6. 普通にインストールする

ブラウザとVSCodeの導入

  1. Edgeのdebを落としてきてインストール

    sudo apt install ./microsoft-edge-stable_139.0.3405.125-1_amd64.deb
    
  2. アプリセンターからFirefoxを消す

  3. VSCodeのdebを落としてきてインストール

    sudo apt install ./code_1.103.2-1755709794_amd64.deb
    

VSCodeの設定

拡張機能のインストール

普段使ってるマシンで拡張機能のインストールコマンドを生成

code --list-extensions | grep -E -v 'powershell|wsl' | perl -ne 'print "code --install-extension $_"'

結果をノートPC側に流す

code --install-extension 13xforever.language-x86-64-assembly
code --install-extension 42crunch.vscode-openapi
code --install-extension bmewburn.vscode-intelephense-client
code --install-extension dbaeumer.vscode-eslint
code --install-extension docker.docker
code --install-extension eamodio.gitlens
code --install-extension esbenp.prettier-vscode
code --install-extension golang.go
code --install-extension gruntfuggly.todo-tree
code --install-extension jebbs.plantuml
code --install-extension jock.svg
code --install-extension lokalise.i18n-ally
code --install-extension ms-azuretools.vscode-containers
code --install-extension ms-azuretools.vscode-docker
code --install-extension ms-ceintl.vscode-language-pack-ja
code --install-extension ms-vscode-remote.remote-containers
code --install-extension ms-vscode-remote.remote-ssh
code --install-extension ms-vscode-remote.remote-ssh-edit
code --install-extension ms-vscode.remote-explorer
code --install-extension mushan.vscode-paste-image
code --install-extension redhat.vscode-commons
code --install-extension redhat.vscode-yaml
code --install-extension robberphex.php-debug
code --install-extension shd101wyy.markdown-preview-enhanced
code --install-extension swordev.phpstan
code --install-extension vscode-icons-team.vscode-icons
code --install-extension yzhang.markdown-all-in-one
settings.json
{
  "terminal.integrated.defaultProfile.linux": "zsh",
  "terminal.integrated.profiles.linux": {
    "zsh": {
      "path": "zsh"
    }
  },
  "terminal.integrated.allowChords": false,
  "terminal.integrated.commandsToSkipShell": [
    "-workbench.action.quickOpenView",
    "-workbench.action.terminal.focusFind"
  ],
  "workbench.startupEditor": "newUntitledFile",
  "workbench.iconTheme": "vscode-icons",
  "workbench.editor.decorations.badges": false,
  "workbench.editor.decorations.colors": false,
  "workbench.tree.enableStickyScroll": false,
  "workbench.layoutControl.enabled": false,
  "workbench.editor.empty.hint": "hidden",
  "files.eol": "\n",
  "files.trimTrailingWhitespace": true,
  "files.insertFinalNewline": true,
  "scm.showIncomingChanges": "never",
  "scm.showOutgoingChanges": "never",
  "git.autorefresh": true,
  "git.autoStash": true,
  "git.suggestSmartCommit": false,
  "git.mergeEditor": false,
  "git.openRepositoryInParentFolders": "never",
  "remote.autoForwardPortsSource": "hybrid",
  "diffEditor.ignoreTrimWhitespace": true,
  "diffEditor.renderGutterMenu": false,
  "explorer.confirmDragAndDrop": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "editor.stickyScroll.enabled": false,
  "[markdown]": {
    "editor.tabSize": 4,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "php.validate.run": "onSave",
  "vsicons.dontShowNewVersionMessage": true,
  "pasteImage.path": "${currentFileDir}/${currentFileNameWithoutExt}.assets",
  "todo-tree.filtering.excludeGlobs": ["**/node_modules/**/*"],
  "todo-tree.highlights.customHighlight": {
    "TODO": {
      "foreground": "#f8ff96",
      "type": "text-and-comment"
    },
    "FIXME": {
      "foreground": "#ff9696",
      "type": "text-and-comment"
    }
  },
  "todo-tree.general.tags": ["TODO", "FIXME"],
  "todo-tree.regex.regex": "(//|#|<!--|/\\*|^\\s*\\*)\\s*($TAGS)",
  "gitlens.currentLine.format": "${author, }${date}${' via 'pullRequest}${ • message|50?}",
  "gitlens.statusBar.format": "${author}, ${date}${' via 'pullRequest}",
  "gitlens.statusBar.tooltipFormat": "${avatar} &nbsp;__${author}__, ${date}${' via 'pullRequest}\n\n${message}${\n\n---\n\nfootnotes}\n\n${commands}",
  "gitlens.hovers.detailsMarkdownFormat": "${avatar} &nbsp;__${author}__, ${date}${' via 'pullRequest}\n\n${message}${\n\n---\n\nfootnotes}\n\n${commands}",
  "gitlens.views.formats.stashes.description": "${date}",
  "gitlens.views.formats.commits.description": "${author, }${date}",
  "gitlens.defaultDateFormat": "YYYY-MM-DD",
  "terminal.integrated.shellIntegration.decorationsEnabled": "never",
  "security.workspace.trust.untrustedFiles": "open",
  "explorer.copyRelativePathSeparator": "/",
  "typescript.tsserver.log": "off",
  "gitlens.ai.experimental.generateCommitMessage.enabled": false,
  "redhat.telemetry.enabled": true,
  "chat.commandCenter.enabled": false,
  "gitlens.views.scm.grouped.views": {
    "commits": true,
    "branches": true,
    "remotes": true,
    "stashes": false,
    "tags": true,
    "worktrees": true,
    "contributors": true,
    "repositories": false,
    "searchAndCompare": false,
    "launchpad": false
  },
  "workbench.secondarySideBar.defaultVisibility": "hidden",
  "docker.extension.enableComposeLanguageServer": false,
  "workbench.localHistory.maxFileEntries": 500,
  "editor.acceptSuggestionOnCommitCharacter": false,
  "workbench.settings.showAISearchToggle": false,
  "gitlens.ai.enabled": false,
  "chat.agent.enabled": false,
  "remote.SSH.experimental.chat": false,
  "scm.showInputActionButton": false,
  "typescript.updateImportsOnFileMove.enabled": "always",
}
keybindings.json
// Place your key bindings in this file to override the defaults
[
    {
        "key": "ctrl+[BracketLeft]",
        "command": "workbench.action.terminal.toggleTerminal",
        "when": "terminal.active"
    },
    {
        "key": "ctrl+shift+r",
        "command": "typescript.restartTsServer"
    },
    {
        "key": "ctrl+shift+e",
        "command": "eslint.restart"
    },
    {
        "key": "alt+down",
        "command": "workbench.action.compareEditor.nextChange",
        "when": "textCompareEditorVisible"
    },
    {
        "key": "alt+up",
        "command": "workbench.action.compareEditor.previousChange",
        "when": "textCompareEditorVisible"
    },
    {
        "key": "ctrl+k enter",
        "command": "-workbench.action.keepEditor"
    },
    {
        "key": "ctrl+q",
        "command": "workbench.action.keepEditor"
    }
]

Xubuntu化

sudo apt install xubuntu-desktop
sudo apt purge gnome-desktop
sudo apt search gnome
sudo apt purge ubuntu-gnome-desktop gnome-shell
sudo apt autoremove

基本環境のセットアップ

  1. 土台となる環境をインストールする

    # 基礎環境の導入
    sudo apt update -y
    sudo apt upgrade -y
    sudo apt install -y \
        zsh \
        ssh \
        net-tools \
        traceroute \
        unzip \
        mariadb-server \
        nginx \
        git
    
    # chsh
    sudo apt -y install unzip traceroute
    chsh -s $(which zsh)
    
    # dotfiles
    wget https://github.com/Lycolia/my-dotfiles/archive/refs/heads/main.zip
    unzip main.zip
    cp -R my-dotfiles-main/. .
    rm -Rf my-dotfiles-main main.zip
    
  2. chshを効かせるためにOSを再起動

  3. Dockerをインストール

    # Docker
    for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
    
    # Add Docker's official GPG key:
    sudo apt -y update
    sudo apt -y install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt update
    
    sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    # sudo緩和
    sudo usermod -aG docker $USER
    
  4. Node.jsをインストール
     # Node.js @ nvm
     export NVM_DIR="$HOME/.nvm" && (
     git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR"
     cd "$NVM_DIR"
     git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
     ) && \. "$NVM_DIR/nvm.sh"
     nvm install --lts
    
  5. dotfilesのセクションで拾ってきた.zshrcを開き、nvmが動くようにコメントを外す

SSH環境の作成

  1. 鍵置き場を作り、鍵を配置する
    mkdir ~/.ssh
    chmod 700 ~/.ssh
    touch config
    chmod 600 <鍵ファイル>
    
  2. 接続情報を書く
    Host hoge
    User foo
    Hostname git1.example.com
    IdentityFile ~/.ssh/config/id_ed25519_foo
    Port 22222
    Host piyo
    User bar
    Hostname git2.example.com
    IdentityFile ~/.ssh/config/id_ed25519_bar
    Port 20202
    

LibreOfficeのバージョンを上げる

LibreOfficeのバージョンを最新まで上げるとOnedriveに繋げるようになるらしいので上げてみたが、「LibreOffice OneDrive the specified device invalid」のようなエラーメッセージが出て実際には使えなかった。Google Driveでも同様の問題があるらしい

バージョンの上げ方

公式サイトからdebをダウンロードしてきて展開し、debが詰まったディレクトリでsudo dpkg -i *.debするとインストールできる。

そのままではXubuntuのLibreOfficeと競合するため以下のコマンドで古い方を消す。

sudo apt remove libreoffice-common
sudo apt autoremove

PHP8.4のインストール

  1. 取り敢えず使いそうなもの入れる

    php
    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
    sudo apt install -y php8.4 \
        php8.4-bz2 \
        php8.4-cgi \
        php8.4-cli \
        php8.4-common \
        php8.4-curl \
        php8.4-dev \
        php8.4-ds \
        php8.4-fpm \
        php8.4-gd \
        php8.4-http \
        php8.4-imagick \
        php8.4-intl \
        php8.4-ldap \
        php8.4-mbstring \
        php8.4-mcrypt \
        php8.4-mysql \
        php8.4-oauth \
        php8.4-odbc \
        php8.4-pgsql \
        php8.4-smbclient \
        php8.4-snmp \
        php8.4-soap \
        php8.4-sqlite3 \
        php8.4-uuid \
        php8.4-vips \
        php8.4-xdebug \
        php8.4-xml \
        php8.4-xmlrpc \
        php8.4-yaml \
        php8.4-zip \
        php8.4-zstd
    sudo sed -i -e 's/;listen.mode = 0660/listen.mode = 0666/' /etc/php/8.4/fpm/pool.d/www.conf
    sudo service php8.0-fpm start
    
  2. nginxでfpmが動くか動作確認するために/etc/nginx/conf.d/test.confを作成し、以下を記述

    server {
      listen 80;
      listen [::1]:80;
    
      location ~ ^/.*$ {
        root /usr/share/nginx/html;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      }
    }
    
  3. sudo service nginx restart

  4. /usr/share/nginx/html/に適当なPHPスクリプトを置いて動いてるのが確認出来たらOK

デスクトップを使いやすくする

Windows 11っぽくする。

日本語入力できるようにする

タスクバーの右上にある「JA」をクリックしてMozcに変える

タスクバーを下に下げる

  1. タスクバーを右クリックし、パネル→パネルの設定を開く
  2. パネルをロックするを解除する
  3. タスクバーを画面下までドラッグする
  4. パネルをロックするをチェックする

スタートメニューや起動中のウィンドウを真ん中に寄せてラベルを消す

ウィンドウボタン

  1. パネルの設定を開き、アイテムタブに移る
  2. ウィンドウボタンをダブルクリック
  3. ボタンラベルを表示するのチェックを外す
  4. フラットボタンで表示するのチェックを入れる
  5. 取っ手を表示するのチェックを外す
  6. 並び変え順をタイムスタンプにする
  7. 基本的に画像の通りになってればOK
Whisker Menu

基本的に設定しなくてよいが、ラベルが出ている場合は表示をアイコンにすればよいと思う。

中央寄せにする

  1. セパレーターを追加し、セパレーター・Whisker Menu・ウィンドウボタンの順にする
  2. セパレーターをダブルクリックし、拡張するにチェックを入れる
  3. すると中央寄せになる
アイコンを大きめにする

  1. パネルの設定から表示タブを開く
  2. 行サイズを40にする
  3. 外観タブを開く
  4. 固定されたアイコンサイズを32にする
ワークスペースを一個にする

ウィンドウボタンの中央寄せを意識した場合に邪魔なのと、ウィンドウドラッグで他のデスクトップに勝手に飛んでいき、飛んでいくと戻すのが面倒なので、無効化する。

  1. パネルにあるワークスペーススイッチャの設定を開き一個にする
  2. ワークスペーススイッチャを消す(四つの窓と、画面右端にもう一個ある)

WindowsキーでWhisker Menuが、他のキーコンビネーションと干渉せずに開くようにする

愚直にやるとSuper+Eなどのキーとの同時押しと干渉するのでWindowsキー単体押下時のキーコードをいじるユーティリティ、KSUPERKEYを入れて解決する。

  1. 依存関係のインストールとビルド及びインストールコマンドを流す
    sudo apt install -y git gcc make libx11-dev libxtst-dev pkg-config
    git clone https://github.com/hanschen/ksuperkey.git
    cd ksuperkey
    make
    sudo make install
    
  2. 設定マネージャー→セッションと起動を開く
  3. ksuperkeyを追加する
  4. OSを再起動する。OS再起動後、Windowsキー単体の割り当てがSuperからAlt+F1に変更される
  5. 設定マネージャー→キーボードを開く
  6. xfce4-popup-whiskermenuの割り当てをAlt+F1に変更する
  7. Alt+F1にあるxfce4-popup-applicationsmenuと、Alt+Pauseにあるxfce4-popup-whiskermenuはゴミなので消す
  8. Windowsキーを押したときにWhisker Menuが開き、Windows + Eではファイラが開き、お互いが干渉しないことを確認できればOK

スクショを取りやすくする

PrintScreenで画面全体、Windows + Shift + Sで矩形スクショ、Alt + Insertでウィンドウスクショが撮れるようにする。

  1. 設定マネージャー→キーボードを開く
  2. xfce4-screenshooter系のコマンドの最後に -cを追加し、ダイアログなしでクリップボードに飛ばすようにする
  3. Windowsと同様のキーバインドを設定する

ファイル保存は-s 'ピクチャ/Screenshots/'のようなオプションを生やすと可能になるが毎回ダイアログが出るので指定しない方がいい。

また今回の方式ではコンテキストメニューやドロップダウンメニューが開いている場合は機能しなくなるが、回避方法は不明。

Flameshotという便利そうなツールもあるが、あいにくXfceのキーバインド機能に依存させるしかなく、xfce4-screenshooter以上のことはできない

クリップボードマネージャーを有効にする

セッションと起動の自動開始アプリケーションに移り、Clipmanにチェックを入れる。

フォルダ右クリックでVSCodeを開けるようにする

  1. フォルダを右クリックしアプリケーションで開く→他のアプリケーションで開く
  2. Visual Studio Codeを選択
  3. 以後、VSCodeが選択肢に出てくるようになる

WindowsとUbuntuのパフォーマンス比較

セットアップ後のUbuntuのCPU・メモリ・ストレージの各使用率を比較してみた。

双方VSCode, Edge, Discordを起動している状態で比較している。WindowsはCPUとメモリをタスクマネージャー、ストレージをエクスプローラ。UbuntuはCPUをタスクマネージャー、メモリをfree -h、ストレージをdfで見ている。

占有対象 Windows Ubuntu
CPU 30% 2%
MEM 6.6GB/15.4GB (43%) 3.6GiB/14GiB (26%)
ストレージ 113GB/236GB (48%) 17GB/213GB (8%)

圧倒的な軽さ。Windowsだと基本熱を持っていたマシンが随分穏やかな温度になり、夏場でも負荷をそこまで気にせず使えそうだった。

また、まだ今日セットアップしたばかりなので見れていないが、シャットダウン時の電力消費が著しく低い気配がしているので、一週間放置してたらバッテリー切れてたというのもなさそうな予感がしている。

ここはWindowsとの比較が出来ていないが、OSの起動が20秒、終了は4秒と、終了が異様に早い気がした。

単純比較はできないものの、遥かにスペックの高いメインマシンでは起動に2分、終了に20秒を要した事を考えると、かなり早い。

解決した課題

  • 120GB/256GBとストレージを食いすぎている問題
    • 使用量が17GBになり、何ら問題なくなった
  • メモリが16GBしかなく、WSLをまともに使えない問題
    • そもそもLinuxなのでVMが不要なため必然的に解決
    • メモリ使用量もWindowsでは6.6GB/15.4GBだったところ、3.6GB/16.1GBに若干改善した
  • 発熱が酷い問題
    • アイドル時のCPU使用率が30%から2%に落ち、ほとんど熱を持たなくなった
  • 電源を落として放置してると一週間でバッテリーが空になる問題
    • 現時点で6hしか放置できていないため不明だが、ほぼ減ってないように見えるので大丈夫かもしれない

目指す環境との乖離

  • Windows 11っぽいデスクトップ環境
    • 大まかにはそれっぽくなった
  • VSCodeを使った簡単なWeb開発や、Markdownライティングが可能
    • 出来る状態になっている
  • SSHで任意のサーバーに接続できる
    • 確実に可能
  • PHPとNode.jsが動く
    • 確実に可能
  • Xfce4を使った軽量なデスクトップ
    • 達成済み
  • スクショが撮れる
    • 手間がかかる部分もあるが、概ね問題ない。プルダウンメニューやコンテキストメニューもタイマーを書ければスクショできるし、そもそもそこをスクショする機会もそうないだろう
  • リサイズやモザイク、トリミングなどの簡単な画像編集が出来る
    • デフォルトでGIMPが入っているのでOK(JTrimにはどうしても劣るが、偶に使う程度であれば支障なし)

完成したデスクトップ環境

タスクバーが中央寄せの大きなアイコン表示で、起動順、アプリケーションごとにグループ化されてて、そこそこWindows11ぽさを出せてると思う。

サブでたまに使う程度なら全然許容という感じ。

懸念していたが大丈夫だった部分

  • マウス接続時のタッチパッド無効化
    • これ自体は難しそうだったが、キーボード入力中にタッチパッドが無効化されており、あまり気にならなかった。Ctrl押しながらタッチパッドはいけたので実用性で問題になることはないだろう
  • Surface Ark Mouseの三本指クリック
    • ちゃんと中クリックとして認識された

Ubuntu 24.04.3 LTSのxrdpはバグがあり、セッション管理が不安定らしいのでバージョンを上げて解決する。

事象

Windowsのリモートデスクトップから接続すると、xrdpのログイン後に画面が真っ暗になっており、毎回pkill gnome-sessionを余儀なくされ面倒だった。

~/.xsession-errorsを開くと、無限にこのログが出ていた。

(tracker-extract-3:5784): GLib-GIO-WARNING **: 08:39:48.131: Error creating IO channel for /proc/self/mountinfo: 無効な引数です (g-io-error-quark, 13)
Xlib:  extension "DPMS" missing on display ":10.0".
Xlib:  extension "DPMS" missing on display ":10.0".
Xlib:  extension "DPMS" missing on display ":10.0".
Xlib:  extension "DPMS" missing on display ":10.0".
Xlib:  extension "DPMS" missing on display ":10.0".

確認環境

GNOMEはxrdp的にあまりよろしくないらしいので、ついでにxfceに変えてしまった方がいい可能性がある。変える場合はUbuntu 24.04.3 LTSをGNOMEからXfceに移行するを参考にする。

Env Ver
ディストリ Ubuntu 24.04.3 LTS
デスクトップ環境 xfce 4.18
更新前 xrdp 0.9.24-4
更新後 xrdp 0.10.4.1 + lightdm 1.30.0

やり方

公式マニュアルに忠実にやっていく。

xrdpの依存環境のインストール

sudo apt purge xrdp

wget https://raw.githubusercontent.com/neutrinolabs/xrdp/refs/tags/v0.10.4.1/scripts/install_xrdp_build_dependencies_with_apt.sh
chmod +x install_xrdp_build_dependencies_with_apt.sh
sudo ./install_xrdp_build_dependencies_with_apt.sh max

xrdpのビルドとインストール

wget https://github.com/neutrinolabs/xrdp/releases/download/v0.10.4.1/xrdp-0.10.4.1.tar.gz
tar xvzf xrdp-0.10.4.1.tar.gz
mv xrdp-0.10.4.1 xrdp
cd xrdp
https://raw.githubusercontent.com/neutrinolabs/xrdp/refs/tags/v0.10.3/scripts/install_xrdp_build_dependencies_with_apt.sh

./bootstrap
./configure --with-systemdsystemunitdir=/usr/lib/systemd/system \
    --enable-ibus --enable-ipv6 --enable-jpeg --enable-fuse --enable-mp3lame \
    --enable-fdkaac --enable-opus --enable-rfxcodec --enable-painter \
    --enable-pixman --enable-utmp -with-imlib2 --with-freetype2 \
    --enable-tests --enable-x264 --enable-openh264 --enable-vsock
make

sudo make install
sudo ln -s /usr/local/sbin/xrdp{,-sesman} /usr/sbin

sudo adduser --system --group --no-create-home --disabled-password --disabled-login --home /run/xrdp xrdp

実行環境の整備

  1. /etc/xrdp/xrdp.iniを開き以下の行のコメントを外す
    runtime_user=xrdp
    runtime_group=xrdp
    
  2. /etc/xrdp/sesman.iniを開き以下の行のコメントを外す
    SessionSockdirGroup=xrdp
    
  3. 証明書を作成する

    sudo chmod 640 /etc/xrdp/rsakeys.ini
    sudo chown root:xrdp /etc/xrdp/rsakeys.ini
    
    sudo make-ssl-cert generate-default-snakeoil
    sudo ln -sf /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/xrdp/cert.pem
    sudo ln -sf /etc/ssl/private/ssl-cert-snakeoil.key /etc/xrdp/key.pem
    sudo usermod -a -G ssl-cert xrdp
    
  4. 以下を叩いて全部OKなのを確認
    sudo /usr/local/share/xrdp/xrdp-chkpriv
    
  5. サービスの有効化
    sudo systemctl enable --now xrdp xrdp-sesman
    

xorgxrdpのビルドとインストール

XをRDP用に差し替えるxrdpのバックエンドシステムらしい?

  1. ビルドとインストール
    # scripts/install_xorgxrdp_build_dependencies_with_apt.shがないのでビルド時にエラーになった分を入れている
    sudo apt install xserver-xorg-dev libgbm-dev libepoxy-dev
    ./bootstrap
    ./configure --enable-glamor
    make
    sudo make install
    
  2. /etc/xrdp/sesman.iniを開き以下のように書き換える
    ;param=Xorg
    param=/usr/lib/xorg/Xorg
    

ゴミ掃除と最後の設定

rm -Rf xorgxrdp xrdp xorgxrdp-0.10.4.tar.gz install_xrdp_build_dependencies_with_apt.sh xrdp-0.10.4.1.tar.gz

# GNOMEなどxfceでない場合は適宜書き換える
echo "startxfce4" > ~/.xsessionrc

トラブルシューティング

Authentication is required to create a color managed deviceというダイアログが何度も出る

Ubuntu 24からpolkitのバージョンが上がっているようで、従来の手段が通じなくなっている。

  1. /etc/polkit-1/localauthority/50-local.dにcolorが付いたファイルがあれば中身を確認し、関係ありそうな場合削除する
    • この設定ファイルは古く使われていないはずだが念のため消す
  2. /etc/polkit-1/localauthority.conf.d/02-allow-colord.confがなければ作成し、以下の内容を記述
    polkit.addRule(function(action, subject) {
    if (action.id.startsWith('org.freedesktop.color-manager')) {
        return polkit.Result.YES;
    }
    });
    
  3. sudo service polkit restartでpolkitを再起動する

この作業をしても起動直後だけは出るので、キャンセル連打で無視すると良い。二回目以降は出なくなるはずだ。

あとがき

アップデートするとxrdpのロゴが洗練されたスタイルに変わった。今までは結構古臭かったように思う。