Linux について。
(一部 CentOS を想定)目次
基本的なこと
-
パスワードの変更 (password)。
上記コマンド実行後、古いパスワードおよび新しいパスワードを順番に入力。
1
$
passwd
-
ディレクトリの移動 (change
directory)。
-
ホームディレクトリに移動。
ただし、ただの cd コマンドは、実際は環境変数 CDPATH に設定された path へ移動の意。
1
$
cd
( または
cd
~ )
-
1 つ上のディレクトリに移動 ( 2 つ上に行きたいときは、cd ../.. )
1
$
cd
..
-
1 つ前に居たディレクトリに移動
1
$
cd
-
-
ルートディレクトリ ( / ) に移動
1
$
cd
/
-
ホームディレクトリに移動。
-
リンクを貼る (link)。
-
ハードリンクを貼る
ハードリンクは実際にその場所にファイルのコピーを作る。但し、どちらか片方の中身を修正すればどちらにも変更が適用される。
1
$
ln
<元ファイル> <リンク先>
-
シンボリックリンクを貼る
シンボリックリンクは元ファイルへのショートカットを作る。ディスク容量は消費しない。
1
$
ln
-s <元ファイル> <リンク先>
-
ハードリンクを貼る
-
シンボリックリンク先の名前を調べる (readlink)。
-
シンボリックリンクの指し示す先を表示。
1
$ readlink <シンボリックリンク>
-
シンボリックリンクの指し示す先を (存在しなくても) 絶対パスで表示。
1
$ readlink -f <シンボリックリンク>
-
シンボリックリンクの指し示す先を表示。
-
一定時間ごとに決まったコマンドを実行する (watch)。
対称となる watch のオプションは -n <数字> で秒数を指定し、--differences で変更箇所のハイライトをするオプション。 この例では、sample.txt の中身を 10 秒ごとに表示している。
1
watch
-n 10 --differences
cat
sample.txt
-
コマンドの履歴を活用する
(history+ α)。
(参照: シェルのコマンド履歴からの再利用、のいろいろ - 元RX-7乗りの適当な日々)-
コマンドの履歴を表示する。
左から番号、日付、時間、コマンドが表示される。
1
$
history
-
history にあるコマンドを実行する。
-
直前のコマンドを実行 (!!)。
1
$ !!
-
<番号> 番目のコマンドを実行 (!<番号>)。
history にある 855 番のコマンドを実行。
1
$ !855
-
<文字列>から始まるコマンドを実行 (!<文字列>)。
history の中にある最近実行されたコマンドで pw から始まるものを再実行する。
1
$ !pw
-
<文字列>を含むコマンドを実行 (!?<文字列>)。
history の中にある最近実行されたコマンドで pw を含むものが実行される。(上の例だと、which pwd とか)
1
$ !?pw
-
文字列の 1 回の置換後に実行 (:s)。
900 番目に実行したコマンドの最初の hoge の部分を fuga に変えて実行する。2 つある場合はある回数だけ :s/<文字列>/<文字列>/ コマンドを書く。
1
$ !900:s/hoge/fuga/
-
コマンド全体の hoge を fuga に変換したい場合は g を頭に付ける。
1
$ !900:gs/hoge/fuga/
-
直前のコマンドを実行 (!!)。
-
いきなり実行するのは怖いので一旦表示することもできる。
こうすると、直前の gn から始まるコマンドを表示する。
1
$ !pw:p
-
インタラクティブにコマンドを探して実行。
Ctrl + R キーを押す。と出るので、適当にコマンドを打つと、history にあるコマンドで一致するものが提示されるので欲しいコマンドが出てきたときに Enter を押す。q で何もせずに解除。1
(reverse-i-search)`':
-
直前のコマンドの引数 ($_) を使う。
直前のコマンドの引数は $_ に入っている。なので、以下のようにディレクトリを作ってすぐにそのディレクトリに移動する場合など便利。以下の 2 通りの方法で可能。&& は前のコマンドが正しく実行された場合に後に続くコマンドを実行する、というコマンドですので、一行目の方が安全です。1
$
mkdir
hoge &&
cd
$_
2
$
mkdir
hoge;
cd
$_
-
コマンドの履歴を表示する。
-
システム全体の容量を確認する
(
df )-h オプション (h: human) で人に分かりやすいように適切なサイズで表示する。1
df
-h
-
ディスクの使用量を確認する
(disk
usage)。
1
$
du
- キロバイトで表示
1
$
du
-k
- メガバイトで表示
1
$
du
-m
- 適当な単位系で表示
1
$
du
-h
#human
- サイズ順で並べて表示
1
$
du
|
sort
-g
- キロバイトで表示
シェル (bash) スクリプト関連
シェルスクリプトは覚えると大変便利なので、是非勉強すべき。-
Usage を作る。
たとえ自分だけが使うとしても、将来の自分が理解できるようにスクリプトの使い方を Usage としてまとめておくべき。例えば、以下のようにファイルに付記する。01
##### usage #####
02
function
usage_exit() {
03
cat
<< EOF
04
Usage: $(
echo
$(
basename
$0)) [option] param
05
param: --
file
<
file
>: upload <
file
>
06
option: --
type
<
type
>: uploading
type
(default: $
type
)
07
-h|--help : show this message
08
EOF
09
exit
1
10
}
-
オプションを付ける。
スクリプトにオプションを渡して自由度を高めておけば、便利。上記スクリプトは以下の getopts 関数を使っても書けるが、ロングオプションを使えるなど、上記の方が自由度が高い。01
OPT=$(getopt -o h \
02
-l
file
:,
type
:,help --
"$@"
)
03
[ $? != 0 ] && usage_exit
04
05
eval
set
--
"$OPT"
06
while
true
;
do
07
case
$1
in
08
--
file
)
file
=$2;
shift
;;
09
--
type
)
type
=$2;
shift
;;
10
-h|--help) usage_exit;;
11
--)
shift
;
break
;;
12
esac
13
shift
14
done
15
shift
$(( OPTIND -1 ))
1
while
getopts
f:t:h OPT;
do
2
case
$OPT
in
3
f)
file
=
"$OPTSRG"
;;
4
t)
type
=
"$OPTARG"
;;
5
h) usage_exit;;
6
*) usage_exit;;
7
esac
8
done
9
shift
$(($OPTIND - 1))
-
awk の細かいこと (基本的なことは後日追加予定)
-
awk によって計算されて代入された変数には改行が含まれる (?)。
(例)ここで、echo のオプション -n は、次の行を読み込まないオプション。1
$ val1=$(
awk
'BEGIN{printf "%15.7E", 1.0}'
)
2
#---error---
3
$ val2=$(
awk
'BEGIN{printf "%15.7E", '
$val1
'}'
)
4
awk
: cmd. line:1: BEGIN{
printf
"%15.7E"
,
5
awk
: cmd. line:1: ^ unexpected newline or end of string
6
#---correct---
7
$ val1=$(
echo
-n $val1); val2=$(
awk
'BEGIN{printf "15.7E", '
$val1
'}'
)
-
awk によって計算されて代入された変数には改行が含まれる (?)。
サーバー管理関連
-
新しいユーザーを追加
1
# useradd <ユーザー名>
-
ユーザーを削除
-r オプションで、ホームディレクトリとその中身も削除。
1
# userdel -r <ユーザー名>
-
ユーザー名の変更
1
# usermod -l <新しいユーザー名> <古いユーザー名>
-
ホームディレクトリの変更
1
# usermod -d <新しいホームディレクトリ> <ユーザー名>
-
<ユーザー> のパスワードの変更
古いパスワードは訊かれないので、新しいパスワードを入力。
1
# passwd <ユーザー>
-
CentOS のバーション確認
1
$
cat
/etc/redhat-release
-
メモリの確認
-
MB で表示
1
$
free
-m
-
GB で表示
1
$
free
-g
-
<時間> 秒ごとに表示
1
$
free
-g -s <時間>
-
MB で表示
-
詳しい CPU の情報
1
$
cat
/proc/cpuinfo
-
詳しい メモリーの情報
1
$
cat
/proc/meminfo
-
ネットワーク関係の情報の確認
1
$
ifconfig
-
ハードディスクの増設等
Linux はハードディスクのマウント (接続して使えるようにすること) を自分で行う必要がある。 以下では、2 TB を超えるハードディスクのパーティションを区切ったり、マウントしたりする方法を示す。-
ディスクの確認 (
parted )この例では、/dev/sda、/dev/sdb、/dev/sdc というデバイス名が確認できる。/dev/sdb のテーブルには何も表示されていないので、これが今回接続したばかりの HDD だということが分かる。01
parted -l
02
Model: ATA WDC WD2003FYYS-0 (scsi)
03
Disk /dev/sda: 2000GB
04
Sector size (logical/physical): 512B/512B
05
Partition Table: msdos
06
07
Number Start End Size Type File system Flags
08
1 1049kB 538MB 537MB primary ext4 boot
09
2 538MB 69.3GB 68.7GB primary linux-swap(v1)
10
3 69.3GB 138GB 68.7GB primary ext4
11
4 138GB 2000GB 1862GB primary ext4
12
13
14
Model: ATA Hitachi HUA72303 (scsi)
15
Disk /dev/sdb: 3001GB
16
Sector size (logical/physical): 512B/512B
17
Partition Table: gpt
18
19
Number Start End Size File system Name Flags
20
21
22
Model: Seagate Expansion Desk (scsi)
23
Disk /dev/sdc: 3001GB
24
Sector size (logical/physical): 512B/4096B
25
Partition Table: gpt
26
27
Number Start End Size File system Name Flags
28
1 1049kB 3001GB 3001GB ext4 seagate3TB
また、2 TB 以下の HDD に関しては、fdisk というコマンドが使える。違いに関しては、 Linuxer の備忘録 にあるので参考に。今後はparted が使えればいいと思う。 -
パーティションを区切る
上の例に従って作業を説明する。として、1
parted /dev/sdb
2
GNU Parted 2.1
3
Using /dev/sdb
4
Welcome to GNU Parted! Type
'help'
to view a list of commands.
5
(parted)
parted の対話モードに入り、として、パーティションを GPT テーブルで区切ることを宣言。実際に次のコマンドでパーティションを区切る。 (パーティションの名前やタイプは場合に応じて変える。以下は 1 パーティションに区切る場合。)1
(parted) mklabel
2
New disk label
type
? gpt
3
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
4
this disk will be lost. Do you want to
continue
?
5
Yes/No? Yes
quit で終了する。内容を確認すると、1
(parted) mkpart
2
Partition name? []? BACKUP
3
File system
type
? [ext2]? ext4
4
Start? 0%
5
End? 100%
01
parted -l
02
Model: ATA WDC WD2003FYYS-0 (scsi)
03
Disk /dev/sda: 2000GB
04
Sector size (logical/physical): 512B/512B
05
Partition Table: msdos
06
07
Number Start End Size Type File system Flags
08
1 1049kB 538MB 537MB primary ext4 boot
09
2 538MB 69.3GB 68.7GB primary linux-swap(v1)
10
3 69.3GB 138GB 68.7GB primary ext4
11
4 138GB 2000GB 1862GB primary ext4
12
13
14
Model: ATA Hitachi HUA72303 (scsi)
15
Disk /dev/sdb: 3001GB
16
Sector size (logical/physical): 512B/512B
17
Partition Table: gpt
18
19
Number Start End Size File system Name Flags
20
1 1049kB 3001GB 3001GB BACKUP
21
22
23
Model: Seagate Expansion Desk (scsi)
24
Disk /dev/sdc: 3001GB
25
Sector size (logical/physical): 512B/4096B
26
Partition Table: gpt
27
28
Number Start End Size File system Name Flags
29
1 1049kB 3001GB 3001GB ext4 seagate3TB
-
ファイルシステムを作る (cf:
Linux パーティションに mkfs でファイルシステムを作る
)
上の参照記事にあるように、ファイルシステムにはいくつかの種類があるが、今後使い続けられる ext4 を用いることにする。ここで指定するのは、パーティション名である /dev/sdb1。デバイス全体である /dev/sdb を指定すると怒られる。 しばらく待っているとファイルシステムが構築される。01
mkfs.ext4 /dev/sdb1
02
mke2fs 1.41.12 (17-May-2010)
03
Filesystem label=
04
OS
type
: Linux
05
Block size=4096 (log=2)
06
Fragment size=4096 (log=2)
07
Stride=0 blocks, Stripe width=0 blocks
08
183148544 inodes, 732566272 blocks
09
36628313 blocks (5.00%) reserved
for
the super user
10
First data block=0
11
Maximum filesystem blocks=4294967296
12
22357 block
groups
13
32768 blocks per group, 32768 fragments per group
14
8192 inodes per group
15
Superblock backups stored on blocks:
16
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
17
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
18
102400000, 214990848, 512000000, 550731776, 644972544
19
20
Writing inode tables:
done
21
Creating journal (32768 blocks):
done
22
Writing superblocks and filesystem accounting information:
done
23
24
This filesystem will be automatically checked every 22 mounts or
25
180 days, whichever comes first. Use tune2fs -c or -i to override.
-
マウントする (cf:
Linux ハードディスクをマウント (mount) する
)
マウントするディレクトリを作ってからマウントする。ここでは、ルート (/) の下に BACKUP というディレクトリを作ってマウントした。1
mkdir
/BACKUP
2
mount
/dev/sdb1 /BACKUP
ついでにアンマウントする方法は以下。きちんとマウントできたかどうか1
umount
/dev/sdb1
df コマンドで確かめる。1
df
-h
-
マシンが起動時に毎回自動でマウントするように、/etc/fstab に書き込む。
まずは、すでにある fstab を確認すれば良いが、
参照記事
にあるように、デバイスの指定には複数の方法がある。mkfs でラベルを付ける方法や、UUID を使う方法など。ここでは、長くて見た目は悪いが重複することがないので、UUID を指定してマウントする。一方で、デバイス名を /dev/sdb1 で指定すると、デバイスの認識順によっては名前が変わってしまうので、よくない。
UUID を確認するには、blkid を実行する。確認した UUID を使って /etc/fstab に書き込む。OS はファイルの上から順番に実行するので、記述する場所は適当な場所にする (最後でいいと思う)。全部で 6 フィールドあり、それぞれはスペースかタブで区切る。1
blkid
fstab の設定がきちんとなされているか、一旦 umount して以下のコマンドきちんとマウントできるか確かめる。1
UUID=00000000-0000-0000-0000-000000000000 /backup ext4 defaults 0 0
1
mount
-a
-
ディスクの確認 (
ジョブ管理関連
torque + maui という組み合わせで使っている。 slurm の方がいいらしいので、今後導入したい、が、今のところこちら。 インストールがうまくいかない。(>_<)
サービスのリスタート
1 | service pbs_mom restart |
2 | service pbs_server restart |
3 | service maui restart |
FTP 関連
-
基本
- <FTP サーバー> に接続
-
1
$
ftp
[option] <FTP サーバー>
-
option
- -n: ログインセッションを無効で接続。
- -i: インタラクティブモードをオフで接続。
- <host> に接続する。
-
1
ftp
>
open
<host>
- 転送モードをテキスト (ASCII モード) にする。(デフォルト)
-
1
ftp
> ascii (asc)
- 現在のディレクトリの一を表示する
-
1
ftp
>
pwd
- <ディレクトリ> に移動する。
-
1
ftp
>
cd
<ディレクトリ>
- ローカル側のディレクトリを移動する
-
1
ftp
> lcd <ディレクトリ>
- <ディレクトリ> をサーバー側に作る。
-
1
ftp
>
mkdir
<ディレクトリ>
- <ファイル名> を削除する
-
1
ftp
> delete <ファイル名>
- サーバー上の <ファイル名> をローカル上に転送する。
-
1
ftp
> get <ファイル名>
- サーバー上の <複数のファイル名> をローカル上に転送する。
-
1
ftp
> mget <複数のファイル名>
- ローカル上の <ファイル名> をサーバー上に転送する。
-
1
ftp
> put <ファイル名>
- ローカル上の <複数のファイル名> をサーバー上に転送する。
-
1
ftp
> mput <複数のファイル名>
- ftp を終了する。
-
1
ftp
> bye
スクリプトで自動化する。
- サンプルスクリプト ($ cat ftpscript.txt)
-
1
open
<host>
2
user <ユーザー名> <パスワード>
3
ascii
4
mput <サーバーにアップロードしたいファイル>
5
bye
- 以上だと、パスワードを直接書き込むリスクがあるので、ftpscript.txt の作成を自動化し、パスワードは直接キーボードから入力させる (ファイルはすぐに削除されるが、一旦作られたファイルは暗号化されていないので、セキュリティ的に良くないかも。今後改善。)。自動化サンプルスクリプト ($ cat autoftp.sh)
-
01
#!/bin/sh
02
echo
"password?"
03
stty -
echo
04
read
passwd
05
stty
echo
06
#-----
07
cat
<< EOF > ftpscript.txt
08
open
<host>
09
user <ユーザー名> $
passwd
10
ascii
11
mput <サーバーにアップロードしたいファイル>
12
bye
13
EOF
14
#-----
15
ftp
-n -i > ftpscript.txt
16
rm
ftpscript.txt