我开发了一个应用程序,可以在多个平台上运行,其中启动盘是'/ dev / nftla1'或'dev / hdc1'。 Grub引导程序具有此信息。
但是一旦内核接管&应用程序开始运行,它变得无关紧要。但是,在我的主要在'C'的应用程序中,我想知道启动的来源,因为在这些平台上访问文件的方式不同。
我的问题是:是否有系统命令或任何技巧可以帮助我实现的目标?
答案 0 :(得分: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;
}
答案 1 :(得分: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/
替换为您正在阅读的目录。)
答案 2 :(得分: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
希望以上内容对您的应用程序有用。