2011-12-29 15 views
5

私はLinux Cプログラミングには新しく、デバイスのパーティション情報を取得できるAPIはありますか?Linux Cプログラミング:デバイスのパーティション情報を取得するには?

+0

をあなたが与えられたブロックで利用可能なパーティションのリストを取得したいですデバイス(おそらく物理ディスク)? –

+0

http://stackoverflow.com/questions/5288034/how-get-uuid-of-a-device-partition-in-linux-programatically –

+0

@Brian Cain はい、重複している可能性があります。 – bright

答えて

0

私はそのAPIについて認識していません。

私はldd `which fdisk`を実行しましたが、パーティションテーブルを読み取ることに関係するライブラリは表示されませんでした。

ソースコードを一目見てから、プログラムは外部ライブラリを使用していないことをさらに確信しています。

自分で物事を考え出すと、自分で学習に熱心している場合は、ここで私はあなたがするお勧め情報:

  1. MBR上のWikipediaのページをお読みください。
  2. fdiskにソースを取得し、コードを読んでください。
0

(疑似)ファイル "/ proc/partitions"には、少なくとも物理デバイスで検出されたパーティションのリストが含まれています。残念ながら、パーティションタイプについては何も言いません(特に、パーティションが実際に拡張パーティションかどうかを推測する簡単な方法はありません)。 は、ここで私は私のマシンの/ procの/パーティションで見つけるものです:

major minor #blocks name 

    8  0 488386584 sda 
    8  1 13631488 sda1 
    8  2 237375488 sda2 
    8  3   1 sda3 
    8  4 3650560 sda4 
    8  5 3413781 sda5 
    8  6 29294496 sda6 
    8  7 14651248 sda7 
    8  8 9767488 sda8 
    8  9 176586448 sda9 
    8  16 7815168 sdb 
    8  17 7811136 sdb1 

sdaが私のHDで、SDBはUSBドングルです。 sda3は拡張パーティションですが、ディスクのパーティションテーブルを直接読み取ることはできません。 このファイルに記載されている情報は、十分にあるかもしれません。 IMHOより安全な方法は次のとおりです。

1) Create a couple of pipes 
2) fork a process an redirect the pipes to child's stdin and sdtout (fd 0 and 1) 
3) execl "fdisk /dev/sdXXX" 
4) send a "p\n" command to the child process 
5) read the lines containg the complete partition information 

私はこれがあなたにできることを願っています。

2

いくつかのパーティションパラメータについて多くの擬似ファイルがある場合は、/sys/block/sd?/をご覧ください。

2

libblkidはすばらしいAPIです。 blkid(util-linuxパッケージにあります)はそれを使用しています。

blkidは、ラベル、ファイルシステムタイプ、およびUUIDとともにすべてのパーティションをリストします。ここに私のシステムの出力があります。

# blkid 
/dev/sda1: LABEL="grub" UUID="a760119d-916a-492c-8ec1-50f81dbf4e26" TYPE="ext2" 
/dev/sda3: LABEL="Library" UUID="248D72BD2E5CF009" TYPE="ntfs" 
/dev/sda5: LABEL="WinXP" UUID="545CC7085CC6E438" TYPE="ntfs" 
/dev/sda6: LABEL="Win7" UUID="22F009B2F0098CEB" TYPE="ntfs" 
/dev/sda7: LABEL="Puppy" UUID="fe1dc425-ad17-4773-971a-435d91690883" SEC_TYPE="ext2" TYPE="ext3" 
/dev/sda8: LABEL="Linux Mint" UUID="0c61a114-9353-499b-a1cd-ba19722b1e43" TYPE="ext4" 
/dev/sda9: LABEL="Ubuntu L" UUID="5f6923e1-92f4-4b3f-b613-9e78839e1987" TYPE="ext4" 
/dev/loop0: TYPE="squashfs" 
/dev/loop1: UUID="16e3a75d-74dc-4391-a9e2-4305c08c5707" TYPE="ext3" 
/dev/loop4: TYPE="squashfs" 
# 

ここでは、リファレンスマニュアルです:http://www.kernel.org/pub/linux/utils/util-linux/v2.21/libblkid-docs/

私はちょうど今、自分が同じ質問に対する答えを探して、このライブラリを見つけました。

7

Akash Rawalの回答はかなり近いです。良い方法はlibblkidを使うことです。

これは、パーティションのuuidを取得する例です。Using libblkid to find UUID of a partition

私は上記のコードとlibblkidの参照メニューの例を組み合わせて、作業プログラムの下に生成します。

#include <stdio.h> 
#include <string.h> 
#include <err.h> 
#include <blkid/blkid.h> 


int main (int argc, char *argv[]) { 
    blkid_probe pr = blkid_new_probe_from_filename(argv[1]); 
    if (!pr) { 
     err(1, "Failed to open %s", argv[1]); 
    } 

    // Get number of partitions 
    blkid_partlist ls; 
    int nparts, i; 

    ls = blkid_probe_get_partitions(pr); 
    nparts = blkid_partlist_numof_partitions(ls); 
    printf("Number of partitions:%d\n", nparts); 

    if (nparts <= 0){ 
     printf("Please enter correct device name! e.g. \"/dev/sdc\"\n"); 
     return; 
    } 

    // Get UUID, label and type 
    const char *uuid; 
    const char *label; 
    const char *type; 

    for (i = 0; i < nparts; i++) { 
     char dev_name[20]; 

     sprintf(dev_name, "%s%d", argv[1], (i+1)); 

     pr = blkid_new_probe_from_filename(dev_name); 
     blkid_do_probe(pr); 

     blkid_probe_lookup_value(pr, "UUID", &uuid, NULL); 

     blkid_probe_lookup_value(pr, "LABEL", &label, NULL); 

     blkid_probe_lookup_value(pr, "TYPE", &type, NULL); 

     printf("Name=%s, UUID=%s, LABEL=%s, TYPE=%s\n", dev_name, uuid, label, type); 

    } 

    blkid_free_probe(pr); 

    return 0; 
} 

使用法:

gcc -o getuuid getuuid.c -lblkid 
sudo ./getuuid /dev/sdc 
Number of partitions:1 
Name=/dev/sdc1, UUID=754A-CE25, LABEL=KINGSTON, TYPE=vfat 
関連する問題