お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。

Ubuntu 24.04.3 LTSデスクトップ環境構築メモ

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

基本環境のセットアップ

# 基礎環境の導入
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

# chshを効かせるために再起動

# 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

# 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

# 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以上のことはできない

フォルダ右クリックで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秒と、終了が異様に早い気がした。

解決した課題

  • 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にはどうしても劣るが、偶に使う程度であれば支障なし)

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

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

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