本节内容:
linux用户标识UID与有效用户标识EUID
在linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
以下通过一个典型问题和代码实例来说明UID和EUID的问题。
一,linux的passwd命令
passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:
zth@:~$ cd /etc
zth@:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
zth@:/etc$
出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。
而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的 EUID,而不是执行该程序的UID。
zth@:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
zth@:/usr/bin$
zth@:/usr/bin$
因此,普通用户可以通过passwd程序修改shadow文件内容,完成密码修改。
参考代码:
#include
#include
#include
int main(void)
{
printf("Current process UID: %ld\n",(long)getuid());
printf("Current process EUID: %ld\n",(long)geteuid());
return 1;
}
执行情况:
zth@:~$
zth@:~$ chmod u+s uid //用户主增加权限setuid
zth@:~$ ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
zth@:~$
zth@:~$ ./uid
Current process UID: 1000
Current process EUID: 1000
zth@:~$
zth@:~$ su //切换到root用户
Password:
root@:/home/gaolu# ls -l uid
-rwsr-xr-x 1 gaolu gaolu 9118 2009-03-08 22:26 uid
root@:/home/gaolu# ./uid
Current process UID: 0
Current process EUID: 1000 //有效用户ID为1000
root@:/home/gaolu#
root@:/home/gaolu#
本节内容:
Linux内核参数设置 提高Linux吞吐量。
在linux系统下,遇到如下的问题:
每秒7000多个包,动态请求非常多,有开始丢包现象。
解决:
修改一些内核参数,可以相对增强linux吞吐能力。
修改内容如下:
sysctl -w net.ipv4.netfilter.ip_conntrack_max=131072
sysctl -w net.ipv4.ip_conntrack_max=131072
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=60
sysctl -w net.ipv4.netfilter.ip_conntrack_generic_timeout=120
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans=60
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=15
sysctl -w et.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=60
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=60
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_max_retrans=2
sysctl net.ipv4.tcp_max_syn_backlog=3072
sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=6
sysctl -w net.ipv4.netfilter.ip_conntrack_max=163840
sysctl -w net.ipv4.tcp_synack_retries=1
1 关机前准备
1.1 观察系统使用状态
谁在线:who
联网状态:netstat -a
后台执行的程序:ps -aux
1.2 通知在线使用者关机时间
2 关机命令
2.1 sync
将内存中未写入硬盘的数据写入硬盘
2.2 shutdown
shutdown +2 # 2 min 后关机
shutdown 10:01 # 10:01关机
shutdown +2 "The machine will shutdown" # 2min 后关机,并通知在线者
2.3 reboot
重新启动,加参数后可以实现halt,poweroff
2.4 halt
指向reboot的链接,相当于shutdown -h
2.5 poweroff
指向reboot的链接, 相当于halt
3 执行等级
3.1 等级划分
run level 3: 纯文本模式
run level 5: 含图形接口模式
run level 6: 重新启动
3.2 等级切换
init 0 # 切换到等级0,即关机
附:shutdown,halt,poweroff区别
shutdown :使系统关闭,参考一下现有的解释:“命令安全地将系统关机。
有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重 启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。
这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等”。
而且shutdown会去执行 /etc/rc0.d/ 下面的脚本,也就是说会去执行runlevel 0 的脚本。 halt则不会。
poweroff: 切断系统电源
poweroff就是halt的软链接而已。执行的还是halt命令。关于halt 命令,可以这样理解:halt就是调用shutdown -h。
halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。