2012-05-10 124 views
4

我有一個應用程序開發在多個平臺上運行,啓動盤是'/ dev/nftla1''dev/hdc1'。 Grub引導程序有這個信息。如何知道我從哪裏啓動

但是,一旦內核接管&應用程序開始運行,它變得無關緊要。但是,在我的主要是'C'的應用程序中,我想知道啓動的來源,因爲這些平臺上的文件訪問方式不同。

我的問題是:是否有系統命令或任何技巧,你知道,可以幫助我試圖實現?

+0

循環播放fdisk或sfdisk的輸出並搜索「*」 –

回答

4

您可以從grub傳遞內核啓動選項,然後檢查它們。

cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-2.6.32-33-generic root=UUID=3c231d1a-b6cb-4526-95fe-eb8984c7a91a ro quiet splash 

More info

UPDATE: 您可以使用此C代碼解析/proc/cmdline

#include <stdio.h>                                    
#include <stdlib.h>                                   
#include <string.h>                                   

int parse_option(const char *line, const char *option, char *value, size_t size)                    
{                                        
    const char *p0, *p1;                                  
    int len;                                     

    p0 = strstr(line, option);                                 
    if (!p0)                                     
     return 0;                                    
    p0 += strlen(option);                                  
    p1 = strchr(p0, ' ');                                  
    if (!p1)                                     
     p1 = p0 + strlen(p0);                                 
    len = p1 - p0;                                    
    if (len > size - 1)                                  
     len = size - 1;                                  
    memcpy(value, p0, len);                                 
    value[len] = '\0';                                   
    return len;                                    
} 

void get_cmdline_option(const char *option, char *value, size_t size)                       
{                                        
    FILE *fp;                                     
    char *line = NULL;                                  
    size_t len = 0;                                   
    size_t read;                                    

    if (!size)                                     
     return;                                    
    *value = '\0';                                    
    fp = fopen("/proc/cmdline", "r");                               
    if (fp == NULL)                                   
     return;                                    
    while ((read = getline(&line, &len, fp)) != -1) {                           
     printf("%s", line);                                 
     if (parse_option(line, option, value, size))                           
      break;                                    
    }                                       
    fclose(fp);                                   
    if (line)                                     
     free(line); 
    return;                                     
}                                        

int main(int argc, char **argv)                                
{                                        
    char root[128];                                   
    get_cmdline_option("root=", root, sizeof(root));                           
    printf("root='%s'\n", root);                                
    return 0;                                     
} 
+0

+1。另外:'/ proc/cmdline'可以很容易地從C程序中讀取,而不會產生一個單獨的進程。 OP特別指出應用程序是用C編寫的。 – ArjunShankar

+0

感謝+1。順便說一下,掛載點可以從文件/ etc/mtab中讀取。 – alexander

+0

'/ etc/mtab'值得一提。 '/ proc/mounts'也存儲類似的信息(雖然內容不同) – ArjunShankar

3

檢查安裝了/的位置。

> mount | grep '/' 
/dev/sda1 on/type ext4 (rw,errors=remount-ro) 

(其實,從你的描述,我想你應該看看你在哪裏安裝讀取目錄,這不一定是引導驅動器。)

> df -h /tmp/ 
Filesystem   Size Used Avail Use% Mounted on 
/dev/sda1    113G 13G 95G 12%/

編輯

你正在使用rootfs,這意味着上述不會幫助你。 (這也意味着我更瞭解爲什麼你需要找出你從哪裏啓動,但我們不要理會這一點。)

亞歷山大已經指出/proc/cmdline。只是爲了完整性,我想我會提供另一種選擇:你可以看看通過啓動信息:

> dmesg | grep mounted 
[ 1.964952] EXT4-fs (sda1): mounted filesystem with ordered data mode 

(請注意,在上面的命令df,您應以目錄替換/tmp/你在哪裏讀書從。)

+0

感謝@Christopher Creutzig。以下是我所看到的: > df -h/tmp/ 文件系統大小已用可用空間百分比 rootfs 717M 29M 651M 4%/ – CodeCruncher

1

你可以得到你所期待的下/proc/mounts

例如:

$ grep \ /\ /proc/mounts 
rootfs/rootfs rw 0 0 
/dev/disk/by-uuid/<uuid>/ext4 rw,noatime,user_xattr,barrier=1,data=ordered 0 0 

而不是/dev/disk/by-uuid/<uuid>,它可以是/dev/disk/by-label/<label>/dev/disk/by-id/<id>/dev/disk/by-path/<path>

然後

$ readlink /dev/disk/by-uuid/<uuid> 
../../sda3 

希望上面的是你的應用程序非常有用。