naobe @ ウィキ

Linuxもろもろ

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
Unix/Linuxに戻る

Linux専用技術の判定が難しいため、UNIX共通技術が混ざっている。

ERRNO

システムライブラリAPIを実行したときに、グローバルメモリに保管するエラー番号。
これがあるためにスレッドセーフでなくなる。
/usr/include/asm-generic/errno-base.h 参照
ERRNO 説明
EINTR Interrupted system call。ネットワークからIOしているときに発生する。このエラーの場合、リトライする。


制限

項目 出典
パス名最大長(PATH_MAX) 4096 /usr/include/linux/limits.h
ファイル名最大長(NAME_MAX) 4096 同上
プロセス最大オープンファイル(OPEN_MAX) 256 同上

ulimit -a で現在の制限を表示する


タイムゾーン

参考URL http://phys.cool.coocan.jp/physjpn/bccwinc/TZ.htm
環境変数TZがタイムゾーン。JSTが日本のタイムゾーン。TZには、国のタイムゾーンとUTCと国のタイムゾーンとの差(UTC-国のタイムゾーン)を設定する。JSTはUTCより9時間進んでいるため(JST=UTC+9)、タイムゾーンに日本を設定するには、TZ=JST-9を設定する。つまり-9の数字が大事。
1日前に設定するには、UTCのほうが大きくなるように時間差を設定しなければならないので、TZ=JST+15を設定する。この意味は、UTCより15時間前のタイムゾーンに設定したということになり、日本の現在時刻は、UTCの9時間後なので、9+15=24時間前にタイムゾーンを設定したことになる。
【1日前の表示】
 $ TZ=JST+15 date
 2012年 11月 15日 木曜日 20:06:47 JST
 $ date
 2012年 11月 16日 金曜日 20:06:55 JST

文字化けしているファイルの消し方

 $ls -i
50869301 text.txt 238939076 ?V?????t?H???_
$find . -inum 238939076
./?V?????t?H???_
 
$find . -inum 238939076 -exec rm -rf {} \;

man

セクション 説明
1 コマンド (ls、cat、kterm など)
2 システムコール (C言語の関数。open、fork など)
3 ライブラリ関数 (C言語の関数。printf、fopen、Tck/Tk、Xlib などの関数群)
4 デバイス・デバイスドライバ
5 ファイルフォーマット (uuencodeなどのファイル形式、hostsなどの書式)
6 ゲーム
7 その他 (環境変数の説明、groff の書式など)
8 システム管理 (各種デーモン、sendmail、mount*など)
9 新しく追加されたマニュアル(Tkなど?)

乱数発生器(RNG:Random Number Generator)

  • /dev/urandomをopenして,バイト数を指定してread


最大ヒープサイズ

以下のプログラムを実行して、最大ヒープサイズを求める
 #include <stdio.h>
 #include <stdlib.h>
 
 int main(int argc, char **argv) {
 
     int MB = 0;
 
     while(malloc(1<<20))
         ++MB;
     printf("Allocated %d MB\n", MB);
 
 }

実行結果: Allocated 3054 MB

coreダンプ

デフォルトでは、HDを圧迫しないように、吐かない設定になっている。
 $ ulimit -a
 core file size (blocks)        (-c)  0
以下のコマンドを実行する。10000000はcoreファイルの最大サイズ。
 ulimit -c 10000000
.bashrcに設定しておく

ディストリビューションのバージョン

Debian系 Debian/GNU Linux

 # cat /etc/debian_version
 3.1

RedHat系

CentOS

 # cat /etc/redhat-release
 CentOS release 4.3 (Final)

Fedora Core

 # cat /etc/redhat-release
 Fedora Core release 5 (Bordeaux)

Vine Linux

 # cat /etc/vine-release
 Vine Linux 3.2 (Ducru Beaucaillou)

Turbo Linux

 # cat /etc/turbolinux-release
 Turbolinux Server 8.0 (Viper)

カーネルバージョン

uname -r

小技

項目 説明
asciiでない名前のファイル削除 ls foo*で他のファイルがないことを確認する。rm foo*
ファイルの16進ダンプをとる od -t x1z -A x
逆アセンブル objdump -d 実行形式ファイル
標準出力と標準エラー出力をマージする $ command >foo 2>&1 標準出力をfooへ、標準エラー出力を標準出力へ転送するという意味。command 2>&1 >foo とすると、2>&1とした時点では標準出力はコンソールなので、標準エラー出力はコンソールにひもづく。 http://www.aksystem.jp/computer/UNIX/ForgettingUNIXCommand.htm 参照

実行形式ファイル、共有ライブラリが使用する共有ライブラリを表示する

-dオプションはダイナミックセクションを表示。
 readelf -d 実行形式ファイル/共有ライブラリ
NEEDEDが使用する共有ライブラリ
【例】
 [foo@host c]$ readelf -d tst
 
 Dynamic section at offset 0x5c8 contains 21 entries:
   Tag        Type                         Name/Value
  0x00000001 (NEEDED)                     Shared library: [libfoo.so.1]
  0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  0x0000000c (INIT)                       0x804831c
  0x0000000d (FINI)                       0x8048518
  0x6ffffef5 (GNU_HASH)                   0x8048168
  0x00000005 (STRTAB)                     0x8048244
  0x00000006 (SYMTAB)                     0x80481a4
  0x0000000a (STRSZ)                      138 (bytes)
  0x0000000b (SYMENT)                     16 (bytes)
  0x00000015 (DEBUG)                      0x0
  0x00000003 (PLTGOT)                     0x804969c
  0x00000002 (PLTRELSZ)                   16 (bytes)
  0x00000014 (PLTREL)                     REL
  0x00000017 (JMPREL)                     0x804830c
  0x00000011 (REL)                        0x8048304
  0x00000012 (RELSZ)                      8 (bytes)
  0x00000013 (RELENT)                     8 (bytes)
  0x6ffffffe (VERNEED)                    0x80482e4
  0x6fffffff (VERNEEDNUM)                 1
  0x6ffffff0 (VERSYM)                     0x80482ce
  0x00000000 (NULL)                       0x0
 
 [foo@host c]$ readelf -d libfoo.so.1
 
 Dynamic section at offset 0x65c contains 21 entries:
   Tag        Type                         Name/Value
  0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  0x0000000e (SONAME)                     Library soname: [libfoo.so.1]
  0x0000000c (INIT)                       0x2f8
  0x0000000d (FINI)                       0x624
  0x6ffffef5 (GNU_HASH)                   0xb4
  0x00000005 (STRTAB)                     0x1c0
  0x00000006 (SYMTAB)                     0xf0
  0x0000000a (STRSZ)                      164 (bytes)
  0x0000000b (SYMENT)                     16 (bytes)
  0x00000003 (PLTGOT)                     0x1730
  0x00000002 (PLTRELSZ)                   40 (bytes)
  0x00000014 (PLTREL)                     REL
  0x00000017 (JMPREL)                     0x2d0
  0x00000011 (REL)                        0x2b0
  0x00000012 (RELSZ)                      32 (bytes)
  0x00000013 (RELENT)                     8 (bytes)
  0x6ffffffe (VERNEED)                    0x280
  0x6fffffff (VERNEEDNUM)                 1
  0x6ffffff0 (VERSYM)                     0x264
  0x6ffffffa (RELCOUNT)                   1
  0x00000000 (NULL)                       0x0
ldd 実行形式ファイル/共有ライブラリ
【例】
 [foo@host c]$ ldd tst
         linux-gate.so.1 =>  (0x00241000)
         libfoo.so.1 => /home/foo/language/c/libfoo.so.1 (0x0094f000)
         libc.so.6 => /lib/libc.so.6 (0x00c95000)
         /lib/ld-linux.so.2 (0x002c4000)
 
 [foo@athlon4 c]$ ldd libfoo.so.1
         linux-gate.so.1 =>  (0x00b07000)
         libc.so.6 => /lib/libc.so.6 (0x00de2000)
         /lib/ld-linux.so.2 (0x002c4000)

プロンプト

以下の設定で、値がシングルコーテーションで囲まれているのは何故か。PS1は、ログイン初期スクリプト(.profileなど)が実行されるときとコマンドが実行されるときの2度評価される。初回の評価ではPS1には、${PWD##*/}という文字がそのまま設定される。次にコマンドが実行されたときにもう一度評価されて、現在のディレクトリを表示する。
 PS1='[$USER@$HOSTNAME ${PWD##*/}]\$ '

キーボード設定

/etc/sysconfig/keyboard
 KEYBOARDTYPE="pc"
 KEYTABLE="jp106"

クロック設定

 # The ZONE parameter is only evaluated by system-config-date.
 # The timezone of the system is defined by the contents of /etc/localtime.
 ZONE="Asia/Tokyo"
 UTC=true
 ARC=false
UTC=trueでブート時にハードウェアクロックにUTCを設定。UTC=falseだとlocaltimeを設定

OSのバージョン

/etc/redhat-release
【CentOSの場合】
 CentOS release 5.5 (Final)

VNC

/etc/init.d/vncserver参照
/etc/sysconfig/vncserverを修正して、ユーザ、ディスプレィ番号を修正する。

SCIMのキーバインド変更

SCIM入力メソッドの設定-->フロントエンド-->入力設定-->開始終了キーの設定-->キーコードでダイアログを表示したときに希望するキーを押す。

firefoxプラグインのインストール

  • /usr/lib/firefoxXXXの下にpluginsディレクトリを作成
  • ダウンロードした.soをpluginsディレクトリにコピー

ライブラリ

静的ライブラリ

コンパイルしたときにアプリケーションとリンク。ライブラリファイルの拡張子はa

静的ライブラリの作成

ar rcus アーカイブ オブジェクトファイル1 [オブジェクトファイル2 ...]
【例】
 ar rcus libfoo.a foo.o

共有ライブラリ

実行形式ファイルをメモリにロードするときにリンク。ライブラリファイルの拡張子はso。ライブラリを使うプログラムのコンパイルオプションとして、-l(ライブラリ名からlibを除いたもの)を指定する。

soname

共有ライブラリの名前。以下の形式。realnameのシンボリックリンクになる。
 libライブラリ名.so.インタフェース変更時に増加するバージョン番号

realname

実際の共有ライブラリファイルの名前。以下の形式。
 soname.マイナー番号.リリース番号

共有ライブラリの作成

 gcc -shared -Wl,-soname,SONAME -o REALNAME オブジェクトファイルリスト リンク
 gcc -shared -Wl,-soname,libmystuff.so.1 -o libmystuff.so.1.0.1 a.o b.o -lc
共有ライブラリを使って実行形式ファイルを作成する
  • libmystuff.soをlnコマンドで作成
  • 静的ライブラリを作成
  • ldを使ってリンク
【例】
 ln -s libmystuff.so.1 libmystuff.so
 ar rcus libfoo.a foo.o
 gcc -o tst tst.o -L/home/foo/language/c -lfoo
静的ライブラリがないと、-lfooは共有ライブラリを見つけてくれない。また-Lオプションでldの検索ディレクトリを指定しなければならない。静的ライブラリと、共有ライブラリの両方があれば共有ライブラリをリンクする。
libmystuff.soをlnコマンドで作成しないと静的ライブラリをリンクしてしまう。

共有ライブラリの登録

実行形式ファイルをメモリにロードするときに、共有ライブラリをロードするための検索パスをld.so.confに設定する。
  • /etc/ld.so.confに共有ライブラリのディレクトリを追加する
  • #ldconfig

共有ライブラリディレクトリの確認

 ldconfig -p

動的ライブラリ

dlopenを使って、アプリケーション実行中にライブラリが必要なときにロード。ライブラリファイルの拡張子はso。ライブラリを使うプログラムのコンパイルオプションに-ldlを使う(dlopen等の動的ロード関数のライブラリ)。
apacheのDSOは、動的ライブラリを使って実装している。
人気記事ランキング
ウィキ募集バナー