4

ブートディスクが'/dev/nftla1'または'dev/hdc1'である複数のプラットフォームで実行するように開発されたアプリケーションがあります。Grub ブートローダーにはこの情報があります。

しかし、カーネルが引き継いでアプリケーションが実行を開始すると、それは無関係になります。しかし、主に'C'である私のアプリケーションでは、ファイルへのアクセス方法がこれらのプラットフォームで異なるため、ブートのソースを知りたいです。

私の質問は次のとおりです。私が達成しようとしていることを助けることができるシステムコマンドまたはあなたが知っているトリックはありますか?

4

3 に答える 3

4

grub からカーネル ブート オプションを渡して、それらをチェックすることができます。

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

詳細情報.

更新: この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;                                                                                                                                                 
}
于 2012-05-10T14:49:15.730 に答える
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/

于 2012-05-10T14:38:15.190 に答える
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

上記があなたのアプリケーションに役立つことを願っています。

于 2012-05-15T02:11:39.670 に答える