Linux系统命令之系统启动流程
- 【计算机加载BIOS】
该过程中最重要的一步就是对自身硬件的健康检查,这种通电之后的自检过程叫做“加电自检”,简称POST。 - 【系统引导】
BIOS默认会从硬盘上的第0柱面、第0磁道、第一个扇区中读取被称为MBR的东西,即主引导记录。
一个扇区的大小是512字节,存放的内容是一段引导程序和分区信息,其中引导程序部分占用446字节,另外64字节是磁盘分区表DPT,最后两字节是MBR的结束位。这512字节的空间内容是由专门的分区程序产生的,比如说Windows下的fdisk.exe,或者Linux下的fdisk命令,所以它不依赖于任何操作系统,而MBR中的引导程序也是可以修改的,所以可以利用这个特性实现多操作系统共存。
由于RedHat、CentOS默认会使用Grub作为其引导操作系统的程序,而Grub本身又比较大,所以常见的方式是在MBR中写入Grub的地址,这样系统实际会载入Grub作为操作系统的引导程序 - 【运行Grub】
Grub最重要的功能就是根据其配置文件加载kernel镜像,并运行内核加载后的第一个程序/sbin/init
,这个程序会根据/etc/inittab
来进行初始化的工作。其实这里最重要的就是根据文件中设定的值来确定系统将会运行的runlevel,默认的runlevel定义在id:3:initdefault:
中,其中的数字3说明目前的运行级别定义为3。 - 【系统的初始化配置】
第四步,Linux将根据/etc/inittab中定义的系统初始化配置si::sysinit:/etc/rc.d/rc.sysinit执行/etc/rc.sysinit脚本,该脚本会设置系统变量、网络配置,并启动swap、设定/proc、加载用户自定义模块、加载内核设置等。第五步是根据第三步读到的runlevel值来启动对应的服务,如果值为3,就会运行/etc/rc3.d/下的所有脚本,如果值为5,就会运行/etc/rc5.d/下的所有脚本。第六步将运行/etc/rc.local - 【启动对应服务】
设置系统变量、网络配置,并启动swap、设定/proc、加载用户自定义模块、加载内核设置等。第五步是根据第三步读到的runlevel值来启动对应的服务,如果值为3,就会运行/etc/rc3.d/下的所有脚本,如果值为5,就会运行/etc/rc5.d/下的所有脚本。 - 【运行/etc/rc.local】
Linux系统命令之系统运行级别
- 关于runlevel
- 运行级0:关机。
- 运行级1:单用户模式,系统出现问题时可使用这种模式进入系统维护,典型的使用场景是在忘记root密码时可进入此模式修改root密码。
- 运行级2:多用户模式,但是没有网络连接。
- 运行级3:完全多用户模式,这也是Linux服务器最常见的运行级。
- 运行级4:保留未使用。
- 运行级5:窗口模式,支持多用户,支持网络。
- 运行级6:重启。
Linux系统命令之用户管理
- UID和GID
- Linux系统采用一个32位的整数记录和区分不同的用户,这个用来区分不同用户的数字被称为User ID,简称UID。系统会自动记录“用户名”和UID的对应关系。Linux系统中的用户分为3类,即普通用户、根用户、系统用户。
- 普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统。。通常普通用户的UID大于500,因为在添加普通用户时,系统默认用户ID从500开始编号。
- 根用户也就是root用户,它的ID是0,也被称为超级用户,root账户拥有对系统的完全控制权:可以修改、删除任何文件,运行任何命令。
- 系统用户是指系统运行时必须有的用户,但并不是指真实的使用者。比如使用系统用户apache来运行httpd进程,而运行MySQL数据库服务时,需要使用系统用户mysql来运行mysqld进程。系统用户的ID范围是1~499。
- 在Linux系统中除了有用户之外,还有“用户组”的概念,不同的用户组同样也是用数字来区分的,这种用于区分不同用户组的ID被称为Group ID,也就是GID。
- UID和GID又有什么联系呢?,在Linux下每个用户都至少属于一个组。
- 要确认自己的UID,可以使用以下id命令来获得:
[root@localhost ~]#id
uid=0(root)gid=0(root)groups=0(root), 1(bin), 2(daemon), 3(sys), 4(adm), 6(disk), 10(wheel)
- 要确认自己的UID,可以使用以下id命令来获得:
- Linux系统采用一个32位的整数记录和区分不同的用户,这个用来区分不同用户的数字被称为User ID,简称UID。系统会自动记录“用户名”和UID的对应关系。Linux系统中的用户分为3类,即普通用户、根用户、系统用户。
/etc/passwd和/etc/shadow
- 系统用来记录用户名、密码最重要的两个文件就是/etc/passwd和/etc/shadow
[root@localhost ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ......(略去内容)......
格式说明如下(每一行被’:’分为7部分):
- 关于密码项,目前Linux的做法是,将密码相关的信息保存到/etc/shadow中,而且默认只有root用户才有读的权限,其他人完全没有读取这个文件的可能。
具体如下:
- 新增和删除用户
- 新增用户useradd
[root@localhost ~]# useradd john
- 首先,系统需要将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow文件末尾追加一条记录,同时会分配给该用户一个UID。
- 接着,要为该用户自动创建家目录。家目录以创建的用户名为目录名,创建的路径在/home目录中。比如,在上述案例中,创建的目录将是/home/john。
- 然后,复制/etc/skel下所有的文件(大部分是隐藏文件)至/home/john。
- 最后,新建一个与该用户名一样的用户组,也就是说当创建用户john的时候,也同时创建了一个叫john的用户组,而用户john默认属于john用户组。
【说明】系统在添加用户时,需要预先为这个用户创建一些默认的“配置文件”,而默认配置的就是/etc/skel目录下的几个隐藏文件。可以说,/etc/skel实际上是创建用户时的“模板”。
【补充】
在使用useradd添加用户时,系统会给该用户自动分配一个UID,但是也可以通过使用-u参数实现指定UID,当然,必须要指定的UID不与其他用户冲突才可以。如下:
[root@localhost skel]# useradd -u 555 user1
下面就是创建用户user2时,指定了该用户所属的Group是user1。
[root@localhost skel]# useradd -g user1 user2
下面这样就可以指定/home/mydir3作为user3用户的家目录(创建的时候):
[root@localhost skel]# useradd -d /home/mydir3 user3
- 修改密码passwd
如果具有root权限,则可以修改用户的密码
[root@localhost skel]# passwd john
普通用户也可以使用passwd来修改自己的密码,但是需要提供当前用户的密码才可以:
[john@localhost ~]$ passwd
- 修改用户usermod
需要对已存在的用户进行修改,这时候就需要使用usermod命令了。
[root@localhost ~]# usermod -d /home/alice_new -m alice
其中,-m参数的作用是,如果指定用户的家目录存在,就自动创建新目录/home/alice_new,并使用该目录作为alice的新家目录。 - 账号的临时冻结与解冻
也许会因为某些原因,账号alice现在还不适合使用(如发现账号异常),需要暂时将这个账号冻结起来,这时,可以使用-L参数实现此目的。如下:
[root@localhost ~]# usermod -L alice
使用-U参数可以解锁:
[root@localhost ~]# usermod -U alice
- 删除用户:userdel
[root@localhost ~]# userdel alice
使用这个命令会将删除alice在/etc/passwd和/etc/shadow中的记录。但是从数据安全方面考虑,默认情况下,删除用户时并不会删除原来用户的家目录和邮件信息。可以使用-r参数同时删除用户家目录和该用户的邮件。注意,一旦执行了这条命令,该用户的相关文件就会被全部删除。 - 增加用户组:groupadd
[root@localhost ~]# groupadd group1
在/etc/group文件中,每一行就代表一个用户组,其格式是使用3个分隔号“:”隔开的4列。第一列是用户组名,第二列代表密码(但是并不使用),第三列代表用户组的数字ID,第四列是组成员,这里为空说明还没有任何用户属于这个组。 - 删除用户组:groupdel
这里需要注意的是,如果已有用户属于这个试图删除的组,该操作会失败。
[root@localhost ~]# groupdel group1
- 查看用户
使用命令users可以查看当前系统有哪些用户。users命令相对比较简单,所以列出的信息也比较少,可以使用命令who来看到更多信息。 - 查看用户详细信息:finger
如果在finger后跟上某个用户名,则显示该用户更详细的信息,如下所示:
[root@localhost ~]# finger user1
- 用户切换
su是切换用户的意思。在不加参数的情况下,su命令默认表示切换到root用户,之后只要输入root密码就可以切换身份为root了,完成操作后,使用exit命令可以退出root切换到原先的用户
su命令后面还可以加上一个“-”参数,就是键盘上的中横线。加上这个参数后,切换成root用户时,不但身份变成了root,而且还能应用root的用户环境。所谓“用户环境”就是/etc/passwd中定义的用户家目录、使用的Shell,以及关于这个用户的个性化设置等。
如说用户john在使用过程中需要临时切换成用户user1,这时就可以使用su - user1
令切换用户,但是同样需要知道user1的密码。,root用户可以使用su命令切换成任意用户而不需要密码。 - 权限提升sudo
sudo passwd user1
使用root的身份修改user1的密码。运行该命令时,系统首先检查/etc/sudoers
,判断该用户是否有执行sudo的权限,在确定有执行权限后,系统要求用户输自己的密码,如果密码输入正确,则会以root用户的身份运行passwd user1命令。
想要使用sudo权限,首先需要设置/etc/sudoers这个配置文件。或者是直接visudo来在任意路径下进行该文件的编辑(且该命令还具有sudo文件配置的自检功能):
[root@localhost ~]# visudo
在该文件下,可以进行用户权限的添加:
root ALL=(ALL) ALL
john ALL=(ALL) ALL
加入的john ALL=(ALL)ALL
这一行代表的意思是,john这个用户(第一列)可以从任何地方登录后(第二列的ALL)执行任何人(第三列的ALL)的任何命令(第四列的ALL)。
john ALL=(ALL) NOPASSWD:ALL
这样用户john在使用sudo时就不再需要输入密码了。
但是,将最后一个参数设置为ALL是很不安全的,因为这意味着用户实际拥有了全部的系统权限,和root的权限是一致的,在工作中可以根据用户实际的工作内容定义用户可以sudo执行的命令列表。假设用户john由于工作需要,经常要重启或者关闭服务器,那么就可以进行如下具有针对性的设置:
john ALL=(ALL) NOPASSWD:/sbin/shutdown, /usr/bin/reboot
若是想要修改某一个组的sudo权限的时候:比如%john ALL=(ALL)ALL
可以让所有属于john用户组的用户从任何地方登录后执行任何人的任何命令。
- 新增用户useradd