シェルスクリプトを記載する時、bashで実行されることを意識する際、冒頭のシェバン (shebang) 行に
1 | #!/bin/bash |
と記載することが多いです。
Linuxではこれで全く問題ないのですが、近年の macOS の状況を見ていると、これはちょっと考え直した方がいいかなと思ってきました。
簡潔に言うと、
1 | #!/usr/bin/env bash |
とするのが汎用性の高い運用になると思います。
シェルスクリプトを記載する時、bashで実行されることを意識する際、冒頭のシェバン (shebang) 行に
1 | #!/bin/bash |
と記載することが多いです。
Linuxではこれで全く問題ないのですが、近年の macOS の状況を見ていると、これはちょっと考え直した方がいいかなと思ってきました。
簡潔に言うと、
1 | #!/usr/bin/env bash |
とするのが汎用性の高い運用になると思います。
mkdir -p
は mkdir --parents
であり、必要に応じて親ディレクトリを作成する便利なオプションです。
しかし、ふと、man を見たらもうひとつの機能があることに気づきました。それは「ディレクトリが存在していてもエラーを返さない」というものです。
私はこれまでいつもスクリプトでディレクトリを作成する際は、
1 | [[ -d some_directory ]] || mkdir some_directory |
としていました。
しかし、実は、これは
1 | mkdir -p some_directory |
で終わってしまうということですね。
小さなことですが、勉強になったので、備忘録として記録しておきます。
NVIDIAのGPUドライバーがプロプライエタリからオープンソースに移行したことに伴い、過去にプロプライエタリドライバを使っていた方がアップデートがうまくいかずトラブル場合が多々あります。
その時の対処法を以下に示します。
VirtualBox上でDebianをインストールしていろいろ試しているのですが、Guest Additionsをインストールしようとしてちょっと困ったので、備忘録として残しておきます。
1 2 | cd /media/cdrom sudo sh VBoxLinuxAdditions.run |
でいけます
最初、普通Ubuntuでやるように
1 2 | cd /media/cdrom sudo . /VBoxLinuxAdditions .run |
としたところ、
1 | sudo : unable to execute . /VBoxLinuxAdditions .run: Permission denied |
となりました。
なんでだろうと思ったところ、https://forums.virtualbox.org/viewtopic.php?t=58799にヒントが書かれていました。
cdromをマウントする際、/etc/fstabに
1 | /dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0 |
と書かれています。この noauto を exec にすることで、実行可能になるということでした。
もちろん、これを exec に変えるのも方法ですが、この場合、任意のCDが実行されてしまうリスクもはらんでいます。
それ以外の方法がないかと考えたところ、直接実行するのではなく、シェルから実行するという方法があるかなと思いました。
そうしたら、上記のリンクの最後にその旨が書かれていました。
なので、実際に試してみました。
1 2 | cd /media/cdrom sudo sh VBoxLinuxAdditions.run |
そうしたところ、あっさりと動きました。
スクリプトを直接実行ではなく、シェルから実行というのは常に頭のどこかに置いておくといいんだなということを学びました。
ときどきこの質問を受けるので言及しておきます。
2024年4月にUbuntu 24.04が公開されました。
しかし、Ubuntu 24.04上では現行のFreeSurfer 7.4.1は動きません。
このため、FreeSurferを実行したい場合は、しばらくUbuntu 22.04からアップグレードしないようにしましょう。
UNIX系OSで、 df
というコマンドがあります。ファイルシステムのディスク使用量を知るためのコマンドです。
df -h
はファイルサイズをわかりやすく示してくれます。
それぞれの違いを見てみます。
seq -w
は、連続する数字のゼロ埋めをする時に便利です。
たとえば
seq -w 10 とすると
01 02 03 04 05 06 07 08 09 10 11 | $ seq -w 10 01 02 03 04 05 06 07 08 09 10 |
となります。ひと桁の数字も最初に0をつけて2桁になるようにしてくれます。
Ubuntu 22.04 から、ターミナルでの変数を使ったディレクトリ移動が厄介になりました。
例を挙げます。
FSLのインストールパス は変数 $FSLDIR に入っています。私はこれまでは、$FSLDIR/standard にアクセスしたい場合
cd $FSLDIR までタイプしたら、その後、タブキーをタイプすると、シェルが自動で cd /usr/local/fsl と変数を展開してくれて、その後のディレクトリをタイプしていました。
しかし、Ubuntu 22.04 から、同じことをすると
1 | cd \$FSLDIR/ |
と変数がエスケープされてしまい展開されなくなってしまいました。
これは不便です。
調べたところ、shopt というコマンドがあることを知りました。
2023年11月9日に普通にアップデートしたら以下の問題が発生しました。
環境はUbuntu 22.04です。
1 2 3 4 5 6 7 8 | $ 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 では、Windows Subsystem for Linux (WSL) を使ってUbuntuなどのLinuxをインストールできます。WSL2 を使うと、GPUも使えるとのことです。
しかし、WSL2は基本、コマンドラインです。LinuxのGUIを起動するためには、工夫が必要です。現在、いくつかのアプリが公開されていますが、FSLの公式ページでは、VcXsrv を勧めていますのでそれを使うのが無難でしょう。
Ubuntu 22.04 も発表されて1年が過ぎて安定してきましたので、ここでは、
をいれたうえで、FSL をインストールしてみます。
なお、このページは、FSLの公式サイトを参考に作成しました。
FSL 6.0.6 and later now support CUDA 11 or later.
After various trials and errors, I have found a simple way to use CUDA effectively with FSL, which I will introduce here.
Assuming that FSL 6.0.6 or later is already installed.
FSL 6.0.6 以降で、CUDA 11以降も対応するようになりました。
いろいろ試行錯誤した結果、以下のようなシンプルな方法でFSLでCUDAを上手に使うことができるようになったので紹介します。
なお、Amulet社から販売している Powerstep Tower for Lin4Neuro は、既にこれらの設定が済んでいますので、電源入れたらすぐにEDDY, BEDPOSTX, XTRACTなどがGPUを使って解析できます。
なお、FSL 6.0.6 以降は既にインストールされているとします。
これまで新しいハードディスクを追加する際の tips を書いてきましたが、最初から最後までまとめます。SATA接続のSSDも同様です。
fdisk を使って確認できます。
1 | sudo fdisk -l |
詳細はこちらに説明があります。
この後は、 /dev/sda が新たなデバイスであると仮定します。
gdisk を使います。
1 | sudo gdisk /dev/sda |
この後、タイプするコマンドは
1 2 3 | n #新しいパーティションを追加 設定はすべてデフォルトのままでも可 p #パーティションテーブルを確認 w #パーティションテーブルの書き込み |
の3つだけです。
詳細は先ほどと同じく、こちらに説明があります。
mkfs.ext4 を使います。
1 | sudo mkfs.ext4 /dev/sda |
blkid で確認できます。
1 | sudo blkid | grep dev\ /sda |
ここで表示されるUUIDを後ほど使います。
今の場合は /mnt/data1 にマウントするとします。
1 | sudo mkdir /mnt/data1 |
/etc/fstab に以下の内容を追加します。詳細はここでは説明しませんが、データ用ならば以下の設定でよいのではないかと思われます。
1 2 | # HDD 2023-04-15 (コメントを記載した方がどのハードディスクかわかります) UUID=上記で調べたUUID /mnt/data1 ext4 defaults 0 0 |
mount -a でマウントできます。
1 | sudo mount -a |
自分だけ使う場合、chown を使ってオーナーを自分にすると使い勝手がいいです。
1 | sudo chown -R $USER:$USER /mnt/data1 |
これでハードディスクを追加できました。
Lin4NeuroはXFCEを採用しています。とても軽量なのでいいのですが、ウィンドウのサイズ変更でウィンドウの端を上手につかむことができず困ることがあります。
いいショートカットを教えていただきました。「Altキーを押しながら右クリックして、マウスを動かす」です。
私はマウスはできるだけ使わない方がうれしい人間なので、マウスを矢印キーで代用できないか試してみたらバッチリでした。
Alt + 右クリック + 矢印キーで、ウィンドウのサイズが比較的簡単に変更できます。
お試しあれ。
UDF形式はDVDやブルーレイの標準フォーマットですが、Ubuntuでは、デフォルトではディスクを挿入しただけでは認識されないことがあります。
以下のようにすることで対応できます。
Ubuntuの「ディスク」アプリ (gnome-disks) を起動します。
ここで、光学ドライブを選択し、「デバイス」にあるパスを確認します。
上図では、/dev/sr0 であることがわかります。
Ubuntu 18.04以降では、/media/ユーザ名/ の下にリムーバブルディスクがマウントされますので、ここに udf というディレクトリを作成します。(udfでなくても自分の好きな名前で大丈夫です)
1 | sudo mkdir /media/ユーザ名/udf |
以下のコマンドでマウントします。
1 | sudo mount -t udf /dev/sr0 /media/ユーザ名/udf |
こうすると、デスクトップ上にディスクが表示されるようになります。
ディスクが表示されず困った時、試してみる価値があります。
GUIでは、ディスクのアイコンで右クリックをして「取り出す」で大丈夫です。
コマンドラインでは、sudo umount /media/ユーザ名/udf
でアンマウントできますのでその後はいつでも取り出せます。
bedpostx_gpu を走らせると、以下のエラーがでます。
1 | /usr/local/fsl/bin/bedpostx_postproc_gpu .sh: 行 20: --cnonlinear /bin/merge_parts_gpu : そのようなファイルやディレクトリはありません |
この解決法がFSLのMLで紹介されています。
https://www.jiscmail.ac.uk/cgi-bin/wa-jisc.exe?A2=FSL;ee0b1626.2112
具体的には、
${FSLDIR}/bin の中にある bedpostx_postproc_gpu.sh の
1 2 3 4 | # last 2 parameters are subjdir and bindir parameters= "" while [ ! -z "$2" ] do |
を
1 2 3 4 | # last 2 parameters are subjdir and bindir parameters= "" while [ ! -z "${2+x}" ] do |
に変更します。
while の後の test文 の中が、 $2 が ${2+x} になっています。
これで無事に動きます。
ご紹介まで。(金子貴久子先生、情報提供ありがとうございました)
4月30日にUbuntuのアップデートをしたら、以下のようなメッセージが出ました。
W: GPG エラー: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY A4B469963BF863CC
E: リポジトリ https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease はもう署名されていません。
N: このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。
N: リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。
NVIDIAのリポジトリが変更があったのかなと思い、NVIDIAのサイトを見に行ったら、きちんと書いてありました。
Updating the CUDA Linux GPG Repository Key
このページに書いてありますが、Ubuntu 18.04の場合は行うべきことは以下になります。(Ubuntu 20.04は1804を2004に変えるだけです)
1 2 3 4 | sudo apt-key del 7fa2af80 wget https: //developer .download.nvidia.com /compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1 .0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt update |
これで公開鍵が更新されます。
ただ、人によっては以下のメッセージが出てくるかもしれません。
W: ターゲット Packages (Packages) は /etc/apt/sources.list:63 と /etc/apt/sources.list.d/cuda-ubuntu1804-x86_64.list:1 で複数回設定されています
これは、/etc/apt/sources.list と /etc/apt/sources.list.d/cuda-ubuntu1804-x86_64.list
に同じ内容が記載されていることによります。
この場合は、
/etc/apt/sources.list にある
deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /
を削除すればOKです。
Ubuntuでグラフィックドライバを入れるときなど、ubuntu-driversが便利ですが、あるマシンでこんなエラーが出ました。
01 02 03 04 05 06 07 08 09 10 | $ ubuntu-drivers devices ERROR:root:could not open aplay -l Traceback (most recent call last): File "/usr/share/ubuntu-drivers-common/detect/sl-modem.py" , line 35, in detect aplay = subprocess.Popen( File "/usr/lib/python3.8/subprocess.py" , line 858, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.8/subprocess.py" , line 1704, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'aplay' |
No such file or directory: ‘aplay’ と出ます。
これは何だろうなと思って調べたところ、Linuxのオーディオ入出力のALSAの音声再生コマンドであることがわかりました。
ALSAを入れれば問題ないだろうと思ったところ、解決しました。
1 | sudo apt install alsa-base |
これで ubuntu-drivers devices でエラーが出なくなりました。