naobe @ ウィキ
Linuxもろもろ
最終更新:
Bot(ページ名リンク)
-
view
Unix/Linuxに戻る
Linux専用技術の判定が難しいため、UNIX共通技術が混ざっている。
ERRNO
システムライブラリAPIを実行したときに、グローバルメモリに保管するエラー番号。
これがあるためにスレッドセーフでなくなる。
/usr/include/asm-generic/errno-base.h 参照
これがあるためにスレッドセーフでなくなる。
/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が日本のタイムゾーン。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"
クロック設定
http://jibun.atmarkit.co.jp/lskill01/rensai/lpicdrill08/lpicdrill01.html 参照
/etc/sysconfig/clock
/etc/sysconfig/clock
# 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の場合】
CentOS release 5.5 (Final)
VNC
/etc/init.d/vncserver参照
/etc/sysconfig/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コマンドで作成しないと静的ライブラリをリンクしてしまう。
libmystuff.soをlnコマンドで作成しないと静的ライブラリをリンクしてしまう。
共有ライブラリの登録
実行形式ファイルをメモリにロードするときに、共有ライブラリをロードするための検索パスをld.so.confに設定する。
- /etc/ld.so.confに共有ライブラリのディレクトリを追加する
- #ldconfig
共有ライブラリディレクトリの確認
ldconfig -p
動的ライブラリ
dlopenを使って、アプリケーション実行中にライブラリが必要なときにロード。ライブラリファイルの拡張子はso。ライブラリを使うプログラムのコンパイルオプションに-ldlを使う(dlopen等の動的ロード関数のライブラリ)。
apacheのDSOは、動的ライブラリを使って実装している。
apacheのDSOは、動的ライブラリを使って実装している。