Ubuntuを使用する際、IPv6 環境やポート22 が閉じている場合に SSH でGitHub/GitLabを操作するための対処法

私は GitHub と GitLab をどちらも使っています。
ほぼ同時期に以下のことが起き、GitHub/GitLab との通信ができなくなりました。

  • ある場所のネットワークがIPv6に切り替わった。
  • 勤務先のひとつのネットワークが更新され、ポート22が閉じられた。

それぞれ調べて、以下のことがわかりました。

  • 2025年10月現在、GitHub/GitLab はIPv6を完全にサポートしきれていないようです。IPv4の方が確実につながります。IPv4にするためには、 “AddressFamily inet” と config ファイルに記載します。
  • ポート22が閉じられている場合、ポート443 を使うことで接続できます。その際、GitHubのホスト名は “ssh.github.com”, GitLabのホスト名は “altssh.gitlab.com” となります。

これらを反映するためには、 ホームディレクトリの下の .ssh ディレクトリに config ファイルを作成します。
その中に以下を記載します。


<h1>GitHub</h1>

Host github.com
  Hostname ssh.github.com
  User git
  Port 443
  IdentityFile ~/.ssh/id_ed25519
  AddressFamily inet

<h1>GitLab</h1>

Host gitlab.com
  Hostname altssh.gitlab.com
  User git
  Port 443
  IdentityFile ~/.ssh/id_ed25519
  AddressFamily inet

こうしたところ、私の作業する場所はどこでも GitHub/GitLab にSSH接続できるようになりました。

ちなみに正しく接続できたかは、 以下のコマンドで確認できます。


<h1>GitHub</h1>

ssh -T git@github.com

<h1>GitLab</h1>

ssh -T git@gitlab.com

そうすると、ともに

Enter passphrase for key '/home/ユーザ名/.ssh/id_ed25519': 

と聞いてきますので、パスフレーズを入れると、

GitHubの場合は

Hi ユーザ名! You’ve successfully authenticated, but GitHub does not provide shell access.

GitLabの場合は

Welcome to GitLab, @kytk!

となります。

xargs の理解

シェルスクリプトで、パイプの後に xargs を使って処理を行うことがあります。
あまりこの使い方がピンと来ていなかったのですが、改めて man を読むとポイントは2つかなと思いました。

xargs とは

xargs は、 man によると “xargs – 標準入力を読み込んでコマンドラインを作成し、それを実行する” とあります。

ここから、以下の2つがポイントになります。

  • 標準入力を読み込む→パイプが有用
  • コマンドラインを作成する→コマンドの引数となる

xargs の基本形

xargs は以下のように使うことになります。

(コマンド1) | xargs コマンド2 

これだと分かりづらいので、例を挙げます。

拡張子 .tmp がついているファイルを見つけて、削除したいとします。

まず、 カレントディレクトリ以下に、 “.tmp” がついているファイルは以下で見つけることができます。

find . -name '*.tmp'

この結果を削除したいとします。

この時、

rm (findの結果)

とすれば消せるわけです。

そこで、xargsを使うと、rm の後に、パイプ前の find の結果を引数として渡してあげることができます。

find . -name '*.tmp' | xargs rm

引数を明示しなければいけない場合

引数を明示するのは、コマンドが複数の引数をとる場合です。
たとえば、 cp は2つの引数をとります。
今、find の結果を、temp というディレクトリにコピーしたい場合は、 ” -I {}” で
標準入力から受け取った各行を {} という記号で置き換えることを指定し、実際に引数に入るところに {} を置きます。

つまり、以下のようになります。

find . -name '*.tmp' | xargs -I {} cp -r {} temp

ちなみに、find の場合は xargs を使わなかったとしても、

find . -name '*.tmp' -exec rm {} \;
find . -name '*.tmp' -exec cp {} temp \;

とすることで同様の結果を得ることができますが、xargs は find 以外のコマンドに対しても適用できます。

xargs の実践例

Dockerのコンテナを作成している場合、ビルド中にエラーを起こすとTAGが となることがあります。
ひとつならばいいのですが、それを一気に消したいと思いました。

これを以下で達成できました。

docker image ls | grep none | awk '{ print $3 }' | xargs docker image rm

簡単に解説します。

  • “docker image ls” は コンテナイメージを列挙します。

REPOSITORY TAG IMAGE ID CREATED SIZE
container1 latest 608d1c44a054 2 hours ago 55.4GB
container2 33f22ef999ce 2 hours ago 55.4GB
container3 latest 65c0b7b9a21f 21 hours ago 43.7GB
container4 e1bb0a89e972 5 days ago 53.7GB

  • “docker image ls | grep none” で、 none が入っているもののみ表示されます。

container2 33f22ef999ce 2 hours ago 55.4GB
container4 e1bb0a89e972 5 days ago 53.7GB

  • “docker image ls | grep none | awk ‘{ print $3 }'” で、 3列めの情報のみ表示されます。

33f22ef999ce
e1bb0a89e972

  • 最後に、これを ” |xargs docker image rm” に入れることで以下が実行されることになります。

docker image rm 33f22ef999ce e1bb0a89e972

ポイントは、xargs で受けるのは引数のリストとなるということでしょうか。

このように、パイプで受けること、引数の場所を意識することで、 xargs のポイントがわかった気がしました。

Lin4Neuroの Ubuntu 20.04版 から Ubuntu 22.04版 へのアップグレード

Lin4Neuroは現在、Ubuntu 22.04版がメインとなっています。
FreeSurferがまだUbuntu 24.04に対応していないためです。

しばらく前からLin4Neuroを使っている方は、Ubuntu 20.04版をお使いの可能性があります。
これをUbuntu 22.04版に更新する方法を説明します。

ある程度わかっている方向けのコマンド

  • 以下のコマンドを見て内容がわかる方はこれでお願いします。
sudo apt-mark showhold #バージョンが固定されているパッケージを確認
sudo apt-mark unhold パッケージ名 #バージョン固定を解除
sudo apt remove firefox
sudo apt update
sudo apt full-upgrade
reboot
sudo do-release-upgrade
cat /etc/lsb-release
cd ~/git
git clone https://gitlab.com/kytk/lin4neuro-jammy.git
cd lin4neuro-jammy.git
./l4n-jammy-1_base.sh -l ja #英語の時は -l en
./l4n-jammy-2_wallpaper.sh
./l4n-jammy-3_packages.sh

ひとつずつ説明

  • Ubuntu20.04版から Ubuntu22.04版へのアップグレードは以下のように行います。

現在のUbuntuのバージョンの確認

  • 現在のUbuntuのバージョンは以下で確認できます。
cat /etc/lsb-release
  • Ubuntu 20.04の場合、以下のようになるかと思います。
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"

バージョンが固定されているパッケージの確認および解除

  • GPUを使っている場合、CUDAのバージョンを固定している場合があります。以下のコマンドで確認できます。
sudo apt-mark showhold
  • ここで例えば、 “cuda-11-8” など出てきたら、それは固定されているので、次のコマンドでそれを外します。
sudo apt-mark unhold cuda-11-8

Firefoxのアンインストール

  • Firefoxは Ubuntu 22.04 でデフォルトが apt版からsnap版に変更になりました。これまでの経験で、アップグレード中にFirefoxがスタックしてしまうことが頻繁に見られるのでそれを避けるためにFirefoxはアンインストールします。
sudo apt remove firefox

リポジトリのアップデートおよびソフトウェアの最新化

  • アップグレードするためには、まずリポジトリをアップデートし、ソフトウェアをすべて最新化する必要があります。以下でそれを行うことができます。
sudo apt update
sudo apt full-upgrade

再起動

  • ソフトウェアをすべて最新化した後、再起動しないとアップグレードできません。このため、以下で再起動します。GUIで再起動してもいいですが、ターミナルでは、一語で再起動できます。
reboot

Ubuntu 22.04へのアップグレード

  • ここまで来るとUbuntu 22.04にアップグレードする準備ができました。以下でアップグレードを行います。
sudo do-release-upgrade
  • いくつか聞かれますが、Yesの時は、 “y” をタイプします。途中、紫色の画面で、”Restart services during package upgrades without asking?” という画面では、Tabキーで “Yes” を選択し、Enterを押します。

  • すべて終わると以下の情報になります。

System upgrade is complete.

Restart required

To finish the upgrade, a restart is required.
If you select 'y' the system will be restarted.

Continue [yN]
  • これで、”y” をタイプすると、再起動されます。壁紙は変になっていますが後で修正しますので気にしないでください。

Ubuntuのバージョンの確認

  • これでUbuntu 22.04 になったはずです。以下で確認できます。
cat /etc/lsb-release
  • Ubuntu 22.04の場合、以下のようになるかと思います。
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"

Lin4Neuro のダウンロード

  • 以下で、Lin4Neuro 22.04版をダウンロードします。
cd ~/git
git clone https://gitlab.com/kytk/lin4neuro-jammy.git

Lin4Neuro のセットアップ

  • 以下で、Lin4Neuroをセットアップします。ひとつずつ実行していただければ大丈夫です。
cd lin4neuro-jammy.git
./l4n-jammy-1_base.sh -l ja
./l4n-jammy-2_wallpaper.sh
./l4n-jammy-3_packages.sh

これで、Lin4Neuroが20.04版から22.04版にアップグレードされます。

Ubuntuで apt-key が廃止になった今、理解しておいた方がいいこと

Ubuntuでサードパーティーのソフトウェアをインストールする際、過去には、apt-key コマンドでパッケージの電子署名用のOpenPGP公開鍵を扱っていました。

しかし、現在、apt-keyは廃止となりました。

私の中で混乱があったのでポイントをまとめました。

  • 公開鍵は asc でも gpg でもいいが、gpgの方がいいかもしれない。(gpgの方がファイルサイズも少し小さい)
  • サードパーティーの鍵は /etc/apt/keyrings に保存する
    • sources.list のマニュアルに以下の記載があります。”The recommended locations for keyrings are /usr/share/keyrings for keyrings managed by packages, and /etc/apt/keyrings for keyrings managed by the system operator.”
  • sources.list.d/ の下にそのパッケージの list ファイルを作成するが、リポジトリに [signed-by=/etc/apt/keyrings/そのパッケージのkey.gpg] を追記する

実際に Google Chrome をこの方法で行うとどうなっていたか見てみたいと思います。

apt-key 時代

  • 過去にはこう紹介されていました。
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
  • 1行目で、wget で入手した linux_signing_key.pub を apt-key を使って登録しています。apt-keyで追加された鍵は、すべてのリポジトリが信頼する場所(/etc/apt/trusted.gpg.d/)に保存されていました。これがセキュリティ上のリスクでした。
  • 2行目は aptのために list ファイルを作成しています。

現在

  • 現在はこうなります。
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub |\
  gpg --dearmor | sudo tee /etc/apt/keyrings/google-chrome.gpg > /dev/null

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" |\
  sudo tee /etc/apt/sources.list.d/google-chrome.list
  • 1行目の wget で入手するのは変わりませんが、その後、gpg –dearmor でダウンロードした鍵をバイナリ形式に変換した後、/etc/apt/keyrings の下に google-chrome.gpg として保存します。
  • 2行目では、[arch=amd64]でシステムアーキテクチャを指定し(これは本筋ではありませんが有用です)、[signed-by=/etc/apt/keyrings/google-chrome.gpg] で鍵がどこにあるかを明示しています。

このように理解することですっきりしました。

Lin4Neuroアンケート結果

Lin4Neuroのアンケートについてご協力いただきありがとうございました。アンケート結果を公開します。コメントは随時ここに追加していきます。

  • 研究目的に限らず、ご自分が普段使用していて一番慣れているPC・OSを教えて下さい
  • 実機・VirtualBox問わず、現在、研究にLin4Neuroを使用していますか?
  • Linuxの初心者向けセミナーが開催されたら、参加したいですか?
  • Lin4Neuroをどの機器で使用したいですか?(複数選択可)
  • 今後Lin4Neuroを使用するにあたり、気になることや、心配なことはありますか?(複数選択可)
  • その他、Lin4Neuroの使用にあたり、気になる点やご要望などありましたらご自由にお書きください。
    • Lin4Neuroと研究仮説が整えば研究ができそうなので、頑張るしかないです。
    • メモリ、GPUの種類などある程度選択肢があると嬉しいです
    • Linuxを使い始めばかりで質問するのにハードルが高く感じるときがあります。
    • GPUの計算能力に興味があるものの、脳画像解析では使用できていません。ハードウェアの選択とソフトウェアのセットアップのハードルの高さであると思いますが、その辺りが解消されるとありがたいです。
    • また仮想環境の手軽さも捨てがたく、複数の環境を使い分けている状況です。
    • 仮想環境というものがよく理解できないので、通常環境で使用できるとありがたいです。
    • FreeSurferのAIを用いていくのにメモリが大量に必要とするとハードウェアがかなり限られてくるように思います 複数のハードウェアを用意するのは簡単ではなくなってくるかもしれませんね
    • 導入に大体どれくらいお金がかかるものなのでしょうか?初歩的な質問で失礼致します。
    • いつも利用しています、とても助かっています。日本のMRI技術の発展を支える重要なお仕事です。
    • VirtualBoxで使う際に、複数画面表示に対応していただけたら嬉しいです。
    • 現在のデスクトップ型のwindows11(intel core i7-13700 コア16、24スレッド,2.10GHz-5.20GHz,32G,)で仮想環境でlin4neuroを扱うとき、作業(今はTBSSを考えていますが)にどれくらい時間がかかるのか、それがlinux実機だと多少緩和されるのか
    • 昔ノートパソコンに入れていたので、性能的な問題で今は使っていません。ただ初心者が最初にLinuxに慣れるという意味では大変ありがたく、非常に感謝しております。一方で研究施設内ですでにクラスタの環境が整っているというところもあり、その場合の使い分けが気になります。
    • Appleシリコンに対応していただけるとありがたいです

Bashのシェルスクリプトのshebang行は #!/usr/bin/env bash の方がいいかもしれない

シェルスクリプトを記載する時、bashで実行されることを意識する際、冒頭のシェバン (shebang) 行に

#!/bin/bash

と記載することが多いです。

Linuxではこれで全く問題ないのですが、近年の macOS の状況を見ていると、これはちょっと考え直した方がいいかなと思ってきました。

簡潔に言うと、

#!/usr/bin/env bash

とするのが汎用性の高い運用になると思います。

続きを読む

mkdir -p のあまり知られていない機能

mkdir -pmkdir --parents であり、必要に応じて親ディレクトリを作成する便利なオプションです。

しかし、ふと、man を見たらもうひとつの機能があることに気づきました。それは「ディレクトリが存在していてもエラーを返さない」というものです。

私はこれまでいつもスクリプトでディレクトリを作成する際は、

[[ -d some_directory ]] || mkdir some_directory

としていました。

しかし、実は、これは

mkdir -p some_directory

で終わってしまうということですね。

小さなことですが、勉強になったので、備忘録として記録しておきます。

Ubuntu でNVIDIAのGPUがうまく動かなくなった時の対処法【2024年12月版】

NVIDIAのGPUドライバーがプロプライエタリからオープンソースに移行したことに伴い、過去にプロプライエタリドライバを使っていた方がアップデートがうまくいかずトラブル場合が多々あります。

その時の対処法を以下に示します。

続きを読む

VirtualBox のDebian 12 ゲストに Guest Additions をインストールする方法

VirtualBox上でDebianをインストールしていろいろ試しているのですが、Guest Additionsをインストールしようとしてちょっと困ったので、備忘録として残しておきます。

short answer

cd /media/cdrom
sudo sh VBoxLinuxAdditions.run

でいけます

long answer

最初、普通Ubuntuでやるように

cd /media/cdrom
sudo ./VBoxLinuxAdditions.run

としたところ、

sudo: unable to execute ./VBoxLinuxAdditions.run: Permission denied

となりました。

なんでだろうと思ったところ、https://forums.virtualbox.org/viewtopic.php?t=58799にヒントが書かれていました。

cdromをマウントする際、/etc/fstabに

/dev/sr0    /media/cdrom0    udf,iso9660    user,noauto    0    0

と書かれています。この noauto を exec にすることで、実行可能になるということでした。

もちろん、これを exec に変えるのも方法ですが、この場合、任意のCDが実行されてしまうリスクもはらんでいます。

それ以外の方法がないかと考えたところ、直接実行するのではなく、シェルから実行するという方法があるかなと思いました。

そうしたら、上記のリンクの最後にその旨が書かれていました。

なので、実際に試してみました。

cd /media/cdrom
sudo sh VBoxLinuxAdditions.run

そうしたところ、あっさりと動きました。

スクリプトを直接実行ではなく、シェルから実行というのは常に頭のどこかに置いておくといいんだなということを学びました。

2024年10月現在、FreeSurferはUbuntu 24.04 では動作しません

ときどきこの質問を受けるので言及しておきます。

2024年4月にUbuntu 24.04が公開されました。
しかし、Ubuntu 24.04上では現行のFreeSurfer 7.4.1は動きません。
このため、FreeSurferを実行したい場合は、しばらくUbuntu 22.04からアップグレードしないようにしましょう。

bash でディレクトリ変数の展開を有効にする direxpand を設定する方法

Ubuntu 22.04 から、ターミナルでの変数を使ったディレクトリ移動が厄介になりました。

例を挙げます。

FSLのインストールパス は変数 $FSLDIR に入っています。私はこれまでは、$FSLDIR/standard にアクセスしたい場合

cd $FSLDIR までタイプしたら、その後、タブキーをタイプすると、シェルが自動で cd /usr/local/fsl と変数を展開してくれて、その後のディレクトリをタイプしていました。

しかし、Ubuntu 22.04 から、同じことをすると

cd \$FSLDIR/

と変数がエスケープされてしまい展開されなくなってしまいました。

これは不便です。

調べたところ、shopt というコマンドがあることを知りました。

続きを読む

nvidia関連のドライバーが依存の問題でアップデートできない時の解決法

2023年11月9日に普通にアップデートしたら以下の問題が発生しました。
環境はUbuntu 22.04です。

$ sudo apt update
---(中略)---
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 nvidia-dkms-535 : 依存: nvidia-kernel-common-535 (= 535.129.03-0ubuntu1) しかし、535.129.03-0ubuntu0.22.04.1 はインストールされています
 nvidia-driver-535 : 依存: nvidia-compute-utils-535 (= 535.129.03-0ubuntu1) しかし、535.129.03-0ubuntu0.22.04.1 はインストールされています
                     推奨: libnvidia-gl-535:i386 (= 535.129.03-0ubuntu1)
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。

nvidia-dkms-535 が nvidia-kernel-common-535 に依存しているとあります。
よくみると、
nvidia-kernel-common-535は
535.129.03-0ubuntu1 が必要なようですが、 535.129.03-0ubuntu0.22.04.1がインストールされていると言われています。

バージョンの小さな違いがエラーを引き起こしているようです。

続きを読む

Windows 10/11 で、WSL2 を使って FSL をインストールする方法

Windows 10/11 では、Windows Subsystem for Linux (WSL) を使ってUbuntuなどのLinuxをインストールできます。WSL2 を使うと、GPUも使えるとのことです。

しかし、WSL2は基本、コマンドラインです。LinuxのGUIを起動するためには、工夫が必要です。現在、いくつかのアプリが公開されていますが、FSLの公式ページでは、VcXsrv を勧めていますのでそれを使うのが無難でしょう。

Ubuntu 22.04 も発表されて1年が過ぎて安定してきましたので、ここでは、

  • WSL2
  • Ubuntu 22.04
  • VcXsrv

をいれたうえで、FSL をインストールしてみます。

なお、このページは、FSLの公式サイトを参考に作成しました。

続きを読む

Ubuntu 20.04/22.04 上の FSL6.0.6 以降で CUDA 11以降のGPUを使う方法

FSL 6.0.6 以降で、CUDA 11以降も対応するようになりました。

いろいろ試行錯誤した結果、以下のようなシンプルな方法でFSLでCUDAを上手に使うことができるようになったので紹介します。

なお、Amulet社から販売している Powerstep Tower for Lin4Neuro は、既にこれらの設定が済んでいますので、電源入れたらすぐにEDDY, BEDPOSTX, XTRACTなどがGPUを使って解析できます。
なお、FSL 6.0.6 以降は既にインストールされているとします。

続きを読む

Ubuntu で 新しいハードディスクを追加する方法 step by step

これまで新しいハードディスクを追加する際の tips を書いてきましたが、最初から最後までまとめます。SATA接続のSSDも同様です。

  1. 新しいデバイスを確認する
  2. fdisk を使って確認できます。

    sudo fdisk -l
    

    詳細はこちらに説明があります。

    この後は、 /dev/sda が新たなデバイスであると仮定します。

  3. パーティションの作成
  4. gdisk を使います。

    sudo gdisk /dev/sda
    

    この後、タイプするコマンドは

    n #新しいパーティションを追加 設定はすべてデフォルトのままでも可
    p #パーティションテーブルを確認
    w #パーティションテーブルの書き込み
    

    の3つだけです。

    詳細は先ほどと同じく、こちらに説明があります。

  5. ext4 としてフォーマット
  6. mkfs.ext4 を使います。

    sudo mkfs.ext4 /dev/sda
    
  7. ハードディスクのUUIDを確認
  8. blkid で確認できます。

    sudo blkid | grep dev\/sda
    

    ここで表示されるUUIDを後ほど使います。

  9. マウントポイントの作成
  10. 今の場合は /mnt/data1 にマウントするとします。

    sudo mkdir /mnt/data1
    
  11. /etc/fstab への追加
  12. /etc/fstab に以下の内容を追加します。詳細はここでは説明しませんが、データ用ならば以下の設定でよいのではないかと思われます。

    # HDD 2023-04-15 (コメントを記載した方がどのハードディスクかわかります)
    UUID=上記で調べたUUID    /mnt/data1    ext4    defaults    0    0
    
  13. ハードディスクのマウント
  14. mount -a でマウントできます。

    sudo mount -a
    
  15. オーナーシップの変更
  16. 自分だけ使う場合、chown を使ってオーナーを自分にすると使い勝手がいいです。

    sudo chown -R $USER:$USER /mnt/data1
    

これでハードディスクを追加できました。