我有一個應用程序開發在多個平臺上運行,啓動盤是'/ dev/nftla1'或'dev/hdc1'。 Grub引導程序有這個信息。如何知道我從哪裏啓動
但是,一旦內核接管&應用程序開始運行,它變得無關緊要。但是,在我的主要是'C'的應用程序中,我想知道啓動的來源,因爲這些平臺上的文件訪問方式不同。
我的問題是:是否有系統命令或任何技巧,你知道,可以幫助我試圖實現?
我有一個應用程序開發在多個平臺上運行,啓動盤是'/ dev/nftla1'或'dev/hdc1'。 Grub引導程序有這個信息。如何知道我從哪裏啓動
但是,一旦內核接管&應用程序開始運行,它變得無關緊要。但是,在我的主要是'C'的應用程序中,我想知道啓動的來源,因爲這些平臺上的文件訪問方式不同。
我的問題是:是否有系統命令或任何技巧,你知道,可以幫助我試圖實現?
您可以從grub傳遞內核啓動選項,然後檢查它們。
cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.32-33-generic root=UUID=3c231d1a-b6cb-4526-95fe-eb8984c7a91a ro quiet splash
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;
}
+1。另外:'/ proc/cmdline'可以很容易地從C程序中讀取,而不會產生一個單獨的進程。 OP特別指出應用程序是用C編寫的。 – ArjunShankar
感謝+1。順便說一下,掛載點可以從文件/ etc/mtab中讀取。 – alexander
'/ etc/mtab'值得一提。 '/ proc/mounts'也存儲類似的信息(雖然內容不同) – ArjunShankar
檢查安裝了/
的位置。
> 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/
你在哪裏讀書從。)
感謝@Christopher Creutzig。以下是我所看到的: > df -h/tmp/ 文件系統大小已用可用空間百分比 rootfs 717M 29M 651M 4%/ – CodeCruncher
你可以得到你所期待的下/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
希望上面的是你的應用程序非常有用。
循環播放fdisk或sfdisk的輸出並搜索「*」 –