我知道"biosdevname"
Linux 中功能的用途,但我不确定它是如何工作的.
我用Ubuntu 14.04和Ubuntu 14.10(都是64位服务器版本)进行了测试,看起来它们默认启用它 - 在系统启动后我的网络接口有一个名称,p4p1
而不是eth0
,不需要自定义.据我了解,为了biosdevname
启用,必须满足这两个条件:
biosdevname=1
必须将引导选项传递给内核biosdevname
必须安装包正如我已经提到的,Ubuntu 14.04和14.10似乎都提供biosdevname
默认功能:它们biosdevname
已经安装了包,我也不需要修改grub.cfg
- GRUB_CMDLINE_LINUX_DEFAULT
没有参数,我的网络接口仍然有BIOS名称(p*p*
)而不是内核名称(eth*
.)
后来我想恢复旧式设备命名,这就是有趣部分开始的地方.在尝试禁用该biosdevname
功能时,我决定尝试一下.因为它需要biosdevname
包工作(或者我在这里和那里阅读),我假设删除它就足以禁用该功能,所以我输入:
sudo apt-get purge biosdevname
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,之后重新启动我的网络接口仍然p4p1,
如此
biosdevname
显然还是即使工作biosdevname
包已经被消灭了.
下一步,我应用了适当的更改/etc/network/interfaces
,以便恢复我的网络接口的旧名称(删除条目p4p1
和添加条目eth0
).结果,在另一次重新启动后,ifconfig
既eth0
没有报告也没有报告p4p1
操作系统仍然理解BIOS名称而不是内核名称.
事实证明,我还必须显式更改GRUB条目
GRUB_CMDLINE_LINUX_DEFAULT=biosdevname=0
并更新GRUB以获得预期结果(已biosdevname
禁用和恢复网络接口的旧名称).
我的问题是:biosdevname
没有biosdevname
包裹怎么办?毕竟不是必需的吗?如果是这样,究竟是什么提供了biosdevname
功能以及它是如何工作的?
这是一个演示我的问题的程序的完整源代码(操作系统是Ubuntu 14.04 32位,如果重要的话):
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
int status, fd;
printf("CURRENT UID: %d, CURRENT GID: %d\n", getuid(), getgid());
fd = open("/dev/ttyS0", O_WRONLY);
if(fd < 0)
{
printf("Error opening /dev/ttyS0: %s\n", strerror(errno));
return 1;
}
printf("Successfully opened /dev/ttyS0\n");
close(fd);
/* DROP PRIVILEGES */
setgid(1000);
setuid(1000);
printf("CURRENT UID: %d, CURRENT GID: %d\n", getuid(), getgid());
fd = open("/dev/ttyS0", O_WRONLY);
if(fd < 0)
{
printf("Error opening /dev/ttyS0: %s\n", strerror(errno));
return 1; …
Run Code Online (Sandbox Code Playgroud) 对于下面两个例子中的每一个,我将尝试解释我期望的结果和我得到的结果.我希望你帮我理解为什么我错了.
1)
VAR1=VAR2
$VAR1=FOO
结果: -bash: VAR2=FOO: command not found
在第二行中,$VAR1
扩展为VAR2
,但为什么Bash将结果解释VAR2=FOO
为命令名而不是变量赋值?
2)
'VAR=FOO'
结果: -bash: VAR=FOO: command not found
为什么引号使Bash将变量赋值视为命令名?
你能否一步一步地描述Bash如何处理我的两个例子?