Unix/Linux 時々知りたくなることメモ

最終更新日: 2026年9月18日(金)

亀山は現在 Debian GNU/Linux 13 (trixie) を主に使っています。 なので、Debian に固有の内容になっているかも知れません。

また当然ですが、 以下の記述は無保証です。 お試しの際は自己責任でお願いいたします。

Linux での swap の足し方

Linux では file を swap に使うことができる(ref.: man mkswap)。 例えば、XXXX kb の swap space を足したいときには以下のようにする。

# dd if=/dev/zero of=/tmp/swapfile bs=1k count=XXXX
# mkswap /tmp/swapfile XXXX
# sync
# swapon /tmp/swapfile

ちなみに、同様の手順を使うと、ファイルの中にファイルシステムを作る こともできる。 例えば以下の手順では、/home/linuxfs という 4GB のファイルを作り、その中に ext4 のファイルシステムを作り、さらにそれを /mnt にマウントさせている。

# dd if=/dev/zero of=/home/linuxfs bs=1G count=4
# /sbin/mkfs.ext4 /home/linuxfs
# mount -o loop /home/linuxfs /mnt

ちょっとしたフィルターの例

  1. 行頭にある check_begin と check_end で囲まれた部分を切り取る
    $ cat file | sed '/^check_begin/,/^check_end/d'
  2. 行頭にある check_begin と check_end で囲まれた部分のみを切り出す
    $ cat file | sed -n '/^check_begin/,/^check_end/p'

    ミソは sed に -n というオプション (suppress automatic printing of pattern space) をつけること。

  3. 空行を消す
    $ cat file | sed '/^$/d'
  4. うざい ^M (MS-DOSにおける改行コード) を消す
    $ cat file | tr -d '\015'
  5. ファイル中の大文字を小文字に変換する
    $ cat file | tr "[A-Z]" "[a-z]"

    ただし、これができない tr コマンドの実装もあったような記憶あり。

  6. 同じ文字の繰り返しを1文字に置き換える。 例えば連続した空白を1つに置き換えるなら
    $ cat file | tr -s " "
  7. Pattern1で始まり Pattern2 で終わる文字列を消去
    $ cat file | sed 's/Pattern1.*Pattern2//'
  8. 行頭と行末の空白・TABを削除
    $ cat file | sed 's/^[ \t]*//' | sed 's/*[ \t]$//'
  9. ファイルの中身を N 行ごとに出力する。 例えば「1行目、11行目、21行目、...」とするなら
    $ cat file | awk '{if (NR % 10 == 1) print}' 
    $ cat file | sed -ne '1~10p'
    

ごっそりバックアップをとるには....

  1. 「あるファイルシステムの中身を別のファイルシステムにごっそりコピーしたい」ならば、たいがいこうしてます。

    $ cp -axv (複製元) (複製先)
    
    cp のオプションの意味は
    -a
    コピー先で、できる限り元のファイルの構成と属性を保持する (ディレクトリ構造体は保存しない)。
    -x
    コピーを始めたディレクトリと異なるファイルシステム上にあるサブディレクトリをコピーをしない。 マウントポイントは同じファイルシステム上にあるのでコピーされる。
    -v
    コピーする前にそれぞれのファイル名を出力する。 また名前を変更する際のバックアップファイル名も表示する。

  2. 「定期的にディレクトリの内容のバックアップをとりたい」ならば、たいがいこうしてます。

    $ rsync -av --dry-run (複製元) (複製先)
    
    rsync のオプションの意味は
    -a
    再帰的に全ての情報を維持する手っ取り早い方法。-rlptgoD (no -A,-X,-U,-N,-H)
    --verbose (あるいは -v)
    転送の間の情報を詳しく表示する。
    --dry-run (あるいは -n)
    テスト用。実行時の動作を表示するだけ。
    --one-file-system (あるいは -x)
    違うファイルシステムにまで操作しない
    ただし、複製元がディレクトリの場合には、末尾に「/」があるかないかで動作が変わる ことに要注意。 「/」つきの場合は (ディレクトリの中身も含めた) ディレクトリ自体がコピーされますが、「/」なしの場合はディレクトリの中身しかコピーされません。

webpage をまるごとゲットするには

wget を使うと便利。使い方はただ単に

 wget URL_YOU_WANT
でよし。よく使うオプションは
-hヘルプメッセージの表示
-mミラーに都合がいいようにオプションを設定する
-np指定webpageの親にあたるページは取得しない
-r再帰ゲット。そのディレクトリの下のディレクトリまで再帰的に取得する
-v冗長モード

CD とか DVD を焼くには

まず保存したいファイルをひとまとめにして ISO9660 フォーマットという形式に変換 (マスタリング) し、それをメディアに焼き込むという手順を踏むのが一般的。

マスタリング

genisoimage (昔あった mkisofs の代わり) というコマンドを使う。

 genisoimage -r -J -o (作成するイメージファイル名) (ソースディレクトリ)
主なオプションとして、
-fシンボリックリンクを追跡する
-l最大31文字までのファイル名を許す
-JJoliet拡張 (最大64文字までのロングファイルネームに対応) を使用可能にする
-allow-leading-dotsピリオドで始まるファイル名を使用可能にする
-rRockRidge拡張 (Unix環境独自のファイル情報を記録) を使用可能にする
-m パス名指定のパスを除外してマスタリングする

実際にISOイメージをCDに焼く前には、

 mount -o loop hoge.iso.image /mnt
として確認してみると吉。

ISOイメージを CD に焼く

CD を焼くなら wodim (cdrecord の代わり) というコマンドを使う。 ごく簡単には

 wodim dev=/dev/cdrom (イメージファイル名)
でOK。 主なオプションとして、
--devices使用可能なデバイスを調べる
-dummy実際には書き込みを行わない (テスト用)
-eject処理終了後にCDをイジェクトする
speed=N書き込みの速度を指定 (1, 2, 4など)
blank=消去方法CD-RWメディアの内容を消去する方法を指定。詳細は blank=help で確認されたし。

亀山はよく忘れてしまうのですが、CD-RW に書き込む前にはディスクの初期化をする必要があります。 以下はその方法の例。

 wodim dev=/dev/cdrom blank=fast

ISOイメージを DVD に焼く

wodim でいけないこともないが、個人的には growisofs が好み。 ごく簡単には

 growisofs -Z /dev/dvd=(イメージファイル名)
でOK。 主なオプションとして
-Z /dev/dvd指定されたデバイスに対し最初のセッションを書き込む。
-dry-run最初の書き込み動作の直前で処理を終了する。
-speed=N書き込み速度を明示的に指定する (通常は指定する必要なし)。

Windows の共有フォルダにアクセスするには

smbmountコマンドを使うと、Windows の共有ディレクトリをマウントできる。 使い方は以下の通り。
$ smbmount //サーバ名/共有名 マウントポイント [-o [username=ユーザ名][,passwd=パスワード][,ro][,rw]]
ただし、やっていることは
$ mount -t smbfs [-o [username=ユーザ名][,passwd=パスワード][,ro][,rw]] //サーバ名/共有名 マウントポイント
と同じ。 ということで、マウントポイントにファイルシステムをマウントする権限がなければ(当然)拒否される。 マウントを解除するには
$ smbumount マウントポイント あるいは $ umount マウントポイント
でOK。

HTMLで使える文字実体参照

正確には HTML4.0の仕様の中の文字実体参照を規定した部分 Character entity references in HTML 4 を見るべし。

LaTeX で発表スライドとかポスターを作りたいです

当然世の中でも需要が多いらしく、いろいろな手段が考案されているようです。 また近頃の LaTeX の事情を鑑みて、亀山の作業台も (u)pLaTeX から LuaLaTeX へと少しずつ移行させています。

スライドを作ろう

スライド作成用途では Beamer が最も有名でしょうか。亀山は beamer のスライドのハデハデさが好みに合わずに敬遠していましたが、2023年2月頃より (仕方なく) 使い始めました。

ということで、ただ今亀山も少しずつ beamer に慣れたり、自分の好みに合うように見た目を調整したりしているところですが、2026年4月下旬時点での亀山の個人的テンプレートは以下のような感じです。 亀山はここ最近まで「原ノ味ゴシック」を標準のフォントとして使っておりましたが、「UDフォント利用促進」の一環として、以下ではモリサワの BIZ UD フォントを使うよう設定しています。 またつい最近になって、beamer の「ノート」機能にようやく気付きました (ちゃんと userguide に載ってまんがな)。その気になれば PowerPoint でいう「発表者ツール」みたいな感じに使うこともできそう。

この sample.tex からスライドを含んだ pdf ファイルを作るには
$ lualatex sample.tex
$ lualatex sample.tex

と実行します。なおここでは、スライド中にスライドの総数を書き入れたい都合上、lualatex は2回実行してます。

以前の亀山は Powerdot を使っていました。 これらは、dvips と ps2pdf を経由して、最終的にはプレゼンテーション用途の PS や PDF ファイルを作るための LaTeX クラスです。 なお powerdot は pstricks を使っているので、必ず PS ファイルを経由した上で PDF ファイルを作成する必要があり、そのせいもあって LuaLaTeX で使用することができません。そこで亀山も仕方なく beamer へ移行することにしました。

ポスターを作ろう

最近の亀山は geometry というクラスを使って作ることが多くなりました。 昔は a0poster というクラスを使っていたのですが、標準のフォントサイズが小さいこともあり、文字サイズの調整などにとても難儀していました。

geometry クラスを用いたポスターのサンプルの例は以下のような感じ。 これから lualatex を経由して、最終的なポスター用途の PDF ファイルを作ります。 なお例からもお分かりいただけるように亀山は、

という基本方針で作っています。 亀山の経験では、A4用紙でちょうどいいくらいの大きさ (10ポイントくらい?) で書いてある文字は、A0用紙のポスターでもちょうどいいくらいの大きさ (40ポイント; 一辺が約14mm) に見えます。
\documentclass[10pt]{ltjsarticle}
\usepackage[a4paper,portrait,vmargin=6mm,hmargin=6mm]{geometry}
\usepackage{amsmath,bm}
\usepackage{color}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
\begin{center}
 \textbf{\Large geometry クラスを使ったポスターのみほん}
\end{center}

\colorbox{yellow}{Navier-Stokes 方程式}
\[
 \dfrac{D\bm{v}}{Dt}=-\dfrac{1}{\rho}\nabla{p}+\nu\nabla^2\bm{v}+\bm{K}
\]

\noindent
\includegraphics[width=\linewidth,keepaspectratio,clip]{/usr/share/doc/texlive-doc/generic/pstricks/images/tiger.pdf}
\end{document}

Linux 使いでも数式処理システムでラクをしたいです

GNU Maxima が Linux 上で動く数式処理ソフトの定番でありましょうか。 高価なソフトウェアをわざわざ買わなくても、必要なことはだいたい Maxima でできます。 日本語での紹介は 松田@東京電機大先生のページ などからどぞ。 また中川義行さんによる「Maxima 入門ノート1.2.1」(pdf) が ここ からたどれます。

なお以下では端末で使う場合を例にとっていますが、maxima-emacs パッケージをインストールすれば emacs の中からも使えます。 起動は M-x maxima でOK。 さらに M-x imaxima とすれば、式がとても綺麗に出力されます。

Maxima の使い方の一例

以下、(%i) が入力、(%o) が出力。 また、(%i) な部分をファイルに書いておけば、
 maxima -b infile
でバッチ処理ができるのもうれしい。

一連の画像ファイルをアニメーションにしたいです

そういう時に亀山は ffmpeg (jessie の頃は avconv) をよく使っています。 以下は亀山が普段使っている動画作成スクリプト (の根幹部分) です。 必要な画像ファイルを用意 (連番にしておくとラクです) し、このスクリプトにかけると output.mp4 という動画ファイルが作成されます。

#!/bin/sh
tmpdir=/tmp/mkavconv$$
mkdir ${tmpdir}
i=1
for f in $* ; do
n=`expr 000${i} : '.*\(....\)$'`
convert $f ${tmpdir}/image${n}.png
i=`expr ${i} + 1`
done
/usr/bin/ffmpeg -i ${tmpdir}/image%4d.png -qscale 0 -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
rm -fr ${tmpdir}
なおこの例で、ffmpeg に渡している -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" という設定は、画像の縦横のピクセル数を必ず2の倍数 (偶数) にする ための細工です。

このスクリプトの中身からも想像がつくでしょうが、ffmpeg (あるいは avconv) にはちょっと独特のクセがあります。 詳細は http://www.gfd-dennou.org/library/cc-env/make_animation/ffmpeg.htm を参考にするとよいでしょう。

また古いバージョンの avconv (とか ffmpeg) には -sameq とか -same_quant とかいうオプションがあったのですが、これらは 「量子化器 (quantizer)」の指定に関するもので、品質 (quality) に関するものではありませんのでご注意を。

そういえば昔は PowerPoint が mp4 の動画を受けつけてくれなかったので、そのため (だけ) に wmv1 (Windows Media Video 7) を作りたくなることもありましたなぁ。 その場合には ffmpeg を呼ぶ手順が

/usr/bin/ffmpeg -i ${tmpdir}/image%4d.png -qscale 0 -vcodec wmv1 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.wmv
みたくなっておりました。

そういえばもっと昔は ImageMagick に含まれている convert を使って、

convert -delay 100 [image files] anime.gif
としてアニメーション GIF を作ったりしてましたが、1999年 (だったか) に LZW 圧縮法の特許に関する騒動が勃発したことを契機としてこのやり方を止めました。 (ただし gif に関する特許の問題そのものは2004年に終焉しています)

お手軽にPCクラスタを作りたいです

亀山が Debian 13 (trixie) で作る際には こんな手順 を踏んでいます。 昔は計算用ノードにもシステム起動用ハードディスクを備えつけていましたが、最近は計算用ノードはディスクレスにしてしまうのがマイブームです。 部品が少なくなったおかげで、保守の手間も (ほんの少しくらいは) ラクになったかも。 また最近は BIOS ではなく UEFI でしか起動できない PC が増えてきましたが、計算用ノードを UEFI でネットワークブートさせることに (ようやく) 成功しました。

ただし、これらは相当に「手抜き」をした構成です。 ちゃんとしたものを作りたい方は、もっとマジメな資料を探してみてください。

PDF ファイルに細工をしたいです

PDFtk (PDF toolkit) とか qpdf が便利です。 亀山がよく使う操作は以下。

またちょっと違う話だが、PowerPoint が PDF を直に貼り付けできないせいで、スライド作りに不必要な手間が発生しているという巷の噂を聞きつける。 「画像の形式の変換」といえば ImageMagick が真っ先に思い浮かぶんだが、pdf を画像に変換しようとする時に限っては亀山は Popplerベースの pdftoppm を使うことが多い。 例えば、zu.pdf という1ページのみの pdf ファイルを nani.png に変換するなら

$ pdftoppm -png -singlefile zu.pdf nani
とすれば OK。 ただし pdftoppm は標準では 150 DPI の解像度でラスター化しようとするので、元の pdf とは物理的な大きさが違う画像を作ってしまう。それを避けるとすれば -r 72 というオプションを指定して、解像度を 72 DPI にするのが吉。

さらにちょっと違う話だが、科研費の申請書を作ったりしているときに「この図はモノクロにされても大丈夫か?」みたいな点検をしたくなることが (毎年? 数年おきに?) ある。 PDF ファイルをまるごとモノクロに変換する作業を gs にやってもらうとすればこんな感じだそうで。

$ gs -o out.pdf -sDEVICE=pdfwrite -dColorConversionStrategy=/Gray -dProcessColorModel=/DeviceGray in.pdf

これまたちょっと違う話だが、亀山の (心を込めた) 作文など、そう簡単に「テキスト引っこ抜き」されないような PDF を作りたくなる。 最初に google の AI に勧められたのは

# qpdf --encrypt ユーザーパスワード オーナーパスワード 256 --extract=n -- input.pdf output.pdf
というものだったが、パスワードによる保護をしたい訳ではない上に、パスワードなしで作ったファイルは pdftotext を相手に無惨な敗北。 じゃあ次の手段は「アウトライン化」ですな。gs にやってもらうとしたらこんな感じだそうで。
$ gs -o out.pdf -sDEVICE=pdfwrite -dNoOutPutFonts in.pdf

Gnuplot を便利に使いたいです

亀山が感服したものを以下にいくつか。

テキストファイルを印刷したいんだけど

Fortran のソースファイルなど、テキストファイルを印刷したくなった時には、まずそのテキストファイルをどうにかして PDF ファイルに変換してやるのがよいでしょう。 多くの場合はいったん PS ファイルに書き出しておいて、それを PDF ファイルに変換することになるでしょう。

テキストファイルの内容を PS ファイルに書き出す方法はいくつかありますが、亀山は永らく perl 版の a2ps を使っていました。 ただしこのスクリプトは古い perl (バージョン4) の頃に開発されたものであるため、最近の perl で動かすにはいくつもパッチを当てないといけなかったりして、ちょっと不便です。

最近亀山が使い始めたのは paps というコマンドを使う方法です。 例えば

$ paps --header nanika.f90 | ps2pdf - sono.pdf
などとすると、nanika.f90 の中身が sono.pdf という PDF ファイルに変換されます。 ファイルの中に日本語が含まれていても大丈夫です (ただし文字コードが UTF-8 である必要があります)。 あとはこのファイルを Windows に持っていくなりして印刷すればOKです。

「Fortran プログラム中の宣言文とかを強調させたい」とか、もうちょっと綺麗な PDF ファイルを作りたい時には、Emacs の中から ps-print-buffer-with-faces というコマンドを呼び出す方法もあります。 印刷したいテキストファイルを Emacs で開いておいた状態で C-u M-x ps-print-buffer-with-faces と実行すれば、そのファイルの中身が PostScript 形式のファイルに出力されます。 (単に M-x ps-print-buffer-with-faces とすると、プリンタへ直接送られます。) さらに端末から

$ ps2pdf nanika.f90.ps sono.pdf
などと実行すると、その PostScript ファイルが sono.pdfという PDF ファイルに変換されます。 ただし、この方法で日本語を含むファイルを変換したい時には、事前に個人向けの設定が必要です。 自分のホームディレクトリに .emacs というファイルを (なければ) 作成し、そこに以下の内容を追記してください。
(setq ps-multibyte-buffer 'non-latin-printer)
(require 'ps-mule)
(defalias 'ps-mule-header-string-charsets 'ignore)

シミュレーション結果のお絵描きにはどんなカラーパレットを使えばいいのかしら

亀山が普段の作業でお絵描きに使っているのは GMT (The Generic Mapping Tools) ですが、手元にあるバージョン 6.5.0 で用意されているカラーパレットの 色見本 を作ってみました。

これまでの亀山は、OpenDX の Colormap で初期設定されている 青>シアン>緑>黄>赤 みたいなカラーパレットを (深く考えずに) マネして使ってきました。これは Jet や Rainbow と似たようなものですが、最近ではあまり評判がよろしくないようで。かといって Matplotlib (要するに Python) でよくある Viridis は暗すぎるような気がしてあんまり好みではないのよねぇ....

「先進認証バンザイ」な世の中になっても、Linux 上の昔からのメール環境を使い続けたいです

DavMail というソフトウェアの力を借りると非常に簡単。 以下、亀山の普段のメール環境 (Emacs と Mew で読み書き、getmail でメールサーバーから POP) を Microsoft の OAuth2.0 に適応させた際の記録です。

  1. DavMail のインストールと初期設定: インストールは Debian なら単に apt install davmail するだけ。その後に davmail を起動すると設定用のパネルが出てくるが、変更を要するのは Exchange Protocol くらい。値は初回のみ O365Interactive (理由は後述)、それ以降は O365Modern で OK。ただし実際にはここで取得した「トークン」の有効期限の問題 (なの?) もあるようで、3ヶ月に1回くらいは「一瞬だけ O365Interactive に切り替えて認証をクリア」することが必要になりそう。
  2. Mew によるメール送信: ${HOME}/.mew.el を以下のようにする。
    (setq mew-name "Masanori Kameyama")
    (setq mew-user "俺")
    (setq mew-mail-domain "俺のドメイン")
    (setq mew-smtp-server "localhost")
    (setq mew-smtp-port "1025")
    (setq mew-smtp-user "俺のアドレス@俺のドメイン")
    (setq mew-smtp-auth-list '("CRAM-MD5" "PLAIN" "LOGIN"))
    (setq mew-mailbox-type 'mbox)
    (setq mew-mbox-command "incm")
    (setq mew-mbox-command-arg "-u -d /var/mail/俺")
    
    初回の送信の際にはウェブブラウザ経由での対話的な認証が求められる (その対策として初回のみ O365Interactive に設定しておく) が、2回目以降は不要。
  3. getmail による受信: 設定ファイルは以下のような感じにしてある。後述の理由により、IMAP ではなく POP3 のほうが吉かと。
    [retriever]
    type = SimplePOP3Retriever
    server = localhost
    username = 俺のアドレス@俺のドメイン
    port = 1110
    password = 俺のパスワード
    [options]
    read_all = False
    delete = false
    verbose = 0
    max_messages_per_session = 100
    [destination]
    type = Mboxrd
    path = /var/mail/俺
    
    どうせ davmail と getmail のやりとりはローカルなので、わざわざ SimplePOP3SSLRetriever にしなくてもいいでしょう。
本当にこれだけ。なぜもっと早く分からなかったのかと、亀山は猛烈に悔やんでます。

亀山の経験では、以下の2つの理由により、davmail と getmail で Microsoft からメールを拾ってくる際には、IMAP は避けたほうがよさげです。

  1. バージョン 6.17 以降の getmailを使うこと。このバージョン以降の getmail には skip_imap_fetch_size というオプションが設けられていて、これを true に指定しておかないと、IMAP requests size, making davmail download all the messages every time, making it slow という事態が発生してしまう。
  2. getmail が同じメールを何度もくり返しダウンロードしてくるという事件が頻発する。おそらくは亀山が「2分に1回 getmail」しているとか、あるいは4万通を超えるメールをサーバー上に置き去りにしてあるとかいうせいだと思いますが、メールを収納しているフォルダの実体がサーバー上を移動した際に IMAP がメールの既読/未読を判定し損なってしまうのではないかと。
もちろん IMAP と比べて POP3 には機能的な制限はありますが、メールを手元にダウンロードしてきて処理する限りは大差ないと思いますです。

今なお Fortran 使いの身ですが、お絵描き用データを VTK で出力したいんです

亀山もいろいろ格闘した末に (不格好ではありますけど) 力づくで xml ベースの VTK 形式でお絵描き用データを出力できるようにはなりました。

そのサンプルは以下のような感じです。 この fortran 90 プログラムをコンパイル、実行すると、vtksample.vts という (構造格子用) VTK 形式のファイルができます。 このファイルを ParaView などで開くと、

の図ができます。 構造格子の場合は、Points 要素によって各点の座標を指定し、かつ各方向の格子点の範囲を Extent によって指定してやると、Cells と Points の対応づけは自動的にやってくれます (便利だ)。

この例では (ファイルのサイズをできるだけ小さくしたいので)、座標や物理量を表わす単精度実数を ascii ではなく binary で出力しています。 VTK ファイルの binary のデータは、fortran でいう form=unformatted で出力されたファイルと同様に、

  1. データ本体に加えて、各32バイトのヘッダとフッタがつく
  2. ヘッダにはデータ本体の総バイト数が記録される
という形式になっています。 また binary 形式といえども実際の書き出しは Base64 でエンコードした後に ASCII 文字で行う必要があります。 上の例では同梱した拙作の Base64 エンコーダを使って、力づくで単精度実数を書き出しています。 ただしフッタ部分の処理が正しくできているか自信はありませんが、どうせそこに有意なデータは入ってないんだし、気にしなくてもいいのかしら??

それって ImageMagick でどうやるんだったっけ