So-net無料ブログ作成
検索選択
Linux再入門 ブログトップ

テープデバイスを使おうとして「メモリが足りない!」とか怒られた場合 [Linux再入門]

 諸般の事情により、テープデバイスからデータを読み出そうとしたところ…

 メモリが足りません

 的なエラーメッセージが出ることがある。
 例えば…

 cd /some/directory
 find . -print | cpio -oBv -H newc > /dev/st0

 という感じでデータをテープにコピーした後、一旦テープをイジェクトし、再度テープを挿入。

 cat /dev/st0 | cpio -ivt

 みたいなことをしようとするとエラーメッセージが出てにっちもさっちも行かない…なんてケース。(出ないこともある)

 あるいは、テープが接続されているサーバにディスクの空き容量が無いので、他のマシンでデータを復元しようとして…

 ssh FileServer "cd /some/restore;cpio -iBvumd" < /dev/st0

 または

 cd /some/restore
 ssh TapeServer "cat /dev/st0" | cpio -iBvumd

 とかやろうとした場合。
 メモリなんか湯水のように使えるサーバでも「メモリが足りません」的なメッセージで苦しめられてしまう。

 そんなときには、テープが接続されているサーバで以下の呪文を唱えてあげよう。

 mt -f /dev/st0 setblk 5120

 cpioコマンドオプションに「B」を含めた場合、ブロックサイズは5120バイトになるので、mtコマンドでブロックサイズを5120バイトだよという具合に指示してやる必要がある。

 ddコマンド等を経由してテープデバイスにデータを書き出した場合は別の値になるので要注意。「bs」の値とかその辺的なふいんきで。。。。。。

Linux再入門・その3:結構便利な「fgrep」 [Linux再入門]

 「grepコマンド。とっても便利で何かと大活躍をしてくれるコマンドである。が、避けて通れない「正規表現」がある。
 ただし、今回はこの正規表現について云々する回じゃない。正規表現を避けて通りたい場合のお話である。(笑)



 例えば。正規表現として使われる記号に「.」(ピリオド)や「[」「]」(角カッコ)や「?」(クエスチョンマーク)などがある。しかし、このあたりの記号は割と普通に使われる記号でもある。例えば、ログファイル等に

[2008.11.11 01:23:45] server1 Error?

 みたいなメッセージが出たり出なかったりするケースを想定して欲しい。「[2008.11.11 01:23:45]」という文字列をgrepコマンドで検索したいからといって、うっかり「grep "[2008.11.11 01:23:45]" logfile」なんて指定しようものなら、狙ったとおりに表示されなくて悲しいことになってしまうかもしれない。

 これは、grepコマンドが「本来検索したい文字」を「正規表現」だと勝手に解釈してしまうことによって発生する。一般的に、「正規表現として特殊な働きを持つ文字そのものを記述したい場合」には、「¥」(円記号、またはバックスラッシュ)を先行して書くことになっている。「¥.」とかこんな具合に。

 しかし、ハナッから正規表現なんてアテにしてないよ!という場合には、fgrepコマンドを使用してやればよい。(grep -F としても良いけど)この場合、検索したい文字列は固定的にそのものの文字列として解釈される。これなら、「.」とか「*」とか「?」とか「[」とか「]」とか大量に混じっていてもいちいち「¥」でエスケープする必要が全くないし、正規表現と勘違いされて検索結果がグダグダになることもない。

 わりと便利な子なので活用してやって欲しい。

Linux再入門・その2:ワイルドカードは怖いけど怖くない [Linux再入門]

 Linuxをさわりたての人にとっては、正規表現・ワイルドカードというものにはたいそう抵抗感を覚えるそうで、なかなか飲み込めない・活用できないものらしい。まあ、正規表現もワイルドカードも、突き詰めていくと本が1冊かけてしまうくらい奥が深いものなので、こんなちっぽけな場末のblogじゃどうしようもないのだけども、そこまで肩肘張らずにもっと簡単に考えれば割とイージーで便利なものなんだけどねえ。



 ワイルドカードとして、とにかく頻繁に使われる物として「*」(アスタリスク)がある。(見やすさを優先するため、ここでは全角のアスタリスクを使ったが、実際には半角のアスタリスクであることは言うまでもない。なお、コマンドの投入例には正規の(半角の)アスタリスクやその他の記号を用いるが、読みづらいと思うので、適宜メモ帳等にコピー&ペーストしてもらって内容を確認してもらうと良いだろう

 アスタリスクは「何でも良い」という意味がある。(笑)
 たとえば、「*.conf」という記述をした場合は、「ナントカカントカ.conf」というファイルが片っ端に引っかかることになる。lsコマンドで試してみよう。/etcディレクトリの下をこのファイル指定方法で覗いてみると…

# cd /etc
# ls -l *.conf
-rw-r--r-- 1 root root   11  9月11日  2006 aspell.conf
-rw-r--r-- 1 root root  817 11月18日  2006 cpuspeed.conf
lrwxrwxrwx 1 root root   21  3月20日  2008 grub.conf -> ../boot/grub/menu.lst
-rw-r--r-- 1 root root   17  7月24日  2000 host.conf
-rw-r--r-- 1 root root  658 11月16日  2007 initlog.conf
-rw-r--r-- 1 root root    0  3月20日  2008 krb5.conf
 (以下省略)


 同じディレクトリで今度は「host*」と指定してみると…

# ls -l host*
-rw-r--r-- 1 root root  17  7月24日  2000 host.conf
-rw-r--r-- 1 root root 161  6月 3日 13:32 hosts
-rw-r--r-- 1 root root 161  1月13日  2000 hosts.allow
-rw-r--r-- 1 root root 347  1月13日  2000 hosts.deny
-rw-r--r-- 1 root root 163  3月20日  2008 hosts~


 ほら。よく我々が「なんだかよく分からないもの」とか「ハッキリと覚えていないもの」を言うときに、「ナントカカントカ」って言葉を使うじゃない?このワイルドカードの「*」とはまさにその「ナントカカントカ」を言う…と覚えてもらうと割と直感的に分かりやすいんじゃないかと思う。

 最初の例だと口に出して発音するまんまの記述をすると「ナントカカントカ・ドット・コンフ」だし、後者の例だと「ホスト・ナントカカントカ」ということを表現している訳。

 なお、「*」は何も無いも一致する。例えば、「hosts*」と指定したとする。(さっきはhost*だった)この場合…

# ls -l hosts*
-rw-r--r-- 1 root root 161  6月 3日 13:32 hosts
-rw-r--r-- 1 root root 161  1月13日  2000 hosts.allow
-rw-r--r-- 1 root root 347  1月13日  2000 hosts.deny
-rw-r--r-- 1 root root 163  3月20日  2008 hosts~


 「hosts」という文字列の後ろに何かがくっついているファイル名(なにがくっついていても良い)、「hosts.allow」とか「hosts.deny」とか「hosts~」とかが引っかかっているが、これと同時に「hosts」という文字列の後ろに何も無い、「hosts」そのものも引っかかっていることが判る。これは要するに、「*」が何でもよいという意味を持つのと同時に、無くても良いという意味を持っているからの他ならないのである。

 さて。この「*」は、ファイルやディレクトリの名前の先頭や末尾で使えるだけでなく、名前の中間に位置していても一向に構わない。

 ほどよく長くてほどよく面倒くさいファイル名やディレクトリを指定するときにも結構イケたりする。
 例えば、「/etc/sysconfig」ディレクトリの中に…

-rw-r--r--  1 root root   47  5月17日 18:17 network
drwxr-xr-x  2 root root 4096  5月17日 18:11 network-scripts/
drwxr-xr-x  4 root root 4096  3月20日  2008 networking/
-rw-r--r--  1 root root   48  3月20日  2008 network~


 「network-script」というディレクトリや、「networking」というディレクトリがある。bashを愛用している人は、TABキーを押してファイル名・ディレクトリ名の自動補完機能を愛用している人も多いと思うが、大抵そんなケースでは最初の2~3文字を入力してTABキーを押していると思う。が、この場合は8文字も入力しないと補完が効かないのである。いやらしいディレクトリ名である。(ま、滅多にこんなとここないけどなー)

 ところが、こういう場合にはワイルドカードの方が便利だったりする。

# pwd
/etc/sysconfig
# cd n*s
# pwd
/etc/sysconfig/network-scripts


 ワイルドカードを使えばたった3文字「n*s」と記述するだけで「network-scripts」ディレクトリであることを指定できているのである。(笑)これをTABキーを使ったファイル名の補完機能を使うというのなら、「network-」まで入力しなければならない。ワイルドカードさまさまなのである。(笑)

 もっと凶悪な例でいくと、例えば「/usr/local/apache2/conf」というディレクトリがあったとして、そのディレクトリの内容をlsしたい…(cdでもいいけど)とする。なんと、こんな事がまかり通ってしまうのである。

# cd /
# pwd
/
# ls -la /usr/*/*/conf
合計 72
drwxr-xr-x  4 root root  4096  9月21日 01:24 ./
drwxr-xr-x 15 root root  4096  5月17日 20:43 ../
drwxr-xr-x  2 root root  4096  9月21日 01:20 extra/
-rw-r--r--  1 root root  2083  9月21日 01:24 httpd.conf
-rw-r--r--  1 root root  1605  9月21日 01:18 httpd.conf~
-rw-r--r--  1 root root 12958  5月17日 20:42 magic
-rw-r--r--  1 root root 29430  5月17日 20:42 mime.types
drwxr-xr-x  3 root root  4096  5月17日 20:42 original/


 手抜きの極致である。(笑)




 他に、ワイルドカードの代表的な例としては「?」(クエスチョンマーク)がある。これは何か1文字という意味になる。これは、何でもいいけど何か1文字は必要という意味になる。また、これと同じくらい(かそれよりももうちょっと)便利なのが、「[」と「]」(角カッコ)で特定の文字を囲むものである。

 例えば。/devディレクトリの中に、ハードディスク等様々なデバイスファイルが配置されているが、これをいろいろなワイルドカードを使用してlsコマンドの結果を確認してみると…

 ① 「sd*」とした場合
# ls -l sd*
brw-r----- 1 root disk 8,   0 10月19日 21:09 sda
brw-r----- 1 root disk 8,   1 10月19日 12:09 sda1
brw-r----- 1 root disk 8,   2 10月19日 12:09 sda2
brw-r----- 1 root disk 8,  16 10月19日 21:09 sdb
brw-r----- 1 root disk 8,  17 10月19日 21:09 sdb1
brw-r----- 1 root disk 8,  32 10月19日 21:09 sdc
brw-r----- 1 root disk 8,  33 10月19日 21:09 sdc1
brw-r----- 1 root disk 8,  34 10月19日 12:09 sdc2
 (以下省略)


 ハードディスクそのものを表す、「sda」「sdb」というデバイス名と、そのディスクの中に作成されたパーティションを表す、「sda1」「sda2」といったデバイス名と両方が表示されている。

 ② 「sd?」とした場合
# ls -l sd?
brw-r----- 1 root disk 8,   0 10月19日 21:09 sda
brw-r----- 1 root disk 8,  16 10月19日 21:09 sdb
brw-r----- 1 root disk 8,  32 10月19日 21:09 sdc
brw-r----- 1 root disk 8,  48 10月19日 21:09 sdd
brw-r----- 1 root disk 8,  64 10月19日 21:09 sde
brw-r----- 1 root disk 8,  80 10月19日 21:09 sdf


 今度は、「sd」という文字に続けて何か1文字という指定だが、4文字以上のファイルは引っかかってこない。よって、「sda」「sdb」は条件に一致するので表示されるが、「sda1」「sda2」といったデバイスファイル名はここには表示されない。

 で、これと同じくらい(かこれよりもうちょっと)便利な指定方法がある。例えば、「sdd1とsde1とsdf1とsdg1だけ表示したいんだけどー」という場合。こういったケースに先ほどの「[」「]」(角カッコ)を使用する。
 「sd[defg]1」と、記述するのである。こうすると、角カッコで囲まれた部分は、その中の文字のいずれか1個に一致することが求められる。当然、どれか1文字は必ず必要だし、そこに含まれない文字は一致しないのである。lsコマンドで①や②と同じように実験してみよう。

 ③ 「sd[defg]」と指定した場合
# ls -l sd[defg]
brw-r----- 1 root disk 8, 48 10月19日 21:09 sdd
brw-r----- 1 root disk 8, 64 10月19日 21:09 sde
brw-r----- 1 root disk 8, 80 10月19日 21:09 sdf
brw-r----- 1 root disk 8, 96 10月19日 12:09 sdg


 見事にsdd、sde、sdf、sdgの4個だけが表示されている。「sd[defg]1」と指定したならこうなる。
# ls -l sd[defg]1
brw-r----- 1 root disk 8, 49 10月19日 21:09 sdd1
brw-r----- 1 root disk 8, 65 10月19日 21:09 sde1
brw-r----- 1 root disk 8, 81 10月19日 21:09 sdf1
brw-r----- 1 root disk 8, 97 10月19日 12:09 sdg1


 「ふ~ん。じゃあ、aとbとcとdとeとfとgとhとiとjとkとlとmとnとを表示したい場合には、sd[abcdefghijklmn]って書く訳?

 と、ヒネた質問をしたくなってウズウズする人も出そうなので、答えておく。連続した文字の範囲を指定する場合は、省略する記述方法がある。この質問のようにaからnまでというケースでは…「sd[a-n]」というように、「-」(ハイフン)を使う。こうすると、aからnまでいちいち記述しなくてもよくなる。なお、組み合わせての指定も出来るので、

 「ふ~ん。じゃあ、aとbとcとdとwとxとyとzとを表示したい場合には?

 こんなさらにヒネくれた場合には「sd[a-dw-z]」と、すれば解決なのである。どうだ参ったか。(笑)



 ワイルドカードは見てもらったとおり、難しく考えなければ実はそんなに難しい代物ではないことが判ってもらえただろうか。
 しかしながら、便利であるが故に危険性も少なくない特にcpコマンドやrmコマンドなどでファイルを操作する際に使用するケースなどでは、意図していなかったファイルを誤って消した・コピーした・移動したなどということが往々にして起こりうるのである。特に「*」(アスタリスク)は要注意である。うっかりどこかのディレクトリのファイルを全部…みたいなことがあり得るからね…orz



 まあ、気を付けてもらいつつ、いろいろ試してみてもらいたい。ワイルドカードはなれてしまえば非常に便利なので、これを使わないというのはとってももったいないからね。

Linux再入門・その1:オンラインヘルプは活用しましょう [Linux再入門]

 Linux初心者は脱したが、どうもその後がよく分からずに低空飛行を続けているという人に向けたヒント集(?)「Linux再入門」シリーズ。第1弾は「オンラインヘルプは活用しよう」編です。



 コマンドの使い方について、学校や職場でLinuxを初めて触れる際に学習したと思うけども、使い方についての記憶が少しでも怪しいとか、手順書や説明書、解説書、他の人のblogとか記事とかで知らないオプションを見かけたとか、そういう場合には遠慮無くオンラインヘルプ機能を活用しよう。Linuxの扱いに長けた人もこの機能はバンバン使っている(はずな)ので、コマンドを確認することは別に恥ずかしいことでも何でもない。むしろ、怪しい記憶のままコマンドを打ってる方こそ恥ずかしいと知りましょう。


 オンラインヘルプとしては2通りの方法があって、一つは「man」コマンドで調べる方法。もう一つはそのコマンド自体に「--help」というオプションを付けてみる方法。

# man cp
CP(1)                                                                    CP(1)

名前
       cp - ファイルやディレクトリをコピーする

書式
       cp [options] file path
       cp [options] file... directory

       POSIX オプション: [-fipRr]

       GNU   オ プション (簡略形式): [-abdfilprsuvxHLPR] [-S SUFFIX] [-V {num-
       bered,existing,simple}]     [--remove-destination]      [--sparse=WHEN]
       [--strip-trailing-slashes]  [--target-directory=DIR]  [--help]  [--ver-
       sion] [--]

説明
       cp はファイル (あるいはそのように指定すればディレクトリ) をコピーする。
       1  つのファイルを指定先にコピーしたり、複数のファイルを指定ディレクトリ
       にコピーしたりできる。

 (以下省略)

 端末のロケールが適切に設定されているなら日本語で表示されるはず。ロケールの設定が英語になっている場合は英語で、その他の言語ならその他の言語で表示されるかもしれない。また、コマンドによっては端末のロケールが日本語に正しく設定されているにもかかわらず、英語でしか表示されない場合もあります。

 manコマンドはlessコマンドでページングされているので、lessコマンドになじんだ人ならちょこまかと移動できたりするので試して欲しい。

 また、調べたいコマンドに「--help」オプションを付けてみる方法も有効です。

# cp --help
Usage: cp [OPTION]... [-T] SOURCE DEST
  or:  cp [OPTION]... SOURCE... DIRECTORY
  or:  cp [OPTION]... -t DIRECTORY SOURCE...
SOURCE から DEST へ、或いは FILE (複数可)を DIRECTORY へコピーする。

長いオプションに必須の引数は短いオプションにも必須です.
  -a, --archive                same as -dpR
      --backup[=CONTROL]       make a backup of each existing destination file
  -b                           like --backup but does not accept an argument
      --copy-contents          copy contents of special files when recursive
 (以下省略)


 なお、manコマンドと同様のコマンドに「info」というコマンドでもコマンドを参照できます。「info cp」のように指定しますが、こちらの方はまだ日本語化があまり進展していないようなので、英語が得意な方でなければmanコマンドを見ておくのが無難かと思います。(たぶん…)

 で、manコマンドの活用方法としては、例えば「コマンド自体が判らないんだけど…」というケースでも、コマンドを探し出すヒントを示してくれるかもしれません。(設定ファイルを探し出したい場合にも活躍するかもしれません)
 manコマンドで表示される項目に、「SEE ALSO」または「関連項目」(あるいは「ファイル」という項目とか)という項目があります。これをヒントにします。

# man mount
MOUNT(8)                   Linux Programmer’s Manual                  MOUNT(8)

名前
       mount - ファイルシステムをマウントする

書式
       mount [-lhV]

 (途中省略)

ファイル
       /etc/fstab        ファイルシステムの一覧表

       /etc/mtab         マウントされたファイルシステムの一覧表

       /etc/mtab~        ロックファイル

       /etc/mtab.tmp     テンポラリファイル

       /etc/filesystems  試行するファイルシステムタイプの一覧

関連項目
       mount(2),  umount(2),  fstab(5),  umount(8),  swapon(8), nfs(5),
       xfs(5), e2label(8), xfs_admin(8), mountd(8), nfsd(8), mke2fs(8),
       tune2fs(8), losetup(8)

 (以下省略)

 あとはこの編のコマンドをmanコマンドで見てまわると、結構さっくりと目的のコマンドに到達できることもあります。(出来ないこともあります…。)

 ちなみに、上記のmountコマンドのオンラインヘルプ機能を見ていて気づくと思いますが、「umount(2)」と「umount(8)」と同じコマンドで後ろに続く数字が異なる場合があります。この番号は「セクション番号」といいまして、同名の項目で内容の異なる記述を分ける時などに使われています。

 「umount(2)」を明示的に指定したい場合は

# man 2 umount
MOUNT(2)                   Linux Programmer’s Manual                  MOUNT(2)

名前
       mount, umount - ファイルシステムをマウント/アンマウントする

書式
       #include 

       int mount(const char *source, const char *target,
                 const char *filesystemtype, unsigned long mountflags,
                 const void *data);

       int umount(const char *target);

       int umount2(const char *target, int flags);

 (以下省略)


 「umount(8)」を明示的に表示したい場合は
# man 8 umount
UMOUNT(8)                  Linux Programmer’s Manual                 UMOUNT(8)

名前
       umount - ファイルシステムをアンマウントする

書式
       umount [-hV]

       umount -a [-dflnrv] [-t vfstype] [-O options]
       umount [-dflnrv] dir | device [...]

 (以下省略)

 このように、man コマンドの後ろにセクション番号を指定してから、見たいコマンド(ライブラリ関数とかファイルとか…)を指定します。

 なお。今回のこの記事で活躍したmanコマンドの詳しい使い方は、「man man」で表示されます。(笑)一度見ておきましょう。
Linux再入門 ブログトップ
メッセージを送る