2012-02-13 3 views
1

Linuxでディスク名を取得するためにどのようなモジュールをお勧めしますか?私はCPANでいくつか検索しましたが、私が見つけたすべてのモジュールは古すぎます。 Bashでは、次のようなものを使用できます:perl - Linuxのディスク名

disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3) 
echo $disk_name 
sda6 

Perlで同じことをする方法を理解してください。おかげさまで あなたが質問

df/| perl -ne 'm"^/\w+/(\w+)";print "$1\n" if defined $1;' 

にやっているだけで何をすべきか

+0

彼らは動作しますが、ここでいくつかの人々は私をないことをお勧めもはやサポートされていないモジュールを使用し、多くのバグが報告されています。 – Andrew

+1

まず、dfはディスク名を返しません。マウントされたファイルシステムのマウントポイントを報告します。 grep、awk、パイプラインを使ってカットするのはプロセスの無駄です! AwkはPerlのように、あなたが見せるすべてのことを行うことができます。 – JRFerguson

+0

だからこそ私はPerlで同じことをする方法を学ぼうとしています) – Andrew

答えて

5

Linuxの上に取り付けられたディスクをリストする「適切な」方法はQuotaモジュールを使用したPerlからアクセスできるgetmntent()システムコールを介して行われデバイスのマウントポイントは、さまざまなシステムファイルを解析する、またはdfの出力を解析する他のUnixシステムに移植する必要があります。残念ながら、この一見基本的なモジュールは標準のPerlディストリビューションには含まれていないので、CPANから(あるいはディストリビューションのパッケージリポジトリ—から)入手しなければなりません。Debian/Ubuntuにはlibquota-perlパッケージがあります。


ps。デバイス名を/に分割し、3番目の要素(cutコマンドのように)を単ににしないでください。/dev/sdb1sdb1に変更するのが安全な方法です。

  1. /dev —の下で生活するを持っているすべてのブロックデバイスは、それが実際には、条約のない:それでいくつかの問題があることです。
  2. で、/devのデバイスファイルであっても、そのサブディレクトリにある可能性があります。たとえば、私のルートファイルシステムはデバイス/dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0fにあります。例えば、仮想またはインメモリなどtmpfsなどのファイルシステムは、多くの場合、デバイス名noneでマウントされているが、それは彼らと任意のデバイス名を使用することが可能です:
  3. 時々、デバイス名でも、実際のファイルシステムのパスではないかもしれません。

あなたは/dev/一部を取り除きたいならば、私は正規表現を使用して保守的なアプローチをお勧めしたい、例えば次のように:

if ($dev =~ m(^/dev/(.*)$)s) { 
    print "The directory $path is mounted from device $1 under /dev.\n"; 
} else { 
    print "The directory $path is not mounted from a device under /dev.\n" 
} 
1

一つの方法が、それを行うにはCPANライブラリを使用すると、おそらく良いです。

2

説明しているのは、ディスク名ではなく、ルート(/)にマウントされたパーティションを表すブロックデバイスのデバイス名です。通常のコンピュータでは通常、/dev/sdXNまたは/dev/hdXNのようになります.Xはディスク番号です(プライマリハードドライブは通常A、セカンダリはBなど)。Nはそのデバイスのパーティション番号です。

あなたがUNIXシステムで常時稼働している場合は、すべてのマウントされたパーティションを一覧表示する/ etc/mtabファイル、またはほとんど同じものである特殊ファイル/proc/mountsを読むことができます。後でそれを解析して、必要なものを見つけて、そこからデバイス名を取得する必要があります。

代わりに、あなただけのプロセスとしてdfを実行し、perlのにその入力を取得し、

open(DF, "df|"); 
@mount_points = <DF>; 
close(DF); 

のようなものと、あなたが必要なものを見つけるために、データを反復処理することができます。私はあなたのために働くだろう私の頭の上のモジュールを認識していませんが、コードはとにかく私にとってはとても簡単です。

P.S. Max OS XはBSDの派生物であるが、同じファイル構造を持たないので、このアプローチはうまくいかないことに注意してください。 Mac OS Xでは、ファイル/etc/fstab.hdを読むことができます。このファイルには、同様の情報が含まれていますが、フォーマットは少し異なります。リストにクォータモジュールを使用して、ボーナスとして

use Quota; 

Quota::setmntent(); 
while (my ($dev, $path, $type, $opts) = Quota::getmntent()) { 
    print "The root device is $dev.\n" if $path eq "/"; 
} 
Quota::endmntent(); 

関連する問題