Lから始まるLinux

2章60話
パス関連コマンド
2章61話 バイナリ関連コマンド
もくじ
2章62話
日時関連コマンド
バイナリ関連コマンド
若木 みどり
お兄ちゃん! 色々なコマンドを覚えて 操作の幅を広げたいんだ!
若木 しげる
今回はバイナリに関する コマンドを見ていこう!
若木 しげる
「バイナリ(binary)」 コンピュータが直接 処理するためのデータだよ 人間が読むためのテキストでは 書かれていないんだ だから専用のコマンドで 扱う必要があるよ!
file コマンド
若木 しげる
file ファイル形式を 表示するよ
file [オプション]... ファイル...
若木 みどり
もしかしてテキストファイルにも使えるのかな?
若木 しげる
うん、使えるよ!HTML などの種別も判別してくれるんだ
若木 しげる
では lsファイル形式を見てみよう
file /bin/ls
若木 みどり
ちょっとワクワクするね!
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=3ccc0d8aa8dc371f9c762c6e76823aa5b9d4041b, for GNU/Linux 3.2.0, stripped
若木 しげる
この「ELF(Executable and Linkable Format)」というのがLinux のバイナリ実行ファイル形式だよ
若木 みどり
Windows の EXEみたいなものなのね!
strip コマンド
若木 しげる
次は strip だよバイナリ実行ファイルからデバッグ情報などを削除してファイルサイズを大幅に減らしてくれるんだ
strip [オプション]... ファイル...
若木 みどり
デバッグ情報って普通の人は使わないと思うけど削除しても問題ないのかな?
若木 しげる
基本的には大丈夫だよ
若木 しげる
配布されているパッケージはほとんどがストリップ済みなんださっきの file の出力の最後をみてごらん
若木 みどり
「ストリップ済み(stripped)」ってあるね!
若木 しげる
strip を使う機会は少ないけど「ストリップ」という概念は時々出てくるよ
strings コマンド
若木 しげる
stringsバイナリの中からテキストを探して抜き出すよ
strings [オプション]... ファイル...
若木 しげる
ls に対して実行してみよう!
strings /bin/ls
若木 みどり
ls の中に普通のテキストが混じっているの?
/lib64/ld-linux-x86-64.so.2
v,nv
_ITM_deregisterTMCloneTable
__gmon_start__
...
.data
.bss
.gnu_debuglink
.gnu_debugdata
若木 みどり(驚き)
おわっ!たくさんの行が出力されたよ!
若木 みどり
でも…その中に「help」とか見覚えのある単語もあるね
若木 しげる
バイナリ実行ファイルの中にはエラーやヘルプのメッセージが含まれていることが多いんだ
若木 しげる
出力が多いのでless でページ送りしながら見たりgrep で探したい文字列だけ抜き出すといいよ
strings /bin/ls | less
strings /bin/ls | grep 'help'
ldd コマンド
若木 しげる
ldd実行ファイルが参照しているライブラリを表示してくれるんだ
ldd [オプション]... ファイル...
若木 みどり
「ライブラリ」コマンドの共通部品だったよね!
若木 しげる
ls を対象に調べてみよう!
ldd /bin/ls
若木 みどり
どんなライブラリを参照しているのかな?
        linux-vdso.so.1 (0x00007fff41b49000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb3e6187000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007fb3e617d000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb3e5e00000)
        libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007fb3e60e1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb3e61e1000)
若木 しげる
各行が必要としているライブラリだよもしこれらのライブラリが見つからないとls は動かないんだ
若木 みどり
コマンドが動かないときの原因調査に使えそうだね!
od コマンド
若木 しげる
odファイルの中身を八進数や十六進数の数値で表示するよ
od [オプション]... [ファイル]...
オプション役割
-x十六進数2バイト表示
-o八進数2バイト表示
若木 みどり
バイナリは生のデータだから数字として見るんだね!
若木 しげる
lsod覗いてみよう!表示が膨大なのでhead と一緒に使うね
od /bin/ls | head
若木 みどり
どれどれ?
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000003 000076 000001 000000 065420 000000 000000 000000
...
若木 みどり
数字だらけでよく分からないね!
若木 しげる
ls の中身を八進数で表示しているんだ
若木 しげる
数字を理解できる必要は無いよod でバイナリの中身が読める」とだけ覚えておこう!
dd コマンド
若木 しげる
dd入力元から出力先へデータを書き出すよ
dd [操作]...
操作説明
bs=バイト数入出力ブロックサイズを バイト数 にする(デフォルトは 512)
ibs=バイト数入力ブロックサイズを バイト数 にする(デフォルトは 512)
obs=バイト数出力ブロックサイズを バイト数 にする(デフォルトは 512)
count=個数ブロックを 個数 だけ処理する
skip=個数最初のブロックを 個数 だけスキップする
if=ファイル入力を ファイル から読み込む(デフォルトは 標準入力)
of=ファイル出力を ファイル へ書き出す(デフォルトは 標準出力)
若木 しげる
主にバイナリデータのコピーなどで使われるんだ
若木 みどり
ちょっとどう使っていいのかわからないコマンドだよ…
若木 しげる
確かにわかりづらいよねいくつか例を紹介するのでそれらを見てみよう!

若木 しげる
以下のコマンドは1024 バイトのランダムな内容を持つdata ファイルを作成するよ
dd bs=1024 count=1 < /dev/random > data
若木 みどり
1024 バイトを1ブロックとして1回だけ処理するんだね入力は /dev/randomランダムな内容を読み込みそれを data ファイルに書き出しているんだダミーファイル作成などで使えそうだね!

若木 しげる
次のコマンドはストレージ /dev/sda の内容全てを二進数の 0(ゼロ) で上書きするよ
dd < /dev/zero > /dev/sda
若木 しげる
/dev/zero二進数の 0(ゼロ) を出力し続けるファイルだよ
若木 みどり
それをストレージ /dev/sda書き出しているんだねストレージの内容を全消去しているのかな?
若木 しげる
そのとおり!ストレージ上の全データを0(ゼロ) で上書きしてまっさらに消去するときに使われるコマンドだよ

若木 しげる
このコマンドはストレージ /dev/sda先頭 512 バイトのデータをsda-mbr ファイルに書き出すよ
dd bs=512 count=1 < /dev/sda > sda-mbr
若木 しげる
ストレージ先頭512 バイトはストレージ内の構成が書かれている場合がほとんどだよこのデータのバックアップを作成しているんだ

若木 みどり
dd特殊なコピー用途で使うんだね!
若木 しげる
他にも入出力の間でちょっとした変換を挟むこともできるけどここでは省略するね
まとめ
若木 みどり
今回はバイナリ関連コマンドfile, strip, strings,ldd, od, dd学んだよ!
若木 しげる
バイナリを直接扱う機会はあまり多くないので最初はこのぐらいのコマンドを知っていれば十分だよ!