├── pic ├── 00.png ├── 01.png ├── 02.png ├── 03.png ├── 04.png ├── 05.png ├── 06.png ├── 07.png ├── 08.png ├── 09.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 17.png ├── 18.png ├── 19.png ├── 20.png ├── 21.png ├── 22.png ├── 23.png ├── 24.png ├── 25.png ├── 26.png ├── 27.png ├── 28.png ├── 29.png ├── 30.png ├── 31.png ├── 32.png ├── 33.png ├── 34.png ├── 35.png ├── 36.png ├── 37.png ├── 38.png ├── 39.png ├── 40.png ├── 41.png ├── 42.png ├── 43.png ├── 44.png ├── 45.png ├── 46.png ├── 47.png ├── 48.png ├── 001.jpg ├── 002.jpg ├── 003.jpg ├── 004.jpg ├── 005.jpg ├── 006.jpg ├── top-pic.png └── 01-up100.png ├── pdf ├── 13-进程管理.pdf ├── 07-Bash简介.pdf ├── 01-Linux基础命令.pdf ├── 02-Linux用户和组.pdf ├── 04-Linux压缩打包.pdf ├── 06-Vim 编辑器.pdf ├── 08-日志和计划任务.pdf ├── 11-Linux内核.pdf ├── 12-SELINUX.pdf ├── 03-Linux文件和目录.pdf ├── 05-Linux 软件安装.pdf ├── 10-Linux开机启动流程.pdf ├── 00-linux_history.pdf └── 09-Linux文件系统和磁盘管理.pdf ├── README.md ├── 12-SELINUX.md ├── 05-Linux 软件安装.md ├── 10-Linux开机启动流程.md ├── 06-Vim 编辑器.md ├── 07-Bash简介.md ├── 13-进程管理.md ├── 11-Linux内核.md ├── 08-日志和计划任务.md ├── 02-Linux用户和组.md ├── 04-Linux压缩打包.md ├── 00-linux_history.md ├── 03-Linux文件和目录.md └── 09-Linux文件系统和磁盘管理.md /pic/00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/00.png -------------------------------------------------------------------------------- /pic/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/01.png -------------------------------------------------------------------------------- /pic/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/02.png -------------------------------------------------------------------------------- /pic/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/03.png -------------------------------------------------------------------------------- /pic/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/04.png -------------------------------------------------------------------------------- /pic/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/05.png -------------------------------------------------------------------------------- /pic/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/06.png -------------------------------------------------------------------------------- /pic/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/07.png -------------------------------------------------------------------------------- /pic/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/08.png -------------------------------------------------------------------------------- /pic/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/09.png -------------------------------------------------------------------------------- /pic/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/10.png -------------------------------------------------------------------------------- /pic/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/11.png -------------------------------------------------------------------------------- /pic/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/12.png -------------------------------------------------------------------------------- /pic/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/13.png -------------------------------------------------------------------------------- /pic/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/14.png -------------------------------------------------------------------------------- /pic/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/15.png -------------------------------------------------------------------------------- /pic/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/16.png -------------------------------------------------------------------------------- /pic/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/17.png -------------------------------------------------------------------------------- /pic/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/18.png -------------------------------------------------------------------------------- /pic/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/19.png -------------------------------------------------------------------------------- /pic/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/20.png -------------------------------------------------------------------------------- /pic/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/21.png -------------------------------------------------------------------------------- /pic/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/22.png -------------------------------------------------------------------------------- /pic/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/23.png -------------------------------------------------------------------------------- /pic/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/24.png -------------------------------------------------------------------------------- /pic/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/25.png -------------------------------------------------------------------------------- /pic/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/26.png -------------------------------------------------------------------------------- /pic/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/27.png -------------------------------------------------------------------------------- /pic/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/28.png -------------------------------------------------------------------------------- /pic/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/29.png -------------------------------------------------------------------------------- /pic/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/30.png -------------------------------------------------------------------------------- /pic/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/31.png -------------------------------------------------------------------------------- /pic/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/32.png -------------------------------------------------------------------------------- /pic/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/33.png -------------------------------------------------------------------------------- /pic/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/34.png -------------------------------------------------------------------------------- /pic/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/35.png -------------------------------------------------------------------------------- /pic/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/36.png -------------------------------------------------------------------------------- /pic/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/37.png -------------------------------------------------------------------------------- /pic/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/38.png -------------------------------------------------------------------------------- /pic/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/39.png -------------------------------------------------------------------------------- /pic/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/40.png -------------------------------------------------------------------------------- /pic/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/41.png -------------------------------------------------------------------------------- /pic/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/42.png -------------------------------------------------------------------------------- /pic/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/43.png -------------------------------------------------------------------------------- /pic/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/44.png -------------------------------------------------------------------------------- /pic/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/45.png -------------------------------------------------------------------------------- /pic/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/46.png -------------------------------------------------------------------------------- /pic/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/47.png -------------------------------------------------------------------------------- /pic/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/48.png -------------------------------------------------------------------------------- /pic/001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/001.jpg -------------------------------------------------------------------------------- /pic/002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/002.jpg -------------------------------------------------------------------------------- /pic/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/003.jpg -------------------------------------------------------------------------------- /pic/004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/004.jpg -------------------------------------------------------------------------------- /pic/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/005.jpg -------------------------------------------------------------------------------- /pic/006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/006.jpg -------------------------------------------------------------------------------- /pdf/13-进程管理.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/13-进程管理.pdf -------------------------------------------------------------------------------- /pic/top-pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/top-pic.png -------------------------------------------------------------------------------- /pdf/07-Bash简介.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/07-Bash简介.pdf -------------------------------------------------------------------------------- /pic/01-up100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pic/01-up100.png -------------------------------------------------------------------------------- /pdf/01-Linux基础命令.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/01-Linux基础命令.pdf -------------------------------------------------------------------------------- /pdf/02-Linux用户和组.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/02-Linux用户和组.pdf -------------------------------------------------------------------------------- /pdf/04-Linux压缩打包.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/04-Linux压缩打包.pdf -------------------------------------------------------------------------------- /pdf/06-Vim 编辑器.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/06-Vim 编辑器.pdf -------------------------------------------------------------------------------- /pdf/08-日志和计划任务.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/08-日志和计划任务.pdf -------------------------------------------------------------------------------- /pdf/11-Linux内核.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/11-Linux内核.pdf -------------------------------------------------------------------------------- /pdf/12-SELINUX.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/12-SELINUX.pdf -------------------------------------------------------------------------------- /pdf/03-Linux文件和目录.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/03-Linux文件和目录.pdf -------------------------------------------------------------------------------- /pdf/05-Linux 软件安装.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/05-Linux 软件安装.pdf -------------------------------------------------------------------------------- /pdf/10-Linux开机启动流程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/10-Linux开机启动流程.pdf -------------------------------------------------------------------------------- /pdf/00-linux_history.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/00-linux_history.pdf -------------------------------------------------------------------------------- /pdf/09-Linux文件系统和磁盘管理.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BoobooWei/booboo_linux_base/HEAD/pdf/09-Linux文件系统和磁盘管理.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | dir 2 | 3 | [01-Linux基础命令](01-Linux基础命令.md) 4 | 5 | [02-Linux用户和组](02-Linux用户和组.md) 6 | 7 | [03-Linux文件和目录](03-Linux文件和目录.md) 8 | 9 | [04-Linux压缩打包](04-Linux压缩打包.md) 10 | 11 | [05-Linux 软件安装](05-Linux 软件安装.md) 12 | 13 | [06-Vim 编辑器](06-Vim 编辑器.md) 14 | 15 | [07-Bash简介](07-Bash简介.md) 16 | 17 | [08-日志和计划任务](08-日志和计划任务.md) 18 | 19 | [09-Linux文件系统和磁盘管理](09-Linux文件系统和磁盘管理.md) 20 | 21 | [10-Linux开机启动流程](10-Linux开机启动流程.md) 22 | 23 | [11-Linux内核](11-Linux内核.md) 24 | 25 | [12-SELINUX](12-SELINUX.md) 26 | 27 | [13-进程管理](13-进程管理.md) 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /12-SELINUX.md: -------------------------------------------------------------------------------- 1 | # SELINUX 2 | 3 | [TOC] 4 | 5 | ## SELinux 6 | 7 | Security Enhanced Linux 安全强化的 Linux 8 | 9 | ### 作用 10 | 11 | 强制限制某些操作 , 属于权限的一种 12 | 13 | 思考 : 到目前为止学过的 linux 中的权限 ? 14 | 15 | u\g\o r\w\x ssid\sgid\stid acl attr 16 | 17 | ### 配置文件 18 | 19 | /etc/selinux/config 20 | 21 | ```shell 22 | [#15#root@rhel6 ~]#ll /etc/selinux/config 23 | -rw-r--r--. 1 root root 458 Jul 2 2015 /etc/selinux/config 24 | [#16#root@rhel6 ~]#ll /etc/sysconfig/selinux 25 | lrwxrwxrwx. 1 root root 17 Jul 2 2015 /etc/sysconfig/selinux -> ../selinux/config 26 | [#17#root@rhel6 ~]#cat /etc/selinux/config 27 | # This file controls the state of SELinux on the system. 28 | # SELINUX= can take one of these three values: 【三种状态】 29 | # enforcing - SELinux security policy is enforced. 【打开 selinux , 并强制限制】 30 | # permissive - SELinux prints warnings instead of enforcing. 【打开 selinux , 不限制操作 , 但会警 31 | 告】 32 | # disabled - No SELinux policy is loaded. 【关闭 selinux 】 33 | SELINUX=enforcing 34 | # SELINUXTYPE= can take one of these two values: 【两种类型】 35 | # targeted - Targeted processes are protected, 【针对网络服务较多 , 针对主机较少】 36 | # mls - Multi Level Security protection. 【全方位的控制】 37 | SELINUXTYPE=targeted 38 | ``` 39 | 40 | 重启电脑后生效 , 并永久生效 41 | 42 | ### 相关指令 43 | 44 | * 查看当前 selinux 状态的命令 : getenforce/sestatus 45 | * 设置 selinux 状态 ( 临时生效 ): setenforce [ Enforcing | Permissive | 1 | 0 ] 46 | 47 | ```shell 48 | [#12#root@rhel6 ~]#getenforce 49 | Enforcing 50 | [#13#root@rhel6 ~]#sestatus 51 | SELinux status: 52 | enabled 53 | SELinuxfs mount: 54 | /selinux 55 | Current mode: 56 | enforcing 57 | Mode from config file: 58 | enforcing 59 | Policy version: 60 | 28 61 | Policy from config file: 62 | targeted 63 | [root@rhel7 ~]# setenforce 0 64 | [root@rhel7 ~]# getenforce 65 | Permissive 66 | [root@rhel7 ~]# sestatus 67 | SELinux status: 68 | enabled 69 | SELinuxfs mount: 70 | /sys/fs/selinux 71 | SELinux root directory: 72 | /etc/selinux 73 | Loaded policy name: 74 | targeted 75 | Current mode: 76 | permissive 77 | Mode from config file: 78 | enforcing 79 | Policy MLS status: 80 | enabled 81 | Policy deny_unknown status: allowed 82 | Max kernel policy version: 28 83 | [root@rhel7 ~]# which getenforce 84 | /usr/sbin/getenforce 85 | [root@rhel7 ~]# rpm -qf /usr/sbin/getenforce 86 | libselinux-utils-2.2.2-6.el7.x86_64 87 | [root@rhel7 ~]# rpm -ql libselinux-utils|head 88 | /usr/sbin/avcstat 89 | /usr/sbin/getenforce 90 | /usr/sbin/getsebool 91 | /usr/sbin/matchpathcon 92 | /usr/sbin/selinuxconlist 93 | /usr/sbin/selinuxdefcon 94 | /usr/sbin/selinuxenabled 95 | /usr/sbin/selinuxexeccon 96 | /usr/sbin/setenforce 97 | /usr/share/man/man5/booleans.5.gz 98 | [root@rhel7 ~]# which sestatus 99 | /usr/sbin/sestatus 100 | [root@rhel7 ~]# rpm -qf /usr/sbin/sestatuspolicycoreutils-2.2.5-11.el7.x86_64 101 | [root@rhel7 ~]# rpm -ql policycoreutils|head 102 | /etc/sestatus.conf 103 | /usr/bin/secon 104 | /usr/sbin/fixfiles 105 | /usr/sbin/genhomedircon 106 | /usr/sbin/load_policy 107 | /usr/sbin/restorecon 108 | /usr/sbin/semodule 109 | /usr/sbin/sestatus 110 | /usr/sbin/setfiles 111 | /usr/sbin/setsebool 112 | ``` 113 | 114 | ### 操作限制的实现方法 115 | 116 | 1. 通过 bool 值来进行操作的限制 117 | * 1>getsebool -a <== 显示主机中所有的布尔值 118 | * 2>setsebool [-PV] boolean value | bool1=val1 bool2=val2 ... 119 | 120 | 2. 通过安全上下文 121 | 主体(进程)与目标的安全上下文必须一致才能够顺利访问 122 | 查看安全上下文 123 | ```shell 124 | [#19#root@rhel6 ~]#ls -Z 125 | -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg 126 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop 127 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Documents 128 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Downloads 129 | -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 index.php3?stat=26 130 | -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log 131 | -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog 132 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Music 133 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Pictures 134 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Public 135 | -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 root@172.25.0.10 136 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Templates 137 | drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Videos 138 | ``` 139 | 140 | 安全上下文主要用冒号分为三个字段 : 141 | 142 | Identify:role:type 143 | 144 | 身份识别 : 角色 : 类型1.5 selinux 所需要的服务 145 | 146 | 身份标识和角色并不重要,安全上下文里重要的就是这个类型,一个主体进程能不能读取到这个文件资源与类型字段有关。 147 | 之前我们说进程和文件的上下文的类型必须要匹配。这里涉及到两个专有名词,一个叫域,一个叫类型。其中主体程序中称为域,文件资源上称为类型,是不是有种听天书的感觉?很拗口吧?我们来举个列子。 148 | 先将httpd服务开启,service httpd start 149 | Cd /var/www/html 这里是一个系列的网页文件,可以看到文件类型属于httpd_sys_content_t 还有httpd_sys_script_exec_t。 150 | 然后我们再看进程的上下文类型 151 | 先查看有没有这个进程 pstree | grep httpd 152 | 然后查看进程的安全上下文 ps aux -Z | grep http。 153 | 在这里Httpd是一个域,selinux的策略针对这个域制定了许多的规则,其中包括这个域可以读的目标资源类型,比如sys_content。 154 | 主题进程和目标的文件的安全上下文必须匹配不然会有权限报错的提示 155 | 156 | 修改安全上下文 157 | 使用chcon命令来更改安全上下文的类型 158 | ```shell 159 | [root@python tmp]# ls --context test.txt 160 | -rw-r--r-- root root root:object_r:staff_tmp_t test.txt 161 | [root@python tmp]# chcon -t etc_t test.txt 162 | [root@python tmp]# ls -lZ test.txt 163 | -rw-r--r-- root root root:object_r:etc_t test.txt 164 | ``` 165 | 166 | ###Selinux的日志分析工具sealert 167 | setroubleshoot 168 | 169 | ```shell 170 | [#40#root@rhel6 ~]#yum install -y setroubleshoot ===>安装日志分析工具 171 | [#42#root@rhel6 ~]#rpm -ql setroubleshoot-server|head 172 | /etc/audisp/plugins.d/sedispatch.conf 173 | /etc/dbus-1/system.d/org.fedoraproject.SetroubleshootFixit.conf 174 | /etc/dbus-1/system.d/org.fedoraproject.Setroubleshootd.conf 175 | /etc/logrotate.d/setroubleshoot 176 | /etc/setroubleshoot 177 | /etc/setroubleshoot/setroubleshoot.conf 178 | /usr/bin/sealert 179 | [#40#root@rhel6 ~]#Sealert -a /var/log/audit/audit.log ===>使用日志分析工具来分析selinux的日志 180 | 等待数据处理,处理完毕之后查看 181 | ``` 182 | 183 | setroubleshot 将 selinux 相关的错误信息和解决方法记录在 /var/log/messages 日志中。`cat /var/log/messages | grep setroubleshoot` 184 | 185 | #### auditd 186 | 187 | * auditd --> 将 selinux 相关的信息记录在 /var/log/audit/audit.log 日志中,非常详细。 188 | * sealert -a /var/log/audit/audit.log 189 | 190 | ### selinux-policy-devel 191 | 192 | el6 上没有该软件 193 | ```shell 194 | [root@rhel7 ~]# yum list|grep selinux-policy-devel 195 | selinux-policy-devel.noarch 3.12.1-153.el7 server 196 | 197 | [#64#root@rhel6 ~]#yum list|grep selinux-policy-devel 198 | This system is not registered to Red Hat Subscription Management. You can use subscription-manager 199 | to register. 200 | ``` 201 | `man` 关键词 `_selinux` 查找和关键字相关的 `selinux` 限制具体内容 , 包括什么打开什么布尔值 , 需要设置怎样的安全上下文。 202 | -------------------------------------------------------------------------------- /05-Linux 软件安装.md: -------------------------------------------------------------------------------- 1 | # Linux 软件安装 2 | 3 | [TOC] 4 | 5 | ## 源代码安装 6 | 7 | * 优势 : 可定制,紧跟发布,及时修正Bug 8 | * 缺点 : 操作复杂 , 编译时间长 , 极易出现错误,大面积部署复杂且低效,安全性隐患大 9 | 10 | ### 源代码安装步骤 11 | 12 | * 下载解压,阅读软件包附带的 install 文件和 readme 文件,获取软件的相关信息。 13 | * 进入解包之后的目录,执行 “ ./configure” 命令,使用参数设置编译环境和编译模块,例如`--prefix`为编译做好关于本地环境的配置。 14 | * 配置成功后,执行 “ make” 命令进行软件编译。 15 | * 编译成功后,执行 “ make install” 命令完成安装。 16 | * 最后,执行 “ make clean” 命令删除安装时产生的临时文件 17 | 18 | ### 卸载步骤 19 | 20 | * 先进入软件的安装目录,然后执行卸载命令即可:`make uninstall` 21 | * 如果有的软件包不提供 uninstall 功能,则必须进行手动删除。因此你需要阅读安装目录里面的readme 文件,或者在安装的过程中指定安装目录,即在 ./configure 命令后面添加参数 --prefix ,例如:`./configure --prefix=/usr/local/dir` 22 | * 该命令将把软件安装在 /usr/local/ 路径的 dir 目录里。通常情况下,大多数软件都默认安装在 /usr/local 目录里。 23 | 24 | ### MPlayer源码安装实验 25 | 26 | >下载软件包到系统某个目录下,本次演示中使用/tmp/mplayer/目录,软件包包括主程序、库函数、皮肤 27 | 28 | ```shell 29 | wget .... 30 | all-20071007.tar.bz2 库函数 31 | Blue-1.7.tar.bz2 皮肤 32 | MPlayer-1.0rc2.tar.bz2 主程序 33 | ``` 34 | 35 | >将压缩包解压 36 | 37 | ```shell 38 | tar -jxf 39 | ``` 40 | 41 | >创建目录用来存放库函数 42 | 43 | `mkdir /usr/local/lib/codes` 44 | 45 | >将/tmp/mplayer/all/目录下所有文件复制到/usr/local/lib/codes 46 | 47 | ```shell 48 | cp all-20071007/* /usr/local/lib/codes 49 | ll /usr/local/lib/codes 50 | ``` 51 | 52 | >安装依赖包 53 | 54 | `yum install -y kernel-devel gcc zlib-devel gtk2-devel ` 55 | 56 | >检查安装环境 57 | 58 | ```shell 59 | cd /tmp/mplayer/MPlayer-1.0rc2 60 | ./configure --enable-gui --codecsdir=/usr/local/lib/codes --enable-x11 --enable-xshape --language=zh_CN --disable-ivtv --disable-png 61 | ``` 62 | 63 | >编译make 64 | 65 | `make` 66 | 67 | >安装 68 | 69 | `make install` 70 | 71 | >装皮肤 72 | 73 | ```shell 74 | 这部分不是代码,而是程序装在了哪里 75 | Install prefix: /usr/local 76 | Data directory: /usr/local/share/mplayer 77 | Config direct.: /usr/local/etc/mplayer 78 | ``` 79 | 80 | * 创建目录`mkdir /usr/local/share/mplayer/skins/default/` 81 | * 将皮肤文件复制到/usr/local/share/mplayer/default/目录中 82 | `cp /tmp/mplayer/Blue/* /usr/local/share/mplayer/skins/default/` 83 | 84 | >从真机桌面用鼠标双击打开图形化界面的rhel6,去测试,是否安装成功。 85 | 86 | `applications--->sound&video---->mplayer` 87 | 88 | --- 89 | 90 | ## 二进制安装 91 | 92 | 直接解压缩即可使用 93 | 94 | 例如 mycat 数据库代理服务器 95 | 安装 mycat ,直接解压缩即可使用 96 | 97 | ```shell 98 | tar xf Mycat-server-1.5.1-RELEASE-20160328130228-linux.tar.gz -C /usr/local 99 | cd /usr/local;ls 100 | cd mycat;ll 101 | chmod 755 * -R 102 | vim conf/schema.xml 103 | vim conf/server.xml 104 | bin/mycat start 105 | ``` 106 | 107 | ## RPM 108 | 109 | RPM : redhat package management 110 | 111 | rpm 命令是 RPM 软件包的管理工具。 rpm 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。 RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。 112 | 113 | rpm 的命名规范 : 软件名 - 版本号 - 操作系统平台 114 | 115 | libreoffice4.1-calc-4.1.6.2-1.x86_64.rpm 116 | 117 | zlib-1.2.3-29.el6.x86_64.rpm 118 | 119 | ```shell 120 | 语法 rpm ( 选项 )( 参数 ) 121 | 122 | 选项 123 | 124 | -a :查询所有套件; 125 | -b< 完成阶段 >< 套件档 >+ 或 -t < 完成阶段 >< 套件档 >+ :设置包装套件的完成阶段,并指定套件档的文件名称; 126 | -c :只列出组态配置文件,本参数需配合 "-l" 参数使用; 127 | -d :只列出文本文件,本参数需配合 "-l" 参数使用; 128 | -e< 套件档 > 或 --erase< 套件档 > :删除指定的套件; 129 | -f< 文件 >+ :查询拥有指定文件的套件; 130 | -h 或 --hash :套件安装时列出标记; 131 | -i :显示套件的相关信息; 132 | -i< 套件档 > 或 --install< 套件档 > :安装指定的套件档; 133 | -l :显示套件的文件列表; 134 | -p< 套件档 >+ :查询指定的 RPM 套件档; 135 | -q :使用询问模式,当遇到任何问题时, rpm 指令会先询问用户; 136 | -R :显示套件的关联性信息; 137 | -s :显示文件状态,本参数需配合 "-l" 参数使用; 138 | -U< 套件档 > 或 --upgrade< 套件档 > :升级指定的套件档; 139 | -v :显示指令执行过程; 140 | -vv :详细显示指令执行过程,便于排错。 141 | 142 | 参数 软件包:指定要操纵的 rpm 软件包。 143 | 144 | 实例 145 | install 安装 146 | 1)rpm -ivh [x.rpm] 安装 v\h 显示安装过程中的进度条 verbose\hash 147 | query 查询 148 | 2)rpm -q [ 软件名称 ] 查看软件是否安装 149 | 3)rpm -qi [ 软件名称 ] 查看软件的详细信息 150 | 4)rpm -ql [ 软件名称 ] 查看软件在系统中安装过的文件 151 | 5)rpm -qf [ 文件名称 ] 查看文件是由哪个软件包安装出来的 152 | 6)rpm -qa 查看系统里所有已经安装过的软件包 153 | 卸载 remove 154 | 6)rpm -e [ 软件名称 ] 卸载软件 155 | rpm -e --nodeps 不卸载依赖关系 156 | update 升级 157 | 7)rpm -U [ 软件名称 ] 升级 , 若没有该软件则安装 158 | 8)rpm -F [ 软件名称 ] 升级 , 若没有该软件则不安装 159 | ``` 160 | 161 | 162 | ## YUM 163 | 164 | ### yum 的作用 165 | 166 | 作用 : 为了解决包之间的依赖关系而存在的一种管理机制 , 基于 rpm 为前端的包管理机制 . 167 | 为了解决依赖关系 , 引入了一种仓库的机制 . 168 | 169 | ### yum 仓库 170 | 171 | 仓库 : 用来存放软件和软件之间的依赖关系 , 当我们需要安装软件的时候 , 就可以通过该依赖关系 , 来将相应的依赖包都装上 .repodata 目录就是 yum 的仓库 , 存放软件和软件之间的依赖关系数据 . 172 | 173 | ```shell 174 | [root@rhel6 dvd]# ll repodata/ -d 175 | dr-xr-xr-x. 2 root root 4096 Nov 12 176 | [root@rhel6 dvd]#pwd 177 | /mnt/rhel6.5/x86_64/dvd 178 | ``` 179 | 180 | ### 依赖关系 181 | 182 | 安装系统的光盘中已经有建号的依赖关系了,即 repodata/ 目录,如果要自己手动制作 rpm 包依赖关系目录,该怎么做呢? 183 | 184 | #### 安装软件 createrepo 185 | 186 | rhel7 默认已经安装 187 | ```shell 188 | [root@rhel7 ~]# yum install -y createrepo 189 | Loaded plugins: langpacks, product-id, subscription-manager 190 | This system is not registered to Red Hat Subscription Management. You can use subscription-manager 191 | to register. 192 | server 193 | | 4.1 kB 00:00:00 194 | (1/2): server/group_gz 195 | | 134 kB 00:00:00 196 | (2/2): server/primary_db 197 | | 3.4 MB 00:00:00 198 | Package createrepo-0.9.9-23.el7.noarch already installed and latest version 199 | Nothing to do 200 | ``` 201 | rhel6 要自己安装 202 | 203 | ```shell 204 | [root@rhel6 rc.d]# yum install -y createrepo 205 | Loaded plugins: product-id, refresh-packagekit, security, subscription-manager 206 | This system is not registered to Red Hat Subscription Management. You can use subscription-manager 207 | to register. 208 | server 209 | Running Transaction 210 | Installing : deltarpm-3.5-0.5.20090913git.el6.x86_64 211 | 1/3 212 | Installing : python-deltarpm-3.5-0.5.20090913git.el6.x86_64 213 | 2/3 214 | Installing : createrepo-0.9.9-18.el6.noarch 215 | 3/3 216 | Verifying : createrepo-0.9.9-18.el6.noarch 217 | 1/3 218 | Verifying : python-deltarpm-3.5-0.5.20090913git.el6.x86_64 219 | 2/3 220 | Verifying : deltarpm-3.5-0.5.20090913git.el6.x86_64 221 | 3/3 222 | Installed: 223 | createrepo.noarch 0:0.9.9-18.el6 224 | Dependency Installed: 225 | deltarpm.x86_64 0:3.5-0.5.20090913git.el6 226 | Complete! 227 | python-deltarpm.x86_64 0:3.5-0.5.20090913git.el64.3.2 制作 rpm 包依赖关系目录 228 | ``` 229 | 230 | 以 rhel7 为例从学校服务器上拷贝一些软件到 /tmp/dvd7.1/ 目录下 231 | 232 | ```shell 233 | [root@rhel7 tmp]# cp /mnt/rhel7.1/x86_64/dvd/Packages/* /tmp/dvd7.1 234 | [root@rhel7 tmp]# cd /tmp/dvd7.1 235 | ``` 236 | 237 | 制作 rpm 包依赖关系 238 | 239 | ```shell 240 | [root@rhel7 dvd7.1]# createrepo /tmp/dvd7.1/ 241 | Spawning worker 0 with 4371 pkgs 242 | Workers Finished 243 | Saving Primary metadata 244 | Saving file lists metadata 245 | Saving other metadata 246 | Generating sqlite DBs 247 | Sqlite DBs complete 248 | ``` 249 | 250 | 已经成功创建 251 | 252 | ```shell 253 | [root@rhel7 tmp]# ll dvd7.1/ |grep repodata 254 | drwxr-xr-x. 2 root root 4096 Mar 18 07:42 repodata 255 | ``` 256 | 257 | ### 配置仓库 258 | 259 | 为此 , 我们需要优先去配置一个仓库指向文件。这个文件的位置在 /etc/yum.repos.d/ 目录下 , 以 .repo 结尾 260 | 261 | ```shell 262 | [root@rhel7 tmp]# cd /etc/yum.repos.d/ 263 | [root@rhel7 yum.repos.d]# ls 264 | server.repo 265 | ``` 266 | 267 | ```shell 268 | [ 仓库名 ] 269 | name = 说明信息 270 | baseurl = 指向 repodata 目录的上一级 . 271 | enable = 是否启用该仓库 0 代表不启用 ,1 代表启用 272 | gpgcheck = 是否需要检测 273 | 其中 baseurl 274 | 1. 本地路径 file:///content/rhel6.5..... 以下省略 第三个 / 代表的是根 . 275 | 2. 远程路径 协议 :// 位置 276 | 例: http:// 277 | ftp:// 278 | nfs:// 279 | 280 | [server] 281 | name = rhel7.1 repos 282 | baseurl = http://classroom.example.com/content/rhel6.5/x86_64/dvd/ 283 | enable=1 284 | gpgcheck=0 285 | [test] 286 | name = info 287 | baseurl=file:///tmp/dvd7.1/ 288 | enable=1 289 | gpgcheck=0 290 | ``` 291 | 292 | 配置完仓库后 , 需要使用 293 | 294 | * yum clean all 来清理缓存 295 | * yum makecache 来重新生成缓存 .4.5 yum 安装 296 | 297 | 安装 298 | 299 | * yum install 软件名 安装指定软件 300 | * yum groupinstall 组名 用来安装一系列的软件包 , 301 | * yum reinstall 软件名 重新安装指定软件 302 | 303 | -y 选项 , 忽略安装过程出现的 is this ok的交互信息 304 | 305 | * yum localinstall 软件名 本地安装指定软件 306 | 307 | 查询 308 | 309 | * yum list 用来查询所有的软件包 310 | * yum list installed 用来查看已经安装过的软件包 311 | * yum search 字符串 能够将说明信息里含该字符串的相关软件包罗列出来 312 | * yum info 软件包名 用来查看软件包的详细信息 313 | * yum grouplist 组名 用来查询系统里所有的组包 314 | * yum groupinfo 组名 用来查询指定组的相关信息 315 | 316 | 升级 317 | 318 | * yum update 软件名 319 | * yum upgrade 软件名 320 | 321 | 两种写法执行效果没有区别 322 | 323 | 卸载 324 | 325 | * yum remove 软件名 326 | 327 | 不要使用 yum 去卸载 , 会将软件的依赖关系一并卸载掉 . 328 | 329 | 330 | ## Linux 软件安装课后作业 331 | 332 | 333 | 1. 配置一个 yum 仓库。熟悉一下配置的几个字段内容。 334 | 2. 安装 vsftpd 软件。 335 | 3. 查看 vsftpd 软件的安装文件有哪些 336 | 4. 查看一下 touch 命令是由哪个软件包安装出来的 337 | 5. 搜索一下含 bind 字符串的软件包。 338 | 6. 查询一下 httpd 软件有没有安装 , 没有则将该软件装上。 339 | 7. 查看一下 httpd 软件的版本号及试用平台。 340 | 8. 卸载 vsftpd 软件。 341 | 9. 卸载 httpd 软件 , 不要卸载与其有依赖关系的软件包 342 | -------------------------------------------------------------------------------- /10-Linux开机启动流程.md: -------------------------------------------------------------------------------- 1 | # Linux 开机启动流程 2 | 3 | [TOC] 4 | 5 | ## 启动流程概览 6 | 7 | 1. 加载 BIOS 的硬件信息并自我测试 , 依据设定取得第一个可开机的装置 ; 8 | 2. 读取并执行第一个开机装置内 MBR 的 boot Loader ( grub, spfdisk 等程序 ); 9 | 3. 依据 boot loader 的设定加载 Kernel 10 | 4. Kernel 会开始侦测硬件并加载驱动程序 ; 11 | 5. 在硬件驱动成功后 ,Kernel 会主动呼叫 init 程序 12 | 6. init 会取得 run-level 信息 ; 13 | 7. init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 ( 如网络、时区等 ); 14 | 8. init 执行 run-level 的各个服务的启动 (script 方式 ); 15 | 9. init 执行 /etc/rc.d/rc.local 档案 ; 16 | 10. init 执行终端仿真程序 mingetty 来启动 login 程序 , 17 | 11. 最后等待用户登入 18 | 19 | ## 详细讲解 20 | 21 | ### 开机软件 —— BIOS、Grub 22 | 23 | ![33](pic/33.png) 24 | 25 | 26 | #### 名词解释 27 | 28 | 1. BIOS 一个写入到主板上的一个软件程序,在开机的时候,计算机系统会主动执行第一个程序 29 | 2. HD 硬盘 30 | 3. MBR 主要启动记录区(Master Boot Record)该硬盘里的第一个扇区 512 bytes 31 | 4. boot loader 开机管理程序,可读取核心文件并执行 446 bytes 32 | 5. DPT 磁盘分割表(disk partition table)记录整颗硬盘分割状态 64 bytes 33 | 6. 55AA 2 bytes 34 | 35 | #### 流程解释 36 | 37 | * 通电后,服务器主版上的一个软件 BIOS 启动,他的任务就是找到带有开机程序的设备,此处以硬盘为例, BIOS 的任务结束; 38 | * 该硬盘上的第一个扇区中有一个开机管理程序, rhel6 上为 grub1 , rhel7 上为 grub2 ,版本不同; 39 | * 接下去就是 grub 在工作了。 40 | 41 | #### BIOS 42 | 43 | *开机时按下 pause break 暂停中断,可以看到 bios 的大概信息:* 44 | 45 | ![34](pic/34.png) 46 | 47 | AMIBIOS(C)2006 American Megatrends, Inc. 48 | 49 | 基本输入输出系统的版本为 AMIBIOS ,为美国趋势科技 50 | 51 | 2006 年生产 52 | 53 | HP System BIOS – 033 (09/01/2011) 54 | 55 | 惠普系统的基本输入输出系统,支持到 2011/01/09 的硬件 56 | 57 | Processor 1 Initiallized at 2.26 GHz with 8 MB cache 58 | 59 | 处理器 cpu 一个,频率为 2.26GHz , 8M 缓冲 60 | 61 | 16384MB Total Memory Detected 62 | 63 | 16G 内存 64 | 65 | Asset Tag : 0111049 66 | 67 | 资产编号为 0111049 68 | 69 | BMC Firmware Version 04.04(Jul/01/2009) 70 | 71 | BMC SDR Version : 2.18.1.17 72 | 73 | basebiard management controller 底板管理控制器的缩写,时一个在 IPMI 结构下提供智能管理的控制器 74 | 75 | IPMI 时智能平台管理界面,即与 intel 结构的企业系统中所使用外围设备采用的一种工业标准。 76 | 77 | USB Device(s) : 1 Keyboard , 1 Mouse 78 | 79 | usb 设备有一个鼠标一个键盘,此处可以查看是否有人恶意用 usb 设备要攻击服务器 80 | 81 | Auto-Detecting AHCI PORT 1 .. IDE Hard Disk 自动检测 82 | 83 | *开机按下 F10 ,进入 BIOS 管理界面* 84 | 85 | ![35](pic/35.png) 86 | 87 | 88 | ![36](pic/36.png) 89 | 90 | *IPMI* 91 | 92 | HP 服务器远程管理平台 93 | 94 | ![37](pic/37.png) 95 | 96 | ![38](pic/38.png) 97 | 98 | ### 开机文档 —— menu.lst、grub.conf 99 | 100 | #### Grub 配置文档 101 | 102 | * menu.lst 103 | * grub.conf 104 | 105 | ```shell 106 | [root@rhel6 grub]# ll /boot/grub/ 107 | total 274 108 | -rw-r--r--. 1 root root 63 Jul 2 2015 device.map 109 | -rw-r--r--. 1 root root 13380 Jul 2 2015 e2fs_stage1_5 110 | -rw-r--r--. 1 root root 12620 Jul 2 2015 fat_stage1_5 111 | -rw-r--r--. 1 root root 11748 Jul 2 2015 ffs_stage1_5 112 | -rw-------. 1 root root 796 Jul 2 2015 grub.conf 113 | -rw-r--r--. 1 root root 11756 Jul 2 2015 iso9660_stage1_5 114 | -rw-r--r--. 1 root root 13268 Jul 2 2015 jfs_stage1_5 115 | lrwxrwxrwx. 1 root root 11 Jul 2 2015 menu.lst -> ./grub.conf 116 | -rw-r--r--. 1 root root 11956 Jul 2 2015 minix_stage1_5 117 | -rw-r--r--. 1 root root 14412 Jul 2 2015 reiserfs_stage1_5 118 | -rw-r--r--. 1 root root 1341 May 7 2010 splash.xpm.gz 119 | -rw-r--r--. 1 root root 512 Jul 2 2015 stage1 120 | -rw-r--r--. 1 root root 126100 Jul 2 2015 stage2 121 | -rw-r--r--. 1 root root 12024 Jul 2 2015 ufs2_stage1_5 122 | -rw-r--r--. 1 root root 11364 Jul 2 2015 vstafs_stage1_5 123 | -rw-r--r--. 1 root root 13964 Jul 2 2015 xfs_stage1_5 124 | [root@rhel6 grub]# vim grub.conf 125 | default=0 ===>默认菜单 126 | timeout=5 ===>启动菜单超时5秒进入默认启动内核 127 | splashimage=(hd0,0)/grub/splash.xpm.gz ===>菜单的背景图片位置 128 | hiddenmenu ===>默认不看启动菜单 129 | title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64) 130 | 开机启动的系统名称(可以更改对其他没有影响),指定启动硬盘位置在第一个硬盘的第一个分区 131 | root (hd0,0) 132 | 指定核心文件的名称及位置 /boot/ ,指定语言等等 133 | kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_rhel6-LogVol01 rd_NO_LUKS 134 | LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc 135 | KEYTABLE=us rd_LVM_LV=vg_rhel6/LogVol01 rd_NO_DM rhgb quiet 136 | 指定核心加载的模块文件 /boot/ 137 | initrd /initramfs-2.6.32-431.el6.x86_64.img 138 | ``` 139 | 140 | #### 流程解释 141 | 142 | * grub 软件的任务就是找到核心文件,并加载该文件 143 | * 内核的第一任务就是驱动硬件 144 | * 内核第二任务就是呼叫 init 程序,接下来就交给 init 了 145 | 146 | ### init 程序 147 | 148 | #### 流程解释 149 | 150 | - init 程序挂接 /etc 和 /lib 所在的目录分区 151 | - 执行 /etc/inittab 文件,取得 run-level 信息,判断是否开启终端、网络等 152 | - 执行 /etc/rc.d/rc.sysinit 初始化环境 ( 如网络、时区等 ) 153 | - 执行 run-level 的各个服务的启动 (script 方式 ); 154 | - 执行 /etc/rc.d/rc.local 档案 155 | - 执行终端仿真程序 mingetty 来启动 login 程序,最后等待用户登入 156 | 157 | 158 | #### init 执行的相关文件 159 | 160 | ```shell 161 | [root@rhel6 ~]# cat /etc/inittab 162 | # Default runlevel. The runlevels used are: 163 | # 0 - halt (Do NOT set initdefault to this) 164 | # 1 - Single user mode 165 | # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 166 | # 3 - Full multiuser mode 167 | # 4 - unused 168 | # 5 - X11 169 | # 6 - reboot (Do NOT set initdefault to this) 170 | # 171 | id:5:initdefault: ===>默认启动等级(run-level)为5(中间的数字为启动等级) 172 | [root@rhel6 etc]# ll /etc/rc.d ===>根据默认启动等级,来读取相应的rc0-6.d目录中的文件 173 | total 60 174 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 init.d 175 | -rwxr-xr-x. 1 root root 2617 Oct 10 2013 rc 176 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc0.d 177 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc1.d 178 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc2.d 179 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc3.d 180 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc4.d 181 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc5.d 182 | drwxr-xr-x. 2 root root 4096 Jul 2 2015 rc6.d 183 | -rwxr-xr-x. 1 root root 220 Oct 10 2013 rc.local 184 | -rwxr-xr-x. 1 root root 19432 Oct 10 2013 rc.sysinit 185 | ``` 186 | 187 | 文件夹里都是软连接,软链接链接到/etc/rc.d/init.d目录下的文件,目录下都是服务的启动脚本,目录和etc/init.d下的内容一样,因为有个软连接在etc下面rcX.d下的文件K开头表示服务要关闭的,S开头的表示系统启动时要开启的,(例如rc0.d下,几乎都是K打头的),在5里后面的数字标示优先级,数字小优先级高,在6里这些数字无用,因为是并行的,没有依赖关系。 188 | 189 | 无论是3还是5的runlevel,最后都会读到S99local文件,链接到/etc/rc.d/rc.local文件 190 | 191 | 文件说明:这个脚本在所有脚本执行完之后执行,开机过程汇总最后读到的一个文件,这个文件是开机自定义启动脚本,把自己想要执行的命令写进来。系统启动命令也会完成。 192 | 193 | 备注:以上分析均为 rhel6 操作系统, rhel7 启动改为 systemd 模式,相关文件在 `/usr/lib/systemd/system/*` 194 | 195 | ### run-level(启动等级) 196 | 197 | Runlevel 0 是让init关闭所有进程并终止系统。 198 | 199 | Runlevel 1 是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件。 200 | 201 | Runlevel 2 是允许系统进入多用户的模式,但并不支持文件共享,这种模式很少应用。 202 | 203 | Runlevel 3 是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。 204 | 205 | Runlevel 4 一般不被系统使用,用户可以设计自己的系统状态并将其应用到runlevel 4阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。 206 | 207 | Runlevel 5 是将系统初始化为专用的X Window终端。对功能强大的Linux系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在runlevel启动来实现该方案。 208 | 209 | Runlevel 6 是关闭所有运行的进程并重新启动系统。 210 | 211 | ## 相关的命令 212 | 213 | rhel6 214 | 215 | chkconfig --list ===>查看不同等级中各项服务的启动情况(开机启动项) 216 | 217 | chkconfig 服务名 on ===>开启某个服务开机自启动,off代表关闭 218 | 219 | chkconfig --level 35 服务名 off ===>在启动等级为3和5的时候该服务不开机启动 220 | 221 | 222 | 223 | rhel7 224 | 225 | 开机自启的服务通过systemctl enable命令来实现 226 | 227 | Systemctl enable httpd ===>自启动httpd服务,关闭使用disable。 228 | 229 | systemctl get-default ===>查看当前默认启动级别(启动级别的说明查看/etc/inittab) 230 | 231 | systemctl set-default multi-user.target ===>设置默认启动级别为3(7的的启动级别名称有所变化) 232 | 233 | ## 实验 234 | 235 | ### rhel6 单用户模式修改密码 236 | 237 | - 1> 进入到数及时界面时,按上下键进入以下界面,选择 kernel 一行,按下 e 进行编辑 238 | - 2> 在最后追加 “空格”和1 或者 “空格” single 后,按下 esc 239 | - 3> 再按下 b ,启动后,进入单人模式后,输入 passwd 进行密码修改,修改完成后, reboot 即可。 240 | 241 | ![39](pic/39.png) 242 | 243 | ![40](pic/40.png) 244 | 245 | ![41](pic/41.png) 246 | 247 | 248 | ### rhel7 单用户模式修改密码 249 | 250 | - 1> 进入如下界面后按 e 进入编辑模式 251 | - 2> 找到 linux16 开始的那一行,删除没用的,在最后追加 rd.break ,然后按 Ctrl+x 重启即可进入单人模式 252 | - 3> 进入单用户模式后,用 mount 命令查看一下,会发现根目录时只读模式,因此需要重新挂载为读写模式 253 | 254 | ```shell 255 | mount -o remount,rw /sysroot 256 | chroot /sysroot ===>提高权限 257 | passwd ===>修改密码的命令 258 | touch /.autorelabel ===>autorelabel 自动重新标记, selinux 259 | exit 260 | exit 261 | ``` 262 | 263 | ![42](pic/42.png) 264 | 265 | ![43](pic/43.png) 266 | 267 | ###rhel6 GRUB菜单加密 268 | 269 | grub-md5-crypt 270 | 271 | 输入密码,生成一串MD5值,这个就是grub密码,复制好这段内容,粘贴到配置文件中 272 | 273 | vim /boot/grub/grub.conf   274 | 275 | title那一行的上面加上“password redhat”这样做是明文密码,不安全,所以也可写为“password –-md5 xxxxxxxxx” 276 | 277 | 这一行要放在title的上面 278 | 279 | 放在title的下面是系统启动需要密码才可以启动 280 | 281 | ### rhel7 GRUB2菜单加密 282 | 283 | vim /etc/grub.d/40_custom 284 | 285 | set superusers="root" ===>设置超级用户的名称,注意:名称任意可以不用是系统中存在的用户 286 | 287 | password root redhat ===>设置用户名和密码,注意:该密码为明文,如果需要密文需要生成密文密码 288 | 289 | 保存退出 290 | 291 | grub2-mkconfig -o /boot/grub2/grub.cfg ===>使用该命令来重新生成grub.cfg文件来使配置生效 292 | 293 | 294 | 295 | grub2-mkpasswd-pbkdf2 ===>该命令为生成加密密码 296 | 297 | password_pbkdf2 ===>如果使用加密的密文需要定义密码的加密方式,后面同上跟上用户名和加密后的密码 298 | 299 | ## Linux 开机启动流程课后作业 300 | 301 | 1. 名词解释 302 | 303 | BIOS 304 | 305 | MBR 306 | 307 | boot loader 308 | 309 | grub 310 | 311 | DPT 312 | 313 | 55AA 314 | 315 | 2. 请自己描述 linux 开机启动的流程,并画出流程图。 316 | 3. linux 破解 root 密码 317 | -------------------------------------------------------------------------------- /06-Vim 编辑器.md: -------------------------------------------------------------------------------- 1 | # Vim 编辑器 2 | 3 | [TOC] 4 | 5 | ## Vim 简介 6 | 7 | ![10.png](pic/10.png) 8 | 9 | Vim 是 Linux 系统上的最著名的文本/ 代码编辑器,也是早年的 Vi编辑器的加强版,而 gVim 则是其 Windows 版。它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极为大幅的效率提升。 10 | 11 | 因此 Vim 和现代的编辑器(如 Sublime Text)有着非常巨大的差异,而且入门学习曲线陡峭,需要记住很多按键组合和命令,如今被看作是高手、Geek 们专用的编辑器。尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用,可见其经典与受欢迎程度。 12 | 13 | 另外,由于 Vim 的可配置性非常强,各种插件、语法高亮配色方案等多不胜数,无论作为代码编辑器或是文稿撰写工具都非常给力! 14 | 15 | 在 Linux 系统中配置应用服务,实际上就是在修改它的配置文件(配置文件可能有多个,其中包含不同的参数), 而且日常工作中也一定免不了编写文档的事情吧, 这些都是要通过文本编辑器来完成的。 16 | 17 | 在热门 Linux 操作系统中都会默认安装vim。 18 | 19 | ### Vim - 难以驾驭的神器 20 | 21 | 神器总是很难驾驭的,主角总得付出一些努力才能收获到更加强大的力量,对于 Vim 这种上古神器来说更是如此。由于它全程使用键盘操作,你必须记住一堆快捷键、按键组合以及各种命令才能开始使用,很多首次接触 Vim 的人会觉得越学越复杂而中途放弃。然而,坚持下来的朋友就会渐渐地发现这种键盘流操作的设计绝妙之处! 22 | 23 | 如果你是一位 IT 界人士,需要或将要与 Linux 系统打交道,那么学习好 Vim 的操作绝对能让你的工作轻松百倍!! 24 | 25 | 因为很多时候, Linux 作为服务器是不会开启图形界面,当需要远程操作时,你只能利用SSH“ 命令字符式 ” 的 Shell 界面对其进行操作,这时如果你需要修改服务器上的网页代码或配置文件,VI或 VIM 命令就是你最佳最方便也是最强大的伙伴了!相信我,学好 数理化 VIM ,走遍天下也不怕! 26 | 27 | 28 | ### Vim 入门帮助 29 | 30 | ![11.png](pic/11.png) 31 | 32 | 下面首先对 Vim 做一下最基本的介绍,并给出一些参考信息,以方便对 Vim 不熟悉的读者也能够理解并自 33 | 己查阅进一步信息。 34 | 35 | Vim 带有完整的帮助文档。 36 | 37 | 1. 进入 Vim 后输入 “ :help”即可访问 38 | 2. 新手在操作系统的命令行上输入 vimtutor 命令即可开始学习一个简单的 30 分钟的 Vim 教程2 Vim 命令 39 | 40 | 41 | ### Vim 模式介绍 42 | 43 | 44 | ![12.png](pic/12.png) 45 | 46 | 与大部分其它编辑器不同,进入 Vim 后,缺省状态下键入的字符并不会插入到所编辑的文件之中。Vim 的 47 | 模式(mode ,可以简单地理解为 “ 状态 ” )概念非常重要。需要知道,Vim 有以下几个模式: 48 | 49 | * 正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,提到的命令都直接在正常模式下 50 | 输入;任何其它模式中都可以通过键盘上的 Esc 键回到正常模式。 51 | * 命令(command)模式 ,用于执行较长、较复杂的命令;在正常模式下输入 “ :” (一般命令)、 “ /” 52 | (正向搜索)或 “ ?”(反向搜索)即可进入该模式;命令模式下的命令要输入回车键(Enter)才算完成。 53 | * 插入(insert)模式 ,输入文本时使用;在正常模式下键入 “ i”(insert )或 “ a”(append)即可 54 | 进入插入模式(也有另外一些命令,如 “ c”,也可以进入插入模式,但这些命令有其它的作用)。 55 | * 可视(visual)模式 ,用于选定文本块;可以在正常模式下输入 “ v”(小写)来按字符选定,输入 56 | “V” (大写)来按行选定,或输入 “ Ctrl-V”来按方块选定。 57 | * 选择(select)模式 ,与普通的 Windows 编辑器较为接近的选择文本块的方式;在以可视模式和 58 | 选择模式之一选定文本块之后,可以使用 “ Ctrl-G” 切换到另一模式 —— 该模式很少在 Linux 上使用,本 59 | 文中就不再介绍了。 60 | 61 | ### 正常模式 62 | 63 | ![13.png](pic/13.png) 64 | 65 | ### 命令模式 66 | 67 | ![14.png](pic/14.png) 68 | 69 | ### 插入模式 70 | 71 | * i 光标所在位置插入 72 | * I 光标所在位置行首插入 73 | * o 光标所在位置下方新开一行插入 74 | * O 光标所在位置上方新开一行插入 75 | * a 光标所在位置下一个字符的位置插入 76 | * A 光标所在位置行行尾插入 77 | 78 | ## Vim 实例 79 | 80 | 本实例作为基础教程,拓展部分见附录《Vim 用户手册中文版 7.2》 81 | 82 | ![15.png](pic/15.png) 83 | 84 | ### Vim 第一步 85 | 86 | #### 首次运行 Vim 87 | 88 | ```shell 89 | [root@mastera0 ~]# ll file1 90 | -rw-r--r--. 1 root root 274 Jun 24 12:19 file1 91 | [root@mastera0 ~]# vim file1 92 | ``` 93 | 94 | 使 Vim 开始编辑一个名为 file1 的文件。屏幕上看起来大致是这样: 95 | * "黑色块" 代表当前光标位置; 96 | * 上波浪线(~)表示所在行并不是文件内容的一部分。换句话说,Vim 将 文件之外的部分显示为波浪线; 97 | * 在窗口的底部, 一个消息行显示说当前正 在编辑的文件叫 file1,它有 16 行,274 个字符。但前光 98 | 标所在位置为第一行的第一位 99 | 100 | ![16.png](pic/16.png) 101 | 102 | 如果是新文件呢? 103 | 104 | ```shell 105 | [root@mastera0 ~]# vim file 106 | ``` 107 | 108 | ![17.png](pic/17.png) 109 | 110 | 在窗口的底部, 一个消息行显示说当前正 在编辑的文件叫 file,并且它是一个新文件。 111 | 112 | #### 插入文本 113 | 114 | Vim 编辑器是一个模式编辑器。这意味着在不同状态下编辑器有不同 的行为模式。两个基本的模式 Normal 115 | 模式和 Insert 模式。在 Normal 模式下你键入的每一个字符都被视为一个命令。而在 Insert 模式下键入 116 | 的字符 都作为实际要输入的文本内容。 刚启动时 Vim 工作于 Normal 模式。要进入 Insert 模式你需要使 117 | 用"i" 命 令(i 意为 Insert)。接下来就可以直接输入了。别怕出错, 错了还可以修 改。比如下面这首程序 118 | 员的打油诗: 119 | ```shell 120 | A very intelligent turtle 121 | Found programming UNIX a hurdle 122 | ``` 123 | "turtle" 之后你按下回车键另起一行。最后按下 键退出 Insert 模式 ,回到 Normal 模式。现在你的Vim 窗口中有了这样的两行内容 : 124 | 125 | ![18.png](pic/18.png) 126 | 127 | 现在是什么模式? 128 | 129 | 要知道你现在所处的工作模式是什么,打开显示模式的开关: 130 | ```shell 131 | :set showmode 132 | :set noshowmode 关闭显示模式 133 | ``` 134 | 135 | ![19.png](pic/19.png) 136 | 137 | 你会看到按下冒号键之后当前光标跑到窗口的最后一行去了。那是使用冒 号命令的地方(顾名思义,冒号命 138 | 令就是总是以冒号打头的命令) 。最后按 下回车键结束整个命令(所有的冒号命令都以这种方式表明命令的 139 | 结束). 140 | 141 | 现在,如果你键入了"i"命令 Vim 就会在窗口底部显示--INSERT-- 。这 表明你目前处于 Insert 模式。 142 | 如 果 按 下 键 返 回 到 Normal 模 式 刚 才 显 示 出 来 的 模 式"--INSERT-- 就会消失 ;Normal模式并不会显示 — NORMAL--,作为默认的工作模式它不显示任何字串。 143 | 144 | Vim 新手最头痛的问题就是模式---经常忘记自己置身于何种模式, 或者不经意敲了哪个字符就切换到别的 145 | 模式去了。 146 | 147 | 不管你当前所处的模 式是什么,按下都会让你回到 Normal 模式(即使已经在 Normal 模式 下)。有时 148 | 需要按两次,如果 Vim 以一声蜂鸣回答你, 那说明你已经 是在 Normal 模式了。 149 | 150 | #### 移动光标 151 | 152 | 回到 Normal 模式后 , 你就可以用下面的命令来移动光标 : 153 | * h 左 154 | * j 下 155 | * k 上 156 | * l 右 157 | 158 | 人们一开始会认为这些字符是随意选取的。毕竟有谁 l 来代 表 right 呢 ? 但事实上 , 这些字符都是精心挑选的 : 159 | 160 | 在编辑器中移动光 标是十分常用的操作 , 这些字符在键盘上都分布在你右手周围。这样的安 排可以使你最快 161 | 最方便地使用它们 ( 尤其是对那些用十个手指而不是二指 禅用户而言 ) 。 162 | 163 | 备注 : 同时你还可以用箭头键来移动光标。不过这样做实 际上会大大降低你的效率。因为用这些键你需要不 164 | 停地在 字母区和箭头键之间频繁转换。想象一下要是你在一小时 内这样做一百次会占用你多少时间 ? 另外 , 并 165 | 不是每个键 盘上都安排有箭头键 , 或者都把它们放在最常见的位置 ; 所以使用 hjkl 还是大有好处。 166 | 167 | 练习文件名位 hjkl ,放在共享当中。如果进入了插入模式不要忘了要用 回到 Normal 模 式。 | 168 | vimtutor| 也是学习这些命令的一个好去处。 169 | 170 | 记住:学习这些命令的最好办法不是使用什么记忆法 , 而是练习。 171 | 172 | #### 删除字符 173 | 174 | 要删除一个字符,只需要将光标移到该字符上按下"x". ( 这是在追 忆古老的打字机时代,在打字机上删除字 175 | 符就是用 xxxx 来覆盖它) 把光标 移到上面例子中的第一行,键入 xxxxxxx(7 个 x) 来删除"A very "。 176 | 177 | 178 | 输入其它内容 179 | 比如:首先键入的命令是 i( 进 入 Insert 模 式), 接着插入"A young", 然后 退 出 Insert 模式(最后的)。 180 | 181 | 删除一行 182 | 183 | 删除一整行内容使用"dd"命令。删除后下面的行会移上来填补空缺:2.1.5 撤消与重做 184 | 185 | 撤销一次操作 186 | 187 | 如果你误删了过多的内容。显然你可以再输入一遍,但是命令"u" 更 简便, 它可以撤消上一次的操作 1 。 188 | 实际看一下它的效果,用"dd" 命令来 删除前面例子中的第一行内容,"u"命令会把它找回来。 189 | 190 | 重做 191 | 如果你撤消了多次,你还可以用 CTRL-R(重做) 来反转撤消的动作。换 句话说,它是对撤消的撤消。 192 | 193 | 撤销一行操作 194 | 195 | 撤消命令还有另一种形式,"U"命令, 它一次撤消对一行的全部操作。第 二次使用该命令则会撤消前一 196 | 个"U"的操作。 197 | 198 | * 删除 very 199 | * 删除 turtle 200 | * 用"u"撤消"U" 201 | * 用"U" 恢复该行 202 | 203 | "U"命令本身也造成了一次改变,这种改变同样可以用"u" 命令 和 CTRL-R 来撤消和重做。看起来这很容易 204 | 把人搞糊涂,不过别担心, 用"u"和 CTRL-R 你可以找回任何一个操作状态。 205 | 206 | #### 其它编辑命令 207 | 208 | Vim 有一大堆命令来改变文本。这里仅列 出一些最常用的。 209 | 210 | 追加 a 211 | 212 | "i" 命令可以在当前光标之前插入文本。但如果你想在当前行的末尾 添加一些内容时怎么办呢?你必需在光 213 | 标之后插入文本。答案是用"a" 命 令来代替"i"。 214 | 215 | 另起一行 o\O 216 | 217 | 1. "o"命令可以在当前行的下面另起一行,并使当前模式转为 Insert 模 式。这样你可以在该命令之后直接输 218 | 入内容。假设光标位于下面两行中第 一行的某处: 219 | 2. "O"命令(注意是大写的字母 O)将在当前行的上面另起一行。 220 | 221 | 使用命令计数 222 | 223 | 假设你要向上移动 9 行。这可以用"kkkkkkkkk"或"9k" 来完成。事实 上,很多命令都可以接受一个数字作 224 | 为重复执行同一命令的次数。比如刚 才的例子,要在行尾追加三个感叹号,当时用的命令是"a!!!"。 225 | 另 一个办法是用"3a!"命令。 226 | 227 | 3 说明该命令将被重复执行 3 次。同样, 删 除 3 个字符可以用"3x"。指 228 | 定的数字要紧挨在它所要修饰的命令前面。 229 | 230 | #### 退出 231 | 232 | 要退出 Vim,用命令"ZZ"。该命令保存当前文件并退出 Vim. 233 | 234 | 放弃编辑 :q! 235 | 236 | 有时你会在做了一连串修改之后突然意识到最好是放弃所有的修改重 新来过。别担心。Vim 中有一个命令可 237 | 以丢弃所有的修改并退出: 238 | :q! 239 | 别忘了在命令之后加回车。 240 | 241 | 放弃编辑并重新载入 :e! 242 | 243 | 如果你在放弃所有修改后还想以该文件的初始内容作为开始继续编 辑,还可以用":e!"命令放弃所有修改并 244 | 重新载入该文件的原始内容。 245 | 246 | 保存并退出:wq :wq! 247 | 248 | 一般我们都是需要保存并退出的,有一些文件保存的时候需要强制保存退出,这时加上!即可。比 249 | 如/etc/shadow2.1.8 求助 250 | 251 | 你想做的任何操作都可以在 Vim 的帮助文件里找到答案, 别怕问问 题! 252 | :help 253 | 254 | 会带你到帮助文件的起始点。 255 | 256 | 如果你没有指定一个具体的帮助主题,":help" 命令会显示上面提到 的帮助文件的起点。Vim 的作者聪明地 257 | (也许是懒惰地) 设计了它的帮助系 统: 帮助窗口也是一个普通的编辑窗口。你可以使用跟编辑其它文件时一 258 | 样的命令来操作帮助文件。比如用 hljk 移动光标。 259 | 260 | 退出帮助窗口也跟退出其它文件编辑窗口一样,使用"ZZ" 即可。这只 会关闭帮助窗口,而不是退出 Vim. 261 | 浏览帮助文件时,你会注意到有一些内容用两个小栅栏围了起来( 比 如|help|)。这表明此处是一个超链接。 262 | 如果你把光标置于两个小栅栏之间的任何位置然后按下 CTRL-](跳转到一个标签的命令),帮助系统就会带 263 | 你 到那个指定的主题。(因为一些此处不便讨论的原因,在 Vim 的术语中这种 超链接叫标签。所以 CTRL-] 264 | 可以跳转到当前光标之下的那个 word 所对应的 链接中 1 。 265 | 266 | 几次跳转之后,你可能想回到原来的某个地方,CTRL-T(弹出标签) 可 以回到前一个位置。用命令 CTRL- 267 | O(跳转到较早的位置) 也可以。 帮助窗口的开始有一个关于*help.txt*的说明。在星号"*" 之间的字 符被 268 | 帮助系统定义为一个标签的目的地(超链接的目的地). 269 | 270 | 要查看关于某个特殊主题的帮助,使用下面的命令形式: 271 | `:help {subject}` 272 | 273 | 例如,查看关于 showmode 的帮助 274 | `:help showmode3.2 改动` 275 | 276 | 277 | #### 光标的指定移动 278 | 279 | "G"命令 指定一 个命令计数, 这个命令就会把光标定位到由命令计数指定的行上。比 如"33G"就会把光标 280 | 置于第 33 行上。 281 | 282 | ```shell 283 | [root@mastera0 ~]# cp /var/log/messages messages 284 | [root@mastera0 ~]# vim messages 285 | ``` 286 | 287 | 没有指定命令计数作为参数的话 : 288 | * "G" 会 把 光 标 定 位 到 最 后 一 行 上 289 | * "gg"命令是跳转到第一行的快捷的方法。"1G"效果也是一样, 但是敲 起来就没那么顺手了。 290 | * "%"命令 另一个移动到某行的方法是在命令"%" 之前指定一个命令计数 。 如"50%"将会把光标定位在文件的中间;比"90%" 跳到接文件尾的地 方 。 291 | 292 | #### 简单搜索 293 | 294 | "/string"命令 295 | 296 | "/string"命令可用于搜索一个字符串。比如要找到单词"mysql", 使用命令: 297 | `/mysql` 298 | 299 | 要查找上次查找的字符串的下一个位置。使用"n" 命令。如果你知 道你要找的确切位置是目标字符串的第几 300 | 次出现,还可以在"n" 之前放置 一个命令计数。"3n"会去查找目标字符串的第 3 次出现。向光标所在位置以 301 | 上查找用"N"。 302 | 303 | "?string"命令 304 | 305 | "?"命令与"/"的工作相同,只是搜索方向相反。比如要找到单词"mysql", 使用命令: 306 | `?mysql忽略大小写` 307 | 308 | 通常情况下你要准确地键入你要查找的东西。如果你并不关心目标字 符中字母的大小写,可以通过设 309 | 置'ignorecase'选项: 310 | `:set ignorecase` 311 | 312 | 取消则设置'noignorecase'选项: 313 | `:set noignorecase` 314 | 315 | 如果你在编辑一段源程序时看到了一个叫"nr" 的变量。你想查看一 下这个变量就被用在了哪些地方。简单 316 | 的办法是把光标移到"nr" 上然后 用"*" 命令和"n" 命令一个一个地查找所有的匹配。 317 | 不过还有更好的办法。使用下面的命令: 318 | `:set hlsearch` 319 | 320 | 现在你要再查找"nr", Vim 就会以某种形式高亮显示所有符合的匹配。对 于想查看一个变量被用在哪些地 321 | 方,这个办法太棒了, 不需任何其它的命 令 看得眼花的时候还可以关闭这一功能: 322 | `:set nohlsearch` 323 | 324 | 不过你要在下次搜索时再次使用这一功能就又得打开它。如果你只是想去 掉当前的高亮显示,可以使用下面 325 | 的命令 : 326 | `:nohlsearch` 327 | 328 | #### 复制粘贴 329 | 330 | 要把文本内容从一处复制到另一处 331 | 1. 先删除 dd 再粘贴 p 332 | 2. "y" 操作符命令会把文本复制到一个寄存器 中。然后可以用"p"命令把它取回。 333 | 334 | "y"命令 335 | * "yw"来复制一个 word; 336 | * "y2w"命令复制两个 word; 337 | * "yy"复制一行; 338 | * "3yy"复制光标所在行和向下的行,一共三行; 339 | 340 | 例如: 341 | 1. 复制 file 文件中的 turtle 并粘贴到该行的最后; 342 | 2. 复制 file 文件中的 intelligent turtle 并粘贴到该行的最后; 343 | 3. 复制 file 文件中的第二行并粘贴到第四行; 344 | 4. 复制 file 文件中的第一行第二行第三行,并粘贴到第五行第六行第七行。 345 | 346 | #### 替换字符 347 | 348 | * :s/UNIX/linux 对光标所在行第一个出现的 UNIX 替换成 linux 349 | * :s/UNIX/linux /g 对光标所在行所有 UNIX 都替换成 linux , g 表示全行替换 350 | * :% s/UNIX/linux /g 将全文中的 carol 都替换位 natasha , "%" 指定该命令将作用于所有行上 351 | 352 | ### Vim 的保护机制 353 | 354 | 如果我们没有通过 q 退出,而是通过其他方式强行退出,比如说直接关终端,会导致 vim 的一个报错,当我 355 | 们下次打开这个文件的时候,会提示 356 | `Found a swap file by the name ".file.swp"` 357 | 358 | 这是因为 vim 他不是实时写入的机制,他会先把文件写到内存,等我们执行 w 操作以后,再写回到原文件。 359 | 那么在写回原文件,或者执行 q 的放弃操作之前,会生成一个临时的文件,以 . 开头, swp 结尾。当我们看 360 | 到这种情况,就说明这个文件是在变编辑的过程中强制退出的,或者是正在被人编辑。 361 | 362 | 所以这个文件的作用就是防止强制退出造成的数据安全隐患,和防止文件同时被多次修改。 363 | ```shell 364 | Swap file ".file.swp" already exists! 365 | [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: 366 | ``` 367 | 368 | 我们可以根据他的提示执行相应的操作,比如说 Q ,退出。如果想要顺利编辑这个文件的话,一方面可以使 369 | 用 E ,无论如何也要编辑,或者先退出,把 swp 文件删除了以后再编辑,也是可以的。 370 | 371 | 注意:要使用 vim 需要注意一下权限问题,必须要有读写权限才能使用 vim 。 372 | 373 | 可以看一下没有写权限和没有读权限会出现什么问题。 374 | 375 | --- 376 | 377 | ## Vim 编辑器课后作业 378 | 379 | 1. 复制`/etc/sysconfig/network-scripts/ifcfg-eth0`的配置文件位/tmp/test 380 | 2. 使用vim编辑该文件,练习不同模式的切换,尤其是正常变插入模式的几种用法 381 | 3. 练习保存的几种命令,包括保存退出,不保存退出。 382 | 4. vim练习游戏 383 | vim大冒险官网 vim-adventures.com 384 | 385 | -------------------------------------------------------------------------------- /07-Bash简介.md: -------------------------------------------------------------------------------- 1 | # Bash简介 2 | 3 | [TOC] 4 | 5 | 6 | ## SHELL 7 | 8 | ### shell 简介 9 | 10 | Shell 是一个命令解释器, 是人与操作系统之间的桥梁。 我们平时无论任何操作,最终都要操作硬件,比如输入一个字符 “ a ”, 那么信号 首先会从键盘传递到主板,通过主板总线传递到内存,CPU,显卡等,最终经过显卡的运 算完成后在屏幕的某个位置, 显示一个特定字体的字符 “ a ”, 这一整个过程可以说是 不断的和硬件打交道了,但是如果让人去发送这些硬件操作码显然不适合, 因为这不是人干 的事,所以我们有了操作系统,操作系统通过加载一定的硬件驱动,从而控制硬件,操作硬件,那剩下的事就是如何和操作系统通信了,对于普通的系统管理员来说,这也是一件非常困难的事,为了方便人和操作系统沟通, 我们开发了 shell 。 11 | 12 | Shell 可以将我们平时运行的一些指令解释给操作系统执行, 方便管理员操作系统。而 Shell 的脚本其实是一种命令的堆积,我们将所有需要执行的命令, 以从上至下的方 式写在一个文件当中, 交给 shell 去自动解释执行。 13 | 14 | ### shell 历史 15 | 16 | 在 AT&T 的 Dennis Ritchie 和 Ken Thompson 设计 UNIXTM 的时候, 他们想要为 用户创建一种与他们的新系统交流的方法。那时的操作系统带有命令解释器。命令解释器接受用户的命令,然后解释它们,因而计算机可以使用这些命令。 但是 Ritchie 和 Thompson 想要的不只是这些功能,他们想提供比当时的命令解释器 具备更优异功能的工具。这导致了 Bourne shell ( 通称为 sh )的开发, 由 S.R. Bourne 创建。自从 Bourne shell 的创建, 其它 shell 也被一一开发, 如 C shell ( csh ) 和 Korn shell (ksh ) 。 17 | 18 | 当自由软件基金会想寻求一种免费的 shell , 开发者们开始致力于 Bourne shell 以及当 时其它 shell中某些很受欢迎的功能背后的语言。 这个开发结果是 Bourne Again Shell , 或称 bash 。虽然你的Red Hat Linux 包括几 种不同的 shell , bash 是为互动用户提供的默认 shell 。 19 | 20 | ### 常见的 shell 21 | 22 | * Bourne shell 即 sh : AT&T 贝尔实验室编写的一个交换式的命令解释器。 23 | * C Shell : Bill Joy 于 20 世纪 80 年代早期开发。为了让用户更容易的使用, 他把语法结构变成了 C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。 24 | * korn shell (ksh) 是一个 Unix shell 。它由贝尔实验室的 David Korn 在二十世纪八十 年代早期编写。它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性。 25 | * Bourne-Again SHell : bash 是一个为 GNU 项目编写的 Unix shell 。它的名字是一 系列缩写:Bourne-Again SHell — 这是关于 Bourne shell ( sh )的一个双关语( Bourne again / bornagain ) 。 Bourne shell 是一个早期的重要 shell , 由 Stephen Bourne 在 1978 年前后编写,并同 Version 7 Unix 一起发布。 bash 则在 1987 年由 Brian Fox 创造。 在 1990 年, ChetRamey 成为了主要的维护者。 bash 是大多数 Linux 系统以及 Mac OS X v10.4 默认的 shell ,它能运行于大多数 Unix 风格的操作系统之上, 甚至被移植到了 Microsoft Windows 上的 Cygwin 和MSYS 系统中, 以实现 windows 的 POSIX 虚拟接口。此外, 它也被 DJGPP 项目移植到了 MS- DOS 上。 26 | * POSIX shell : POSIX shell 与 Korn shell 非常的相似, 当前提供 POSIX shell 的最大卖主是Hewlett-Packard 。 27 | 28 | ### 为什么 Shell 29 | 30 | * 解决重复操作的作业。 31 | * 节约时间 , 提高工作效率。 32 | * 功能强大,使用简单 33 | 34 | ### /etc/shells 35 | 36 | `/etc/shells` 文件记录了目前系统中注册过的 shell,每一个用户可以使用一种 shell,可以通过`usermod -s` 来修改用户 shell,也可以通过`chsh` 来更改 shell 37 | 38 | ```shell 39 | [root@redhat6 tmp]# chsh carol 40 | Changing shell for carol. 41 | New shell [/bin/csh]: /bin/sh 42 | Shell changed. 43 | [root@redhat6 tmp]# su - carol 44 | -sh-4.1$ tail /etc/passwd -n1 45 | carol:x:60000:60000:carol:/home/carol:/bin/sh 46 | -sh-4.1$ 47 | ``` 48 | 49 | ## bash 功能 50 | 51 | ### history 功能 52 | 53 | history 命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。 该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。 54 | 55 | 例如,要执行第 2 个历史命令,则输入`!2 `。 56 | 57 | 历史命令是被保存在内存中的,当退出或者登录 shell 时,会自动保存或读取。在内存中,历史命令仅能够存储 1000 条历史命令,该数量是由环境变量 `HISTSIZE` 进行控制。 58 | 59 | HISTSIZE 变量 --变量:反复调用的值,以$符号引用 60 | 61 | 定义方式:histsize 数字 临时生效 62 | 63 | /etc/profile 里永久定义 64 | 65 | 保存位置:~/.bash_history 66 | 67 | ```shell 68 | 语法 history(选项)(参数) 69 | 70 | 选项 -c :清空当前历史命令; 71 | -a :将历史命令缓冲区中命令写入历史命令文件中; 72 | -r :将历史命令文件中的命令读入当前历史命令缓冲区; 73 | -w:将当前历史命令缓冲区命令写入历史命令文件中。 74 | 75 | 参数 打印最近的 n 条历史命令 76 | 77 | 实例 78 | 79 | !8 使用第八个命令 80 | !Ser 使用该字符串开头的最近的命令 81 | !!调用上一条命令 82 | !$ 调用上一个命令的参数 = alt+. 83 | Ctrl+R 搜索最近包含字符串的命令 84 | ``` 85 | ```shell 86 | history 87 | 命令用法 88 | history 89 | -c 清空缓存 90 | -r 将~/.bash_history历史命令读入缓存 91 | 92 | 方便的调用 !num 93 | !! 调用最近一次的命令 94 | !关键字 95 | 96 | 97 | 实战 1.你是黑客,窃取别人的历史命令 98 | ~/.bash_history 99 | 2.为了防止黑客,你怎么防止一些关键命令被窃取,比如配置用户密码,或者数据库密码等 100 | [root@rhel7 ~]# echo "uplooking123"|passwd --stdin superman 101 | Changing password for user superman. 102 | passwd: all authentication tokens updated successfully. 103 | 104 | 105 | 1)清缓冲 106 | 2)删除文件 107 | 108 | [root@rhel7 ~]# export HISTCONTROL=ignorespace 109 | [root@rhel7 ~]# echo 1 110 | 1 111 | [root@rhel7 ~]# echo 2 112 | 2 113 | [root@rhel7 ~]# echo 3 114 | 3 115 | [root@rhel7 ~]# history 116 | 1 HISTCONTROL=ignorespace 117 | 2 exprot HISTCONTROL=ignorespace 118 | 3 export HISTCONTROL=ignorespace 119 | 4 echo 1 120 | 5 echo 2 121 | 6 history 122 | 123 | 124 | ``` 125 | 126 | ### 别名 alias 127 | 128 | alias 命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用 alias 时,用户必须使用单引号'' 将原来的命令引起来,防止特殊字符导致错误。 alias 命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的 alias 命令存放到 bash 的初始化文件/etc/bashrc 中。 129 | 130 | ```shell 131 | 语法 alias(选项)(参数) 132 | 133 | 选项 134 | -p :打印已经设置的命令别名。 135 | 136 | 参数 命令别名设置:定义命令别名,格式为 “ 命令别名=‘ 实际命令 ’” 。 137 | 138 | 实例 alias 新的命令=' 原命令 -选项/参数' 139 | alias grep=’grep --color=auto’ 140 | ``` 141 | 142 | * ~/.bashrc 针对单个用户生效 143 | * /etc/bashrc 针对全局生效 144 | 145 | 实战 146 | 147 | 1. 我的工作路径在/tmp/justice/superman/dir1/,每天登陆的服务器都很累,因为要天天输入cd /tmp/justice/superman/dir1/,有什么办法能够轻松一点呢?让我少输入一点命令呢? 148 | 2. 取消我刚刚设置的别名unalias 149 | 150 | ### tab 键补全功能 151 | 152 | 单击补全命令,如果没办法补全,双击可以显示以该字符串开始的文件名都有哪些。(或者命令都有哪些) 153 | 154 | ### 快捷键 155 | 156 | * Ctrl +A 跳行首 157 | * Ctrl +L 清屏 158 | * Ctrl +e 跳行尾 159 | * Ctrl +c 中断 160 | * Ctrl +R 搜索 161 | * ctrl +d logout 162 | 163 | ## 用户登录流程 164 | 165 | 学习用户登录流程的意义: 166 | 167 | 我们之前有提到过几个变量,比如 histsize、比如 umask 等。这些功能都可以是针对于某一个用户去设置的。那么我们是怎么知道具体要把这些相关配置信息写入哪一个文件呢?哪一个文件是用于全局的变量的设置的,哪一个文件针对单个用户生效,哪一个文件里面的配置字段会覆盖之前的配置字段呢?这就要用到我们的用户登录流程了。 168 | 169 | 五个配置文件的顺序: 170 | 171 | 我们用户在登录的时候,会调用一系列的文件,这些文件包括 172 | * /etc/profile 173 | * /etc/profile.d 目录下的所有文件 174 | * /.bash_profile 175 | * ~/.bashrc 176 | * /etc/bashrc 177 | 178 | 这是我们系统登录过程中用到的五个文件,我们一一来查看。 179 | 180 | /etc/profile 181 | 182 | /etc/profile 里面包含了配置字段 include /etc/profile.d 。这个 include 代表扩展配置文件,当读取该文件的时候,会读取相应的一些扩展配置文件。 183 | 184 | 我们通常不会把所有的东西都往一个文件里面去写,一方面是由于全往一个文件里面去写会导致文件特别大,另一方面,不方便我们的修改文件的灵活度。我们要从一个大篇幅的配置文件中找到某一行,非常的累,那么我们就可以将配置文件也分门别类的去写。比如说我创建了一个新的程序,这个程序需要一些变量的设置,我就可以将这些变量写成一个新的文件,放在/etc/profile.d 目录下,那么当我读取 profile 的时候一样能够读到该文件,当我不需要那个程序了,我也不用去找这个配置字段了,直接把对应的配置文件删除就可以了吧。 185 | 186 | ~/.bash_profile 187 | 188 | 接下来回去读~/.bash_profile 文件,由于是家目录下的,这是属于用户个人本身的配置文件,也就是说,写在这个配置文件当中的变量,只针对对应的用户生效。该文件里写的内容一部分是去读取~/.bashrc 文件,一部分写了 path 变量的相关内容。 189 | 190 | ```shell 191 | # .bash_profile 192 | # Get the aliases and functions 193 | if [ -f ~/.bashrc ]; then 194 | . ~/.bashrc 195 | fi 196 | # User specific environment and startup programs 197 | PATH=$PATH:$HOME/bin 198 | export PATH 199 | ``` 200 | 201 | ### PATH 变量 202 | 203 | PATH 变量是我们系统中的相关命令的路径。PATH 的作用,简化我们的命令写法。 204 | 205 | 我们执行的命令一般都在 PATH 指定的路径中,比如说我们的 useradd 命令,实际上执行的是/usr/sbin/useradd ,再比如说 touch 命令,实际上执行的是/bin/touch 命令。 206 | 207 | ```shell 208 | [root@mastera0 ~]# echo $PATH 209 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 210 | [root@mastera0 ~]# which useradd 211 | /usr/sbin/useradd 212 | [root@mastera0 ~]# which touch 213 | /usr/bin/touch 214 | [root@mastera0 ~]# vim pathtest 215 | [root@mastera0 ~]# ll pathtest 216 | -rw-r--r--. 1 root root 26 Jun 24 16:58 pathtest 217 | [root@mastera0 ~]# chmod +x pathtest 218 | [root@mastera0 ~]# ll pathtest 219 | -rwxr-xr-x. 1 root root 26 Jun 24 16:58 pathtest 220 | [root@mastera0 ~]# pathtest 221 | -bash: pathtest: command not found 222 | [root@mastera0 ~]# ./pathtest 223 | this is a PATH-test! 224 | [root@mastera0 ~]# cp pathtest /usr/local/bin 225 | [root@mastera0 ~]# pathtest 226 | this is a PATH-test! 227 | [root@mastera0 ~]# which pathtest 228 | /usr/local/bin/pathtest 229 | ``` 230 | 231 | 那么 PATH 也有一个读取顺序,优先会从第一个位置开始找,比如说我们去/usr/local/sbin 下面创建一个同名的可执行文件 pathtest,内容如下: 232 | 233 | ```shell 234 | [root@mastera0 ~]# vim pathtest 235 | [root@mastera0 ~]# cp pathtest /usr/local/sbin 236 | [root@mastera0 ~]# pathtest 237 | this is a PATH-test! 238 | [root@mastera0 ~]# ./pathtest 239 | New! I am /usr/local/sbin this is a PATH-test! 240 | [root@mastera0 ~]# pathtest 241 | this is a PATH-test! 242 | [root@mastera0 ~]# export PATH 243 | [root@mastera0 ~]# pathtest 244 | New! I am /usr/local/sbin this is a PATH-test! 245 | ``` 246 | 247 | 这个就是 PATH 的读取顺序,由于第二个 pathtest 命令的路径/usr/local/sbin 优先于第一个 248 | 249 | pathtest 命令的路径/usr/local/bin,所以执行了第二个 pathtest即/usr/local/sbin/pathtest。然后我们把第二个 pathtest 删除 `rm -rf /usr/local/sbin/pathtest`,重新 export 一下PATH,export 是设置环境变量的意思。之后我们讲到脚本会去说 250 | 251 | ```shell 252 | [root@mastera0 ~]# rm -rf /usr/local/sbin/pathtest 253 | [root@mastera0 ~]# export PATH 254 | [root@mastera0 ~]# pathtest 255 | this is a PATH-test! 256 | ``` 257 | 258 | 那么这时候再来看一下执行结果是不是又回来了。 259 | 260 | 最后,读完这两个~/.bash_profile 和~/.bashrc 以后,系统最后再去读/etc/bashrc。 261 | 262 | 这是我们整个的流程。先后读取顺序分别是 263 | 264 | 1. /etc/profile 265 | 2. /etc/profile.d/* 266 | 3. ~/.bash_profile 267 | 4. ~/.bashrc 268 | 5. /etc/bashrc 269 | 270 | 记住,后面写的变量会覆盖之前的变量值,所以我们想让哪些变量生效,就一定要清楚写在什么位置。 271 | 272 | 比如说,我希望只能够给 student 用户使用的别名应该写到~/.bashrc 目录下 273 | 274 | 我希望让全局生效的参数可以放置在/etc/profile 目录下。 275 | 276 | `Su` 和 `su -`的区别:这就是用户登录流程要注意的事情,系统里面有个很典型的例子,就是 su 277 | 278 | `Su` 代表切换用户。用法是 `su - 用户名`,或者`su` 直接跟上用户名。前者叫标准切换,后者叫非标准切换。 279 | 280 | 非标准切换有些变量是拿不到的。所以你可以看到 su 之后,我们的位置还在切换之前的位置,而我们 `su -` 的位置已经切换到用户的家目录了。 281 | 282 | 那么是哪些变量没拿到呢? 283 | 284 | 我们来做个小实验。 285 | 286 | 演示 给 5 个配置文件的头部分别写上 `echo "xxx (配置文件名) start"`,尾部写上 `echo "xxxx(配置文件名) stop"` 287 | 288 | `Man bash` 可以告诉你登录流程的相关内容。 289 | 290 | ### PS1 变量 291 | 292 | /etc/bashrc 中有一个变量 PS1,我们一起来看看他的作用。 293 | 294 | `man bash` 后搜索 ps1 关键词 295 | 296 | ```shell 297 | \d :代表日期,格式为 weekday month date,例如:"Mon Aug 1" 298 | \H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是 fc4.linux 299 | \h :仅取主机的第一个名字,如上例,则为 fc4,.linux 则被省略 300 | \t :显示时间为 24 小时格式,如:HH:MM:SS 301 | \T :显示时间为 12 小时格式 302 | \A :显示时间为 24 小时格式:HH:MM 303 | \u :当前用户的账号名称 304 | \v :BASH 的版本信息 305 | \w :完整的工作目录名称。家目录会以 ~代替 306 | \W :利用 basename 取得工作目录名称,所以只会列出最后一个目录 307 | :下达的第几个命令 308 | \$ :提示字符,如果是 root 时,提示符为:# ,普通用户则为:$ 309 | ``` 310 | 311 | the在 PS1 中设置字符序列颜色的格式为:\[\e[F;Bm\] 312 | 313 | * F为字体颜色,编号 30~37; 314 | * B为背景色,编号 40~47 。 315 | 316 | * 取消设置:\[\e[m\] 317 | 318 | 颜色表 319 | ```shell 320 | 前景 背景 颜色 321 | 30 40 黑色 322 | 31 41 红色 323 | 32 42 绿色 324 | 33 43 黄色 325 | 34 44 蓝色 326 | 35 45 紫红色 327 | 36 46 青蓝色 328 | 37 47 白色 329 | 330 | 代码 331 | 意义 332 | 0 OFF 333 | 1 高亮显示 334 | 4 underline 335 | 7 反白显示 336 | 8 不可见 337 | ``` 338 | 339 | 举例: 340 | 341 | 342 | PS1='[\[\e[32m\]#\##\[\e[31m\]\u@\[\e[36m\]\h \w]\$\[\e[m\]' 343 | 344 | * \[\e[32m\] 设置为绿色 345 | 346 | * #\## 显示现在运行的是第几条命令 347 | * [\e[31m\] 设置为红色 348 | * \u@ 当前用户的账号名称@ 349 | * [\e[36m\] 青蓝色 350 | * \h \w 351 | * \h 仅取主机的第一个名字,\w 是说:显示完整的路径,但是不知到为什么家他显示~而不是绝对路径。 352 | * \[\e[m\] 使用来关闭颜色设置的。 353 | 354 | 要是你没有这个的话;那么,你的命令提示符,包括你通过命令提示符输出的东西都是和最后一次的颜色设置相同( 除了一些有特殊意义的文件 )。 355 | 356 | 这个配置写到哪里呢??? 357 | 358 | 如果只想让当前用户生效,那么应该在用户的根目录下的 ".bashrc",在里头的最后一行加上,然后保存。然后 source .bashrc 或者 ". .bashrc" 或者注销一下。如果想让所有用户生效,该放哪里?思考题 359 | 360 | ## Bash简介课后作业 361 | 362 | 1. 要求 student 用户登录的时候获取 umask 值为 044, 并且该 值永久生效。 363 | 2. 要求所有普通用户登录时, 最后获取到的 HISTSIZE 值为 500, 而 root 用户获取到的 HISTSIZE 的值为 1000 。 364 | 3. 梳理一下五个文件的登录顺序。 365 | -------------------------------------------------------------------------------- /13-进程管理.md: -------------------------------------------------------------------------------- 1 | # 进程管理 2 | 3 | [TOC] 4 | 5 | ## 进程 6 | 7 | * 进程: 运行在内存中程序实例 , 进程是程序运行的一种状态 , 是内存中的概念,进程与进程之间无法访问对方私有的内存区域。 8 | * 线程: 程序运行的最小单元,一个进程可以派生出多个线程,同一个进程内的线程之间可以相互访问彼此内存区域,并且可以共享同一进程的共享内存区域。 9 | 10 | * 进程编号:pid 11 | * 父进程编号:ppid 12 | 13 | ### pstree 命令 14 | 15 | pstree 命令用以查看进程的结构 16 | 17 | | 常用参数 | 参数说明 | 18 | | --------- | ----------------------------- | 19 | | -a | 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。 | 20 | | -c | 不使用精简标示法。 | 21 | | -G | 使用VT100终端机的列绘图字符。 | 22 | | -h | 列出树状图时,特别标明执行的程序。 | 23 | | -H<程序识别码> | 此参数的效果和指定"-h"参数类似,但特别标明指定的程序。 | 24 | | -l | 采用长列格式显示树状图。 | 25 | | -n | 用程序识别码排序。预设是以程序名称来排序。 | 26 | | -p | 显示程序识别码。 | 27 | | -u | 显示用户名称。 | 28 | | -U | 使用UTF-8列绘图字符。 | 29 | | -V | 显示版本信息。 | 30 | 31 | ```shell 32 | [root@rhel6 /etc/skel]#pstree 33 | init─┬─NetworkManager─┬─dhclient 34 | │ 35 | └─{NetworkManager} 36 | ├─abrtd 37 | ├─acpid 38 | ├─anacron 39 | ├─atd 40 | ├─auditd───{auditd} 41 | ├─automount───4*[{automount}] 42 | ├─bonobo-activati───{bonobo-activat} 43 | ├─certmonger 44 | ├─console-kit-dae───63*[{console-kit-da}] 45 | ├─crond 46 | ├─cupsd 47 | ├─2*[dbus-daemon───{dbus-daemon}] 48 | ├─dbus-launch 49 | ├─devkit-power-da 50 | ├─gconfd-2 51 | ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg 52 | │ 53 | │ 54 | ├─gdm-session-wor 55 | │ 56 | │ 57 | ├─gnome-session─┬─at-spi-registry 58 | │ 59 | │ 60 | │ 61 | ├─gdm-simple-gree 62 | │ 63 | │ 64 | │ 65 | ├─gnome-power-man 66 | │ 67 | │ 68 | │ 69 | ├─metacity 70 | │ 71 | │ 72 | │ 73 | ├─polkit-gnome-au 74 | │ 75 | │ 76 | │ 77 | └─{gnome-session} 78 | │ 79 | │ 80 | └─{gdm-simple-sla} 81 | │ 82 | └─{gdm-binary} 83 | ├─gnome-settings-───{gnome-settings} 84 | ├─gvfsd 85 | ├─hald─┬─hald-runner─┬─hald-addon-acpi 86 | │ 87 | │ 88 | └─hald-addon-inpu 89 | │ 90 | └─{hald} 91 | ├─master─┬─pickup│ 92 | └─qmgr 93 | ├─5*[mingetty] 94 | ├─modem-manager 95 | ├─polkitd 96 | ├─pulseaudio───{pulseaudio} 97 | ├─rhsmcertd 98 | ├─rpc.statd 99 | ├─rpcbind 100 | ├─rsyslogd───3*[{rsyslogd}] 101 | ├─rtkit-daemon───2*[{rtkit-daemon}] 102 | ├─sshd───sshd───bash───pstree 103 | ├─udevd───2*[udevd] 104 | └─wpa_supplicant 105 | ``` 106 | 107 | ### 静态查看进程信息 108 | 109 | #### ps 110 | 111 | * ps 查看当前标签页上的进程信息 112 | * ps aux 系统进程快照 113 | * ps -ef e 所有进程 f 全格式罗列 114 | 115 | 使用ps aux查看 116 | 第一列user代表进程的拥有者,第二列PID,第三列占用CPU的百分比,第四列占用内存的百分比,我们说进程占用系统资源,像CPU内存都属于系统资源的一部分,这里都将它显示出来了。接下来,VSZ代表这个占用虚拟内存的大小,RSS代表占用物理内存的大小,以KB为单位。虚拟空间就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,那么物理内存就是真实存在的真正的内存大小。然后就是处于哪个终端,进程目前的状态,开始时间,和具体的命令。那么进程的状态有哪些呢。 117 | S:休眠状态(sleeping) 118 | R:等待运行(runable)R Running or runnable (on run queue) 进程处于运行或就绪状态 119 | I:空闲状态(idle) 120 | < high-priority (not nice to other users) 优先级较高的 121 | N low-priority (nice to other users) 优先级较低 122 | s is a session leader 进程的领导者 123 | l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 多线程 124 | + is in the foreground process group 在前台进程组 125 | 126 | 使用ps -ef 查看 127 | UID 用户ID 128 | PID 进程ID 129 | PPID 父进程ID 130 | C CPU占用率 131 | STIME 开始时间 132 | TTY 开始此进程的TTY 133 | TIME 此进程运行的总时间 134 | CMD 命令名 135 | 136 | 使用ps -le可以用来查看这个进程的优先级,主要关注优先级,优先级是NI这一列,其他先不用关注 137 | #### pgrep 138 | 139 | 用来过滤进程号 140 | 141 | ```shell 142 | [root@rhel6 ~]# pgrep -l ping <== 截取进程号 pid 143 | 27706 ping 144 | [root@rhel6 ~]# pgrep -lU student <== 指定用户截取进程号 pid 145 | 27736 bash 146 | 27762 ping 147 | [root@rhel6 ~]# pgrep -l -t pts/1 <== 指定登陆端口截取进程号 pid 148 | 2568 bash 149 | 27735 su 150 | 27736 bash 151 | 1.2.3 pidof 152 | [root@rhel6 ~]# pidof Xorg <== 只显示进程的进程号 pid 153 | 15262 154 | ``` 155 | 156 | ## 动态查看进程信息 157 | 158 | ### top 终端提示符不显示 159 | 160 | * 【 d 】修改默认刷新频率 , 默认 3s 161 | * 【 P 】以 cup 占用百分比进行排序 162 | * 【 M 】以内存的占用情况排序 163 | * 【 h 】显示帮助信息 164 | * 【 <> 】翻页 165 | * 【 k 】杀掉进程 kill 166 | 167 | top命令图解 168 | 169 | ![top-pic](pic\top-pic.png) 170 | 171 | ### 停止进程 172 | 173 | Linux中的 kill 命令用来停止指定的进程( terminate a process )的运行,是 Linux下进程管理的常用命令。 174 | 175 | 通常情况下停止一个前台进程可以使用 Ctrl+C 组合键,但是对于一个运行在后台进程需要用 kill命令来终止,我们就需要先使用 ps、pidof、pstree和top 等工具获取进程 PID ,然后使用 kill 命令来杀掉该进程。 176 | 177 | kill 命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15 的 TERM 信号。 TERM 信号将终止所有不能捕获该信号的进程。 178 | 179 | 对于那些可以捕获该信号的进程就要用编号为 9 的 kill 信号,强行 “ 杀掉 ” 该进程。 180 | 181 | 命令格式 182 | 183 | kill [参数][进程号] 184 | 185 | 命令功能: 186 | 187 | 发送指定的信号到相应进程。不指定型号将发送 SIGTERM ( 15 )终止指定进程。如果任无法终止该程序可用 “ -KILL” 参数,其发送的信号为 SIGKILL(9) ,将强制结束进程,使用 ps 命令或者 jobs 命令可以查看进程号。 root 用户将影响用户的进程,非 root 用户只能影响自己的进程。 188 | 189 | 命令参数: 190 | 191 | | 参数 | 说明 | 192 | | :--- | :------------------------------------ | 193 | | -l | 信号,若果不加信号的编号参数,则使用 “ -l” 参数会列出全部的信号名称 | 194 | | -a | 当处理当前进程时,不限制命令名和进程号的对应关系 | 195 | | -p | 指定 kill 命令只打印相关进程的进程号,而不发送任何信号 | 196 | | -s | 指定发送信号 | 197 | | -u | 指定用户 | 198 | 199 | ### killall 200 | 201 | 用于关掉多个同名的进程 202 | 203 | killall -9 ping ===>关掉所有的ping进程 204 | 205 | ### pkill 206 | 207 | 使用pkill命令可以根据进程的名称/运行该进程的用户/进程所在的终端等等属性来终止特定的进程 208 | pkill -9 -t 终端名 ===>关掉由该终端开启的进程 209 | pkill -9 -U 用户名 ===>关掉由该用户开启的进程 210 | 211 | ### xkill 212 | 213 | 哪里关不掉点哪里 214 | 215 | 主要用于停止图形化(GUI)程序 216 | 217 | ### 进程优先级 218 | 219 | NI nice 220 | 221 | 数字表示 : -20-19 数字越小 , 等级越高 222 | 223 | `ps -le | grep ping` <== 查看 ping 的优先级 224 | 225 | ### 指定优先级 226 | 227 | `nice -n 3 ping 172.0.0.1` 228 | 229 | 普通用户不能指定比 0 小的优先级 , root 用户随意 230 | 231 | 普通用户只能做贡献,上帝随意设置优先级 232 | 233 | ### 调整优先级 234 | 235 | `renice -n [-20-19] [pid] <== 调整优先级` 236 | 237 | root 可以升高也可降低nice值,代表可以设置优先级更低可以设置优先级更高。 238 | 239 | 普通用户只能升高nice值,代表只能降低优先级。 240 | 241 | ```shell 242 | [root@rhel6 ~]#nice -n 3 ping 172.25.0.10 243 | [root@rhel6 ~]#nice -n 5 ping 172.25.0.10 244 | [root@rhel6 ~]#ps -le|grep ping 245 | 4 S 0 26613 26536 0 83 3 - 25812 skb_re pts/1 00:00:00 ping 246 | 4 S 0 26614 26567 0 85 5 - 25812 skb_re pts/2 00:00:00 ping 247 | [root@rhel6 ~]#renice -n -1 26613 248 | 26613: old priority 3, new priority -1 249 | [root@rhel6 ~]#ps -le|grep ping 250 | 4 S 0 26613 26536 0 79 -1 - 25812 skb_re pts/1 00:00:00 ping 251 | 4 S 0 26614 26567 0 85 5 - 25812 skb_re pts/2 00:00:00 ping 252 | ``` 253 | 254 | ## 前后台作业 255 | 256 | * & 在创建进程的过程中 , 将前台作业放置到后台的方法 ,在命令后面加上 & 257 | * jobs 查看后台进程 258 | * fg 将后台作业调用到前台 259 | * ctrl+z 将已经触发的前台作业调到后台 , 后台作业暂停 260 | * bg 让后台作业执行 261 | 262 | 263 | ```shell 264 | [root@rhel6 ~]#ping 172.25.0.11 >/dev/null & 265 | [1] 26712 266 | [root@rhel6 ~]#ping 172.25.0.10 >/dev/null & 267 | [2] 26713 268 | [#13#root@rhel6 ~]#jobs 269 | [1]- Running 270 | ping 172.25.0.11 > /dev/null & 271 | [2]+ Running 272 | ping 172.25.0.10 > /dev/null & 273 | [root@rhel6 ~]#fg 2 274 | ping 172.25.0.10 > /dev/null 275 | ^Z 276 | [2]+ Stopped 277 | ping 172.25.0.10 > /dev/null 278 | [root@rhel6 ~]#bg 2 279 | [2]+ ping 172.25.0.10 > /dev/null & 280 | [root@rhel6 ~]#ps -ef|grep ping 281 | root 26712 26567 0 18:16 pts/2 00:00:00 ping 172.25.0.11 282 | root 26713 26567 0 18:16 pts/2 00:00:00 ping 172.25.0.10 283 | root 26717 26567 0 18:17 pts/2 00:00:00 grep ping 284 | [root@rhel6 ~]#kill 26712 285 | [root@rhel6 ~]#jobs 286 | [1]- Terminated 287 | ping 172.25.0.11 > /dev/null 288 | [2]+ Running 289 | ping 172.25.0.10 > /dev/null & 290 | [root@rhel6 ~]#kill 26713 291 | [root@rhel6 ~]#jobs 292 | [2]+ Terminated 293 | ping 172.25.0.10 > /dev/null 294 | [#21#root@rhel6 ~]#jobs 295 | ``` 296 | 297 | ## 进程管理课后作业 298 | 299 | 进程管理 300 | 301 | 1. 关于父进程和子进程的实验: 302 | 打开一个终端登陆 ssh root@rhel7-fN 进入输入密码的状态,先不输入密码,查看进程;输入 303 | 304 | 密码后再查看进程。 305 | ```shell 306 | rhel7 307 | [root@rhel7 ~]# ps -ef|grep bash 308 | root 642 1 0 02:46 ? 00:00:00 /bin/bash /usr/sbin/ksmtuned 309 | root 7844 7839 1 06:29 pts/0 00:00:00 -bash 310 | [root@rhel7 ~]# ps -ef|grep ssh 311 | root 1261 1 0 02:46 ? 00:00:00 /usr/sbin/sshd -D 312 | root 7839 1261 0 06:29 ? 00:00:00 sshd: root@pts/0 313 | root 7892 1261 0 06:29 ? 00:00:00 sshd: root [priv] 314 | sshd 7893 7892 0 06:29 ? 00:00:00 sshd: root [net] 315 | root 7906 7844 0 06:30 pts/0 00:00:00 grep --color=auto ssh 316 | [root@rhel7 ~]# ps -ef|grep bash 317 | root 642 1 0 02:46 ? 00:00:00 /bin/bash /usr/sbin/ksmtuned 318 | root 7844 7839 0 06:29 pts/0 00:00:00 -bash 319 | root 7915 7892 0 06:30 pts/1 00:00:00 -bash 320 | root 7957 7844 0 06:30 pts/0 00:00:00 grep --color=auto bash 321 | [root@rhel7 ~]# ps -ef|grep 7892 322 | root 7892 1261 0 06:29 ? 00:00:00 sshd: root@pts/1 323 | root 7915 7892 0 06:30 pts/1 00:00:00 -bash 324 | [root@rhel7 ~]# ps -ef|grep 1261 325 | root 1261 1 0 02:46 ? 00:00:00 /usr/sbin/sshd -D 326 | root 7839 1261 0 06:29 ? 00:00:00 sshd: root@pts/0 327 | root 7892 1261 0 06:29 ? 00:00:00 sshd: root@pts/1 328 | [root@rhel7 ~]# ps -ef|grep 1|head -n 1 329 | root 1 0 0 02:46 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 20 330 | 331 | 332 | rhel6 333 | [root@rhel6 ~]#ps -ef|grep ssh 334 | root 1421 1 0 15:56 ? 00:00:00 /usr/sbin/sshd 335 | root 26564 1421 0 17:36 ? 00:00:00 sshd: root@pts/2 336 | root 26750 1421 0 18:25 ? 00:00:00 sshd: root@pts/3 337 | root 26829 26803 0 18:29 pts/3 00:00:00 ssh root@172.25.0.10 338 | root 26848 26567 0 18:37 pts/2 00:00:00 grep ssh 339 | [root@rhel6 ~]#ps -ef|grep ssh 340 | root 1421 1 0 15:56 ? 00:00:00 /usr/sbin/sshd 341 | root 26564 1421 0 17:36 ? 00:00:00 sshd: root@pts/2 342 | root 26750 1421 0 18:25 ? 00:00:00 sshd: root@pts/3 343 | root 26829 26803 0 18:29 pts/3 00:00:00 ssh root@172.25.0.10 344 | root 26849 1421 0 18:37 ? 00:00:00 sshd: [accepted] 345 | sshd 26850 26849 0 18:37 ? 00:00:00 sshd: [net] 346 | root 26852 26567 0 18:37 pts/2 00:00:00 grep ssh 347 | [root@rhel6 ~]#ps -ef|grep ssh 348 | root 1421 1 0 15:56 ? 00:00:00 /usr/sbin/sshd 349 | root 26564 1421 0 17:36 ? 00:00:00 sshd: root@pts/2 350 | root 26750 1421 0 18:25 ? 00:00:00 sshd: root@pts/3 351 | root 26829 26803 0 18:29 pts/3 00:00:00 ssh root@172.25.0.10 352 | root 26849 1421 1 18:37 ? 00:00:00 sshd: root@pts/0 353 | root 26874 26567 0 18:38 pts/2 00:00:00 grep ssh 354 | [root@rhel6 ~]#ps -ef|grep 1421 355 | root 1421 1 0 15:56 ? 00:00:00 /usr/sbin/sshd 356 | root 26564 1421 0 17:36 ? 00:00:00 sshd: root@pts/2 357 | root 26750 1421 0 18:25 ? 00:00:00 sshd: root@pts/3 358 | root 26849 1421 0 18:37 ? 00:00:00 sshd: root@pts/0 359 | root 26877 26567 0 18:38 pts/2 00:00:00 grep 1421 360 | [root@rhel6 ~]#ps -ef|grep 1|head -n 1 361 | root 1 0 0 15:55 ? 00:00:01 /sbin/init 362 | ``` 363 | 364 | 2. 创建多个vi 进程,并使其运行在系统后台,设置vi 后台进程的优先级(nice)值,分别为1、5、15、17,并随后将其统一修改为18。 365 | 3. 观察top命令的显示信息,找出当前占用cpu、内存、I/O资源最多的进程号和进程名。 366 | 367 | -------------------------------------------------------------------------------- /11-Linux内核.md: -------------------------------------------------------------------------------- 1 | # Linux内核 2 | 3 | [TOC] 4 | 5 | ## WHERE 6 | 7 | 内核与内核模块在哪里呢?内核模块都有哪些呢?下面的表中都列出来了: 8 | 9 | * 内核 /boot/vmlinuz-version 10 | * 内核解压缩所需 RAM Disk /boot/initrd-version 11 | * 内核模块 /lib/modules/$(uname -r)/kernel 12 | 13 | ### WHAT 14 | 15 | 开机时,内核第一任务就是驱动硬件,激活机器。相关的驱动模块放在 `/lib/modules/$(uname -r)/` 目录下,下面以 rhel6 为例,看看该目录下都有些什么: 16 | 17 | ```shell 18 | [root@rhel6 ~]# ls /lib/modules/2.6.32-431.el6.x86_64 19 | build 20 | modules.dep 21 | modules.networking modules.usbmap 22 | extra 23 | modules.dep.bin 24 | modules.ofmap 25 | source 26 | kernel 27 | modules.drm 28 | modules.order 29 | updates 30 | modules.alias 31 | modules.ieee1394map modules.pcimap 32 | vdso 33 | modules.alias.bin modules.inputmap modules.seriomap weak-updates 34 | modules.block 35 | modules.isapnpmap modules.symbols 36 | modules.ccwmap modules.modesetting modules.symbols.bin 37 | [root@rhel6 ~]# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/ 38 | arch crypto drivers fs kernel lib mm net sound 39 | [root@rhel6 ~]# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/ 40 | acpi 41 | cpufreq hid 42 | leds 43 | net 44 | rtc 45 | vhost 46 | ata 47 | crypto hv 48 | md 49 | parport scsi video 50 | atm 51 | dca 52 | hwmon 53 | media pci 54 | serial virtio 55 | auxdisplay dma 56 | i2c 57 | memstick pcmcia ssb 58 | watchdog 59 | bcma 60 | edac idle 61 | message platform staging xen 62 | block 63 | firewire ieee802154 mfd 64 | power 65 | target 66 | bluetooth firmware infiniband misc 67 | pps 68 | uio 69 | cdrom 70 | gpio 71 | input 72 | mmc 73 | ptp 74 | usb 75 | char 76 | gpu 77 | isdn 78 | mtd 79 | regulator uwb 80 | [root@rhel6 ~]# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net 81 | 3c59x.ko dl2k.ko 82 | macvtap.ko 83 | pppox.ko 84 | sunhme.ko 85 | 8139cp.ko dnet.ko 86 | mdio.ko 87 | ppp_synctty.ko tehuti.ko 88 | ``` 89 | 90 | /lib/modules/2.6.32-431.el6.x86_64/kernel/ 该目录下的文件解释 91 | 92 | * arch 与硬件平台有关的项目 , 例如 CPU 的等级等等 ; 93 | * crypto 内核所支持的加密的技术 , 例如 md5 、 des 等等 ; 94 | * drivers 硬件的驱动程序 , 例如显示适配器、网络卡、 PCI 相关硬件 95 | * fs 内核所支持的 filesystems , 例如 ext4, vfat, reiserfs, nfs 等等 ; 96 | * kernel 内核的程序、内核状态、线程、程序的排程 (schedule) 、程序的 signle 等 97 | * lib 函式库 98 | * mm 内存单元有关的各项数据 99 | * net 与网络有关的各项协议数据,还有防火墙模块 100 | * sound 音效有关的各项模块2 内核模块的相依性: depmod 101 | 102 | ### moudules.dep 文件 103 | 104 | ```shell 105 | [root@rhel6 etc]# head /lib/modules/$(uname -r)/modules.dep 106 | kernel/arch/x86/kernel/cpu/mcheck/mce-inject.ko: 107 | kernel/arch/x86/kernel/cpu/cpufreq/powernow-k8.ko: kernel/drivers/cpufreq/freq_table.ko 108 | kernel/arch/x86/kernel/cpu/cpufreq/mperf.ko 109 | kernel/arch/x86/kernel/cpu/cpufreq/mperf.ko: 110 | kernel/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.ko: kernel/drivers/cpufreq/freq_table.ko 111 | kernel/arch/x86/kernel/cpu/cpufreq/mperf.ko 112 | kernel/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.ko: 113 | kernel/arch/x86/kernel/cpu/cpufreq/speedstep-lib.ko: 114 | kernel/arch/x86/kernel/cpu/cpufreq/p4-clockmod.ko: kernel/drivers/cpufreq/freq_table.ko 115 | kernel/arch/x86/kernel/cpu/cpufreq/speedstep-lib.ko 116 | kernel/arch/x86/kernel/cpu/cpufreq/intel_pstate.ko: 117 | kernel/arch/x86/kernel/test_nx.ko: 118 | kernel/arch/x86/kernel/microcode.ko: 119 | ``` 120 | 121 | ### depmod 命令 122 | 123 | depmod [-Ane] 124 | 125 | 选项与参数 : 126 | 127 | * -A : 不加任何参数时 , depmod 会主动的去分析目前内核的模块 , 并且重新写入`/lib/modules/$(uname -r)/modules.dep` 当中更新。若加入 -A 参数时 , 则 depmod 会去搜寻比 modules.dep 内还要新的模块,若找到新模块则 128 | * -n : 不写入 modules.dep , 而是将结果输出到屏幕上 (standard out); 129 | * -e : 显示出目前已加载的不可执行的模块名称 130 | 131 | ### depmod 实验 132 | 133 | 假设已经做好一个网卡驱动程序 , 档名为 a.ko, 请更新内核的相依性。 134 | 135 | ```shell 136 | [root@rhel6 ~]# cp a.ko /lib/modules/2.6.32- 137 | 431.el6.x86_64/kernel/drivers/net 138 | [root@rhel6 ~]# depmod3 内核模块的观察: lsmod, modinfo 139 | ``` 140 | 141 | ### lsmod 命令 142 | 143 | 作用:显示出目前已经存在于内核当中的模块 , 显示的内容包括 : 144 | 1. 模块名称 (Module); 145 | 2. 模块的大小 (size); 146 | 3. 此模块是否被其他模块所使用 (Used by) 。 147 | 148 | ### modinfo 命令 149 | 150 | 用法: 151 | 152 | 153 | modinfo [-adln] [module_name|filename] 154 | 155 | 选项与参数 : 156 | * -a : 仅列出作者名称 ; 157 | * -d : 仅列出该 modules 的说明 (description); 158 | * -l : 仅列出授权 (license); 159 | * -n : 仅列出该模块的详细路径。 160 | 161 | ### 内核模块的观察实验 162 | 163 | 首先查看目前已存在于内核中的模块,随便选择一个模块并查看该模块的详细信息。 164 | 165 | ```shell 166 | [root@rhel6 ~]# [root@rhel6 ~]# lsmod 167 | Module 168 | Size 169 | Used by 170 | autofs4 26513 3 171 | 8021q 25349 0 172 | garp 173 | 7152 174 | 1 8021q 175 | [root@rhel6 ~]# modinfo autofs4 176 | filename: 177 | /lib/modules/2.6.32- 178 | 431.el6.x86_64/kernel/fs/autofs4/autofs4.ko 179 | license: GPL 180 | srcversion: 948FC9C8D4043379272927C 181 | depends: 182 | vermagic: 183 | 2.6.32-431.el6.x86_64 SMP mod_unload modversions 184 | ``` 185 | 186 | ## 内核模块的加载与移除:insmod, modprobe, rmmod 187 | 188 | 189 | modprobe 加载模块会主动去搜寻 modules.dep 的内容 , 先解决模块的相依性后 , 再决定需要加载的模块有哪些,很方便; insmod 则完全由使用者自行加载一个完整文件名的模块 , 不会主动分析模块相依性 190 | 191 | ### insmod 命令 192 | 193 | insmod [/full/path/module_name] [parameters] 194 | 195 | ### modprobe 命令 196 | 197 | modprobe [-lcfr] module_name 198 | 199 | 选项与参数 : 200 | * -c : 列出目前系统所有的模块 !( 更详细的代号对应表 ) 201 | * -l : 列出目前在 /lib/modules/`uname -r`/kernel 当中的所有模块完整文件 名 ; 202 | * -f : 强制加载该模块 ; 203 | * -r : 类似 rmmod , 移除某个模块 204 | 205 | 206 | ### rmmod 命令 207 | 208 | rmmod [-fw] module_name 209 | 210 | 选项与参数 : 211 | * -f : 强制将该模块移除掉 , 不管是否正被使用 ; 212 | * -w : 若该模块正被使用 , 则等该模块被使用完毕后 , 再移除 213 | 214 | 215 | ### 内核模块的加载与移除实验 216 | 217 | 加载模块;查看该模块是否已成功加载,并查看详细信息;移除该模块。 218 | 219 | ```shell 220 | [root@rhel6 net]# modprobe dnet 221 | [root@rhel6 net]# modinfo dnet 222 | filename: 223 | /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/dnet.ko 224 | author: 225 | Ilya Yanok , Matteo Vit 226 | description: Dave DNET Ethernet driver 227 | license: 228 | GPL 229 | srcversion: 9D532980E04E93088A9DFC1 230 | depends: 231 | vermagic: 232 | 2.6.32-431.el6.x86_64 SMP mod_unload modversions 233 | [root@rhel6 net]# lsmod | grep dnet 234 | dnet 235 | 16103 0 236 | [root@rhel6 net]# rmmod dnet 237 | [root@rhel6 net]# lsmod | grep dnet 238 | ``` 239 | 240 | ## 内核模块的额外参数设定:/etc/modprobe.d/*.conf 241 | 242 | ```shell 243 | [root@rhel6 ~]# ls /etc/modprobe.d/ 244 | anaconda.conf dist-alsa.conf dist-oss.conf 245 | blacklist.conf dist.conf 246 | openfwwf.conf 247 | [root@rhel6 ~]# cat /etc/modprobe.d/dist.conf 248 | # default modutils aliases 249 | alias binfmt-204 binfmt_aout 250 | alias binfmt-263 binfmt_aout 251 | alias binfmt-264 binfmt_aout 252 | alias binfmt-267 binfmt_aout 253 | alias binfmt-387 binfmt_aout 254 | alias block-major-1-* rd 255 | alias block-major-3-* ide-probe-mod 256 | alias block-major-8-* sd_mod 257 | alias block-major-9-* md 258 | alias block-major-11-* sr_mod 259 | alias block-major-13-* xd 260 | alias block-major-15-* cdu31a 261 | alias block-major-16-* gscd 262 | alias block-major-17-* optcd 263 | alias block-major-18-* sjcd 264 | alias block-major-20-* mcdx 265 | alias block-major-22-* ide-probe-mod 266 | alias block-major-23-* mcd 267 | alias block-major-24-* sonycd535 268 | alias block-major-25-* sbpcd 269 | alias block-major-26-* sbpcd 270 | alias block-major-27-* sbpcd 271 | alias block-major-29-* aztcd 272 | alias block-major-32-* cm206 273 | alias block-major-33-* ide-probe-mod 274 | alias block-major-34-* ide-probe-mod 275 | alias block-major-37-* ide-tape 276 | alias block-major-44-* ftl 277 | alias block-major-46-* pcd 278 | alias block-major-47-* pf 279 | ``` 280 | 281 | ## 内核升级 282 | 283 | ### 源码编译 284 | 285 | Linux 内核官网 https://www.kernel.org/ 提供的是源码,需要编译使用。 286 | 287 | ![44](pic/44.png) 288 | 289 | Linux 内核版本有两种 : 稳定版和开发版 ,Linux 内核版本号由 3 个数字组成 :r.x.y 290 | * r: 主版本号 291 | * x: 次版本号 , 偶数表示稳定版本 ; 奇数表示开发中版本。 292 | * y: 修订版本号 , 表示修改的次数 293 | 294 | 去 http://www.kernel.org 首页 , 可以看到有 stable, longterm 等版本 ,longterm 是比stable 更稳定的版本 , 会长时间更新。 295 | 296 | 源码编译不做要求。 297 | 298 | ### rpm 包安装 299 | 300 | 在工作中应该去操作系统的发行公司的官网下载已经编译好的内核。我们使用的是红帽的,那么就去红帽的官网 https://www.redhat.com/en/global/china 301 | 302 | 这里使用一个免费的源 ELRepo 源 303 | 304 | ![45](pic/45.png) 305 | 306 | #### rhel6.5 内核升级 —— yum 方式(有网) 307 | 308 | 在 yum 的 ELRepo 源中 , 选择 kernel-lt-3.10.102-1.el6.elrepo.x86_64.rpm 这个版 309 | 本。 310 | 311 | ![46](pic/46.png) 312 | 313 | 重新启动后的 grub 界面 314 | 315 | ![47](pic/47.png) 316 | 317 | ```shell 318 | [#1#root@rhel6 ~]#uname -r 319 | 3.10.102-1.el6.elrepo.x86_64 320 | ``` 321 | 322 | #### rhel7.2 内核升级 —— 本地 rpm 安装(没网) 323 | 324 | 此处是在 http://rpm.pbone.net 上下载的,实际工作中应该到红帽官网下载。 325 | 326 | ![48](pic/48.png) 327 | 328 | ```shell 329 | [root@rhel7 ~]# ls 330 | anaconda-ks.cfg Downloads 331 | Music Templates 332 | Desktop 333 | initial-setup-ks.cfg 334 | Pictures Videos 335 | Documents 336 | kernel-lt-3.10.102-1.el6.elrepo.x86_64.rpm Public 337 | ``` 338 | 查看但前系统内核版本 339 | 340 | ```shell 341 | [root@rhel7 ~]# uname -r 342 | 3.10.0-123.el7.x86_64 343 | ``` 344 | 345 | 安装新内核并保留原内核 346 | 347 | ```shell 348 | [root@rhel7 ~]# rpm -ivh kernel-lt-3.10.102-1.el6.elrepo.x86_64.rpm 349 | Preparing... 350 | ################################# [100%] 351 | Updating / installing... 352 | 1:kernel-lt-3.10.102-1.el6.elrepo ################################# [100%] 353 | [root@rhel7 ~]# cd /boot/grub2/ 354 | [root@rhel7 grub2]# ll /etc/grub2.cfg 355 | lrwxrwxrwx. 1 root root 22 Jul 2 2015 /etc/grub2.cfg -> ../boot/grub2/grub.cfg 356 | ``` 357 | 358 | 查看当前默认启动内核 359 | 360 | ```shell 361 | [root@rhel7 grub2]# grub2-editenv list 362 | saved_entry=Red Hat Enterprise Linux Linux, with Linux 3.10.0-123.el7.x86_64 363 | ``` 364 | 365 | 查看配置文件中有几个启动项 366 | 367 | ```shell 368 | [root@rhel7 grub2]# grep "menuentry" /boot/grub2/grub.cfg 369 | if [ x"${feature_menuentry_id}" = xy ]; then 370 | menuentry_id_option="--id" 371 | menuentry_id_option="" 372 | export menuentry_id_option 373 | menuentry 'Red Hat Enterprise Linux Server (3.10.102-1.el6.elrepo.x86_64) 7.0 (Maipo)' --class red 374 | --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0- 375 | 123.el7.x86_64-advanced-5220f38d-edd6-45e5-a257-f1e9e6c80b4e' { 376 | menuentry 'Red Hat Enterprise Linux Server, with Linux 3.10.0-123.el7.x86_64' --class red --class 377 | gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0- 378 | 123.el7.x86_64-advanced-5220f38d-edd6-45e5-a257-f1e9e6c80b4e' { 379 | menuentry 'Red Hat Enterprise Linux Server, with Linux 0-rescue-14d17f362db9498eaa56aac326570c37' --class red --class gnu-linux --class gnu --class os 380 | --unrestricted $menuentry_id_option 'gnulinux-0-rescue-14d17f362db9498eaa56aac326570c37- 381 | advanced-5220f38d-edd6-45e5-a257-f1e9e6c80b4e' { 382 | ``` 383 | 384 | 设置默认启动内核 385 | 386 | ```shell 387 | [root@rhel7 grub2]# grub2-set-default 'Red Hat Enterprise Linux Server (3.10.102- 388 | 1.el6.elrepo.x86_64) 7.0 (Maipo)' 389 | ``` 390 | 391 | 查看当前默认启动内核 392 | 393 | ```shell 394 | [root@rhel7 grub2]# grub2-editenv list 395 | saved_entry=Red Hat Enterprise Linux Server (3.10.102-1.el6.elrepo.x86_64) 7.0 (Maipo) 396 | ``` 397 | 398 | 更新一下配置 , 让新的内核启动生效 399 | 400 | ```shell 401 | [root@rhel7 grub2]# grub2-mkconfig -o /boot/grub2/grub.cfg 402 | Generating grub configuration file ... 403 | Found linux image: /boot/vmlinuz-3.10.102-1.el6.elrepo.x86_64 404 | Found initrd image: /boot/initramfs-3.10.102-1.el6.elrepo.x86_64.img 405 | Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64 406 | Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img 407 | Found linux image: /boot/vmlinuz-0-rescue-14d17f362db9498eaa56aac326570c37 408 | Found initrd image: /boot/initramfs-0-rescue-14d17f362db9498eaa56aac326570c37.img 409 | done 410 | ``` 411 | 412 | 重新启动 413 | 414 | ```shell 415 | [root@rhel7 grub2]# reboot 416 | ``` 417 | 418 | 查看当前内核版本 419 | 420 | ```shell 421 | [root@rhel7 ~]# uname -r 422 | 3.10.102-1.el6.elrepo.x86_64 423 | ``` 424 | 425 | ## Linux 内核作业 426 | 1. 到共享当中下载 linux 内核 kernel-lt-3.10.102-1.el6.elrepo.x86_64.rpm 427 | 2. rhel6.5 进行内核升级,保留原内核 428 | 3. rhel7.2 进行内核升级,保留原内核 429 | -------------------------------------------------------------------------------- /08-日志和计划任务.md: -------------------------------------------------------------------------------- 1 | # 日志和计划任务 2 | 3 | [TOC] 4 | 5 | 6 | ## 日志 7 | 8 | ### 日志的作用 9 | 10 | * 解决系统方面的错误 11 | * 解决网络服务的问题 12 | * 过往事件记录 13 | 14 | ### 常用的日志 15 | 16 | |日志|解释| 17 | |:--|:--| 18 | |/var/log/cron |crontab 计划任务| 19 | |/var/log/dmesg |开机核心侦测信息| 20 | |/var/log/lastlog |系统所有帐号最近一次登陆信息| 21 | |/var/log/maillog |邮件往来信息| 22 | |/var/log/messages |系统错误信息| 23 | |/var/log/secure |涉及输入帐号密码的程序| 24 | |/var/log/wtmp |正确登陆系统的账户信息| 25 | |/var/log/btmp |错误登陆系统的账户信息| 26 | |/var/log/httpd/*|| 27 | |/var/log/samba/* |不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项信息| 28 | 29 | 30 | ### 日志的类型 31 | 32 | 33 | 1> 可查看的 ASCII 的日志 34 | 35 | • messages 36 | 37 | • 与程序同名的目录下, 会记录和该程序相关的一些日志 38 | 39 | 2> 不可查看的 data 日志 40 | 41 | 需要调用某些命令才能去查看对应的日志 42 | 43 | • wtmp <==last: 系统登陆登出信息 44 | 45 | • btmp <==lastb: 错误的系统登陆登出情况 46 | 47 | ```shell 48 | [#3#root@rhel6 ~]#file /var/log/wtmp 49 | /var/log/wtmp: data 50 | ``` 51 | 52 | ### 日志需要的服务和程序 53 | 54 | rsyslogd 主要负责记录系统运作中 , kernel 或应用程序产生的各种讯息 , 讯息被写入系统日志 55 | 56 | logrotate 主要在进行日志文件的轮替功能 57 | 58 | * rhel5 版本以前是 syslogd 服务 , rhel6 之后是 rsyslogd 服务 ( reliable and extended 可靠的和拓展的 59 | syslogd 服务 ) 60 | 61 | 『 (1) 什么服务 (2) 什么等级信息 (3) 需要被记录在哪里 ( 设备或文件 ) 』 62 | 63 | 64 | ### rsyslog 的相关配置文件 65 | 66 | • /etc/rsyslog.conf 67 | 68 | • /etc/rsyslog.d/* 69 | 70 | ### /etc/rsyslog.conf 71 | 72 | /etc/rsyslog.conf 文件中的一项配置记录由 “ 选项 ” (selector) 和 “ 动作 ” (action)两个部分组成,两 73 | 者间用 tab 制表符进行分隔(使用空格间隔是无效的)。 74 | 75 | “ 选项 ” ( selector)由两部分组成: 76 | * 设施 facility 和级别 loglevel,由点号.分隔,两部分都是大小写不敏感; 77 | * 设施和级别都在 syslog(3)中有描述。各保留字段间用分号分隔。 78 | * 如下行所示: 79 | 80 | 设施. 级别 [;设施.级别]TAB 动作 81 | 82 | #### 设施 facility 83 | 84 | 保留字段中的 “ 设施 ” (facility )代表信息产生的源头,可以是: 85 | 86 | |facility|设施| 87 | |:--|:--| 88 | |auth| 认证系统,即询问用户名和口令| 89 | |cron |系统定时系统执行定时任务时发出的信息| 90 | |daemon| 某些系统的守护程序的 syslog,如由 in.ftpd 产生的 log| 91 | |kern |内核的 syslog 信息| 92 | |lpr |打印机的 syslog 信息| 93 | |mail |邮件系统的 syslog 信息| 94 | |mark |定时发送消息的时标程序| 95 | |news |新闻系统的 syslog 信息| 96 | |user |本地用户应用程序的 syslog 信息| 97 | |uucp |uucp 子系统的 syslog 信息,unix to unix copy, unix 主机之间相关的通讯| 98 | |local0-7| 种本地类型的 syslog 信息,这些信息可以又用户来定义| 99 | |*| 代表以上各种设备| 100 | 101 | #### 级别 loglevel 102 | 103 | 保留字段中的 “ 级别 ” 代表信息的重要性,可以是: 104 | 105 | |num|loglevel|级别| 106 | |:--|:--|:--| 107 | |0|emerg| 紧急,处于 Panic 状态。通常应广播到所有用户;几乎要当机| 108 | |1|alert |告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;| 109 | |2|crit |关键状态的警告。例如,硬件故障;| 110 | |3|err |其它错误;| 111 | |4|warn| 警告;| 112 | |5|notice| 注意;非错误状态的报告,但应特别处理;| 113 | |6|info |通报信息;| 114 | |7|debug| 调试程序时的信息;| 115 | ||none |通常调试程序时用,指示带有 none 级别的类型产生的信息无需送出。如| 116 | ||*.debug;mail.none| 表示调试时除邮件信息外其它信息都送出。| 117 | ||.xxx: |表示大于等于 xxx 级别的信息| 118 | ||.=xxx:|表示等于 xxx 级别的信息| 119 | ||.!xxx:|表示在 xxx 之外的等级的信息拓展:| 120 | 121 | ```shell 122 | [#19#root@rhel6 ~]#man syslog 123 | ``` 124 | 125 | #### 动作 action 126 | 127 | “ 动作 ” 域指示信息发送的目的地。可以是: 128 | 129 | |action|动作| 130 | |:-|:-| 131 | |/filename|日志文件。由绝对路径指出的文件名,此文件必须事先建立;| 132 | |@host|远程主机; @符号后面可以是 ip,也可以是域名,默认在/etc/hosts 文件下 loghost 这个别名已经指定给了本机。| 133 | |user1,user2| 指定用户。如果指定用户已登录,那么他们将收到信息;| 134 | |*|所有用户。所有已登录的用户都将收到信息。| 135 | 136 | 137 | #### 示例 138 | 139 | 1. 记录到普通文件或设备文件 140 | ```shell 141 | *.* /var/log/file.log 142 | *.* /dev/pts/0 143 | ``` 144 | 145 | 测试: logger -p local3.info ‘KadeFor is testing the rsyslog and logger ‘ 146 | 147 | logger 命令用于产生日志 148 | 149 | 2. 转发到远程 150 | ```shell 151 | *.* @192.168.0.1 # 使用 UDP 协议转发到 192.168.0.1 的 514(默认)端口 152 | *.* @@192.168.0.1:10514 # 使用 TCP 协议转发到 192.168.0.1 的 10514(默认)端口 153 | ``` 154 | 155 | 3. 发送给用户(需要在线才能收到) 156 | ```shel 157 | *.* root 158 | *.* root,kadefor,up01 159 | *.* * 160 | ``` 161 | * 使用,号分隔多个用户 162 | * *号表示所有在线用户 163 | 164 | 4. 忽略,丢弃 165 | ```shell 166 | local3.* # 忽略所有 local3 类型的所有级别的日志 167 | ``` 168 | 5. 执行脚本 169 | ```shell 170 | local3.* ^/tmp/a.sh 171 | ``` 172 | * ^号后跟可执行脚本或程序的绝对路径 173 | 174 | 6. 一个标准的简单的配置文件 175 | ```shell 176 | #### RULES #### 177 | 规则部分 178 | # Log all kernel messages to the console. 179 | # Logging much else clutters up the screen. 180 | #kern.* 181 | /dev/console 182 | #关于内核的所有日志都放到/dev/console(控制台) 183 | # Log anything (except mail) of level info or higher. 184 | # Don't log private authentication messages! 185 | *.info;mail.none;authpriv.none;cron.none 186 | /var/log/messages 187 | # 记录所有日志类型的 info 级别以及大于 info 级别的信息到/var/log/messages,但是 mail 188 | 邮件信息,authpriv 验证方面的信息和 cron 时间任务相关的信息除外 189 | # The authpriv file has restricted access. 190 | authpriv.* 191 | /var/log/secure 192 | # authpriv 验证相关的所有信息存放在/var/log/secure 193 | # Log all the mail messages in one place. 194 | mail.* 195 | -/var/log/maillog 196 | # 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是使用异步的方式记录, 197 | 因为日志一般会比较大 198 | # Log cron stuff 199 | cron.* 200 | /var/log/cron 201 | # 计划任务有关的信息存放在/var/log/cron 202 | # Everybody gets emergency messages 203 | *.emerg 204 | * 205 | # 所有日志类型的 emerg 信息发给所有用户 206 | # Save news errors of level crit and higher in a special file. 207 | uucp,news.crit 208 | /var/log/spooler 209 | # 记录 uucp,news.crit 等存放在/var/log/spooler 210 | # Save boot messages also to boot.log 211 | local7.* 212 | /var/log/boot.log 213 | # 启动的相关信息存放在/var/log/boot.log 214 | ``` 215 | 216 | ### 重启服务 217 | 218 | service rsyslog restart <==rhel6 219 | 220 | systermctl restart rsyslog <==rhel7 221 | 222 | ps : rsyslog 的日志只要『被编辑过』就无法继续记录 ! 需要重启日志恢复。 223 | 224 | ## logrotate 日志轮询 225 | 226 | /usr/sbin/logrotate 将旧的日志文件移动成旧文件, 并重新建立一个新的空的档案来记录 227 | 228 | /etc/cron.daily/logrotate 记录每天要进行的日志轮替的行为 229 | 230 | /etc/logrotate.conf 231 | 232 | /etc/logrotate.d/* 233 | 234 | 程序的配置文件 235 | 236 | ```shell 237 | [#14#root@rhel6 ~]#grep -v "^#" /etc/logrotate.conf|grep -v "^$" 238 | weekly 239 | rotate 4 240 | create 241 | dateext 242 | include /etc/logrotate.d 243 | /var/log/wtmp { 244 | monthly 245 | create 0664 root utmp 246 | minsize 1M 247 | rotate 1 248 | } 249 | /var/log/btmp { 250 | missingok 251 | monthly 252 | create 0600 root utmp 253 | rotate 1 254 | } 255 | ``` 256 | 257 | 可以通过 `man logrotate` 来查看更多的一些定义。 258 | 259 | ### 参数和功能 260 | 261 | compress 通过 gzip 压缩转储以后的日志 262 | 263 | nocompress 不需要压缩时,用这个参数 264 | 265 | copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 266 | 267 | nocopytruncate 备份日志文件但是不截断 268 | 269 | create mode owner group 转储文件,使用指定的文件模式创建新的日志文件 270 | 271 | nocreate 不建立新的日志文件 272 | 273 | delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 274 | 275 | nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 276 | 277 | errors errors 转储时的错误信息发送到指定的 Email 地址 278 | 279 | ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。 280 | 281 | notifempty 如果是空文件的话,不转储 282 | 283 | mail address 把转储的日志文件发送到指定的 E-mail 地址 284 | 285 | nomail 转储时不发送日志文件 286 | 287 | olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 288 | 289 | noolddir 转储后的日志文件和当前日志文件放在同一个目录下 290 | 291 | prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行 292 | 293 | postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行 294 | 295 | daily 指定转储周期为每天 296 | 297 | weekly 指定转储周期为每周 298 | 299 | monthly 指定转储周期为每月 300 | 301 | rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份 302 | 303 | tabootext [+] list 让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 304 | 305 | size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及 KB (sizek)或者 MB (sizem). 306 | 307 | ### 实验 308 | 309 | 要求: 310 | 311 | 1. 记录所有日志类型的 info 级别以及大于 info 级别的信息,保存到/var/log/test,但是 mail 312 | 邮件信息,authpriv 验证方面的信息和 cron 时间任务相关的信息除外 313 | 2. /var/log/test 日志轮询方式为: 314 | 315 | • 每天轮询一次; 316 | 317 | • 保留 4 个文件; 318 | 319 | • 以时间命名; 320 | 321 | • 创建与原日志同名的新文件。 322 | 323 | 第一步:修改 rsyslog 的配置文件/etc/rsyslog.conf 324 | 325 | `*.info;mail.none;authpriv.none;cron.none` 326 | 327 | 第二步:创建空文件/var/log/test 328 | 329 | `touch /var/log/test` 330 | 331 | 第三步:重新启动服务 332 | 333 | `service rsyslog restart` 334 | 335 | 第四步:修改 logrotate 配置文件/etc/logrotate.conf 336 | ```shell 337 | /var/log/test { <== 轮循的日志是谁 338 | daily <== 轮询周期多久 339 | rotate 4 <== 保留几个带时间戳的文件 340 | dateext <== 是否以时间戳为文件更名格式 341 | create <== 是否需要创建一个与原日志文件同名的新文件 342 | ``` 343 | 第五步:测试 `logrotate -vf /etc/logrotate.conf` 344 | 345 | ```shell 346 | [#41#root@rhel6 ~]#logrotate -vf /etc/logrotate.conf 347 | [#42#root@rhel6 ~]#ls /var/log/|grep test 348 | test 349 | test-20160630 350 | /var/log/test 351 | ``` 352 | --- 353 | ## 计划任务 354 | 355 | 356 | 每个人或多火烧都有一些约会或者是工作,有的工作是例行性的, 例如每年一次的加薪、每个月一次 的工作报告、每周一次的午餐会报、每天需要的打卡等等; 有的工作则是临时发生的, 例如刚好总公 司有高官来访,需要你准备演示器材等等! 用在生活上面, 例如每年的爱人的生日、每天的起床时间 等等、还有突发性的计算机大降价 (啊!真希望天天都有!) 等等啰。 357 | 358 | 像上面这些例行性工作,通常你得要记录在日历上面才能避免忘记!不过, 由于我们常常在计算机前 面的缘故,如果计算机系统能够主动的通知我们的话,那么不就轻松多了!嘿嘿! 这个时候 Linux 的 计划任务就可以派上场了! 例如: 每一天早上 8:00 钟要服务器连接上音响,并自动播放音乐来唤你起床; 而中午 12:00 希望 Linux 可以发一封信到你的邮件信箱,提醒你可以去吃午餐了; 另外, 在每年的你爱人生 日的前一天,先发封信提醒你, 以免忘记这么重要的一天。 359 | 360 | 那么 Linux 的例行性工作是如何进行计划任务的呢? 咱 们的 Linux 是透过 crontab 和 at 这两个东西!这两个玩意儿有啥异同?就让我们来瞧瞧先! 361 | 362 | 363 | ||一次性计划任务| 周期性计划任务| 364 | |:--|:--|:-- 365 | |软件| at-3.1.10-43.el6_2.1.x86_64| cronie-1.4.4-12.el6.x86_64| 366 | |服务| atd |crond| 367 | |命令| at |crontab| 368 | |服务存放文件| /etc/init.d/atd |/etc/init.d/crond| 369 | |系统配置文件| /etc/at.deny |/etc/cron.deny /etc/cron.d/*| 370 | |程序缓存文件| /var/spool/at| /var/spool/cron/* /var/log/cron| 371 | 372 | ### at 373 | 374 | 当执行 at 程序并在终端输入命令后, 首先系统会到配置文件中寻找 at 相关的文档 375 | 376 | * /etc/at.allow <== 记录了允许使用 at 命令的用户名 377 | * /etc/at.deny <== 记录了不允许使用 at 命令的用户名 378 | 379 | 若以上两个文件都没有, 则系统默认只有 root 可以使用 at 380 | 381 | 输入的内容将被保存到以下目录中 /var/spool/at/* 382 | 383 | 384 | #### 服务的启动命令 385 | 386 | rhel6 387 | 388 | service atd start 启动 389 | 390 | service atd restart 重启 391 | 392 | service atd status 查看 393 | 394 | rhel7 395 | 396 | systermctl start atd 397 | 398 | systermctl restart atd 399 | 400 | systermctl status atd 401 | 402 | #### at 命令的用法 403 | 404 | ```shell 405 | at [-mldv] TIME 406 | 407 | at -c 工作号码 408 | 409 | 选项与参数 : 410 | 411 | -m 当 at 工作完成后 , 即使没有输出讯息 , 亦以 email 通知使用者该工作已完成。 412 | -l at -l =atq, 列出目前系统上面的所有该用户的 at 计划任务 ; 413 | -d at -d =atrm , 可以取消一个在 at 计划任务中的工作 ; 414 | -v 可以使用较明显的时间格式显出 at 计划任务中的任务列表 ; 415 | -c 可以列出后面接的该项工作的实际指令内容。 416 | ``` 417 | 418 | #### 范例 419 | 420 | 1. 再过五分钟后, 将 /root/.bashrc 寄给 root 自己 421 | 2. 查看 at 计划任务中的工作 422 | 3. 查看该计划任务的实际指令内容 423 | ```shell 424 | [#60#root@rhel6 ~]#at now + 5 minutes 425 | at> /bin/mail root -s "testing at job" < /root/.bashrc 426 | at> 427 | job 1 at 2016-06-30 00:40 428 | [#61#root@rhel6 ~]#at -l 429 | 1 430 | 2016-06-30 00:40 a root 431 | [#62#root@rhel6 ~]#date 432 | Thu Jun 30 00:37:21 CST 2016 433 | [#63#root@rhel6 ~]#at -c 1 434 | #!/bin/sh 435 | # atrun uid=0 gid=0 436 | # mail root 0 437 | umask 22 438 | ......... 439 | 此处省略 440 | OLDPWD=/var/log; export OLDPWD 441 | cd /root || { 442 | echo 'Execution directory inaccessible' >&2 443 | exit 1 444 | } 445 | ${SHELL:-/bin/sh} << 'marcinDELIMITER00a5c603' 446 | /bin/mail root -s "testing at job" < /root/.bashrc 447 | marcinDELIMITER00a5c6034. 2016 年 10 月 20 日 12:00 广播一条信息 “ Happy birthday to me!”;取消该计划任务。 448 | [#68#root@rhel6 ~]#at 12:00 2016-10-20 449 | at> echo "Happy birthday to me!"|wall 450 | at> 451 | job 2 at 2016-10-20 12:00 452 | [#69#root@rhel6 ~]#atq 453 | 2 454 | 2016-10-20 12:00 a root 455 | [#70#root@rhel6 ~]#at -l 456 | 2 457 | 2016-10-20 12:00 a root 458 | [#71#root@rhel6 ~]#at -d 2 459 | [#72#root@rhel6 ~]#atq 460 | ``` 461 | 5. 由于机房预计划 2016/07/18 停电, 我想要在 2016/07/17 23:00 关机? 462 | ```shell 463 | [#73#root@rhel6 ~]#at 23:00 2016-07-17 464 | at> shutdown -h now 465 | at> 466 | job 3 at 2016-07-17 23:00 467 | [#74#root@rhel6 ~]#atq 468 | 3 469 | 2016-07-17 23:00 a root 470 | ``` 471 | 472 | ### crontab 473 | 474 | #### crontab 服务的启动命令 475 | 476 | rhel6 477 | 478 | service crond start 启动 479 | 480 | service crond restart 重启 481 | 482 | service crond status 查看 483 | 484 | rhel7 485 | 486 | systermctl start crond 487 | 488 | systermctl restart crond 489 | 490 | systermctl status crond 491 | 492 | #### crontab 命令的用法 493 | 494 | ```shell 495 | crontab [-u username] [-l|-e|-r] 496 | 497 | 选项与参数 : 498 | -u 只有 root 使用 , 亦即帮其他使用者建立 / 移除 crontab 计划任务; 499 | -e 编辑 crontab 工作内容 500 | -l 查阅 crontab 工作内容 501 | -r 移除所有 crontab 的工作内容 , 若仅要移除一项 , 请用 -e 去编辑 502 | ``` 503 | 504 | crontab -e 编辑的格式说明: 505 | 506 | |代表意义 |分钟|小时|日期|月份|周| 507 | |:--|:--|:--|:--|:--|:--| 508 | |数字范围| 0-59| 0-23| 1-31| 1-12| 0-7| 509 | 510 | |特殊字| 代表意义| 511 | |:--|:--| 512 | |*( 星号 ) |代表任何时刻| 513 | |,( 逗号 ) |代表分隔时段| 514 | |-( 减号 ) |代表一段时间范围| 515 | |/n( 斜线 )| n 代表数字 , 『每隔 n 单位间隔』 , 例如每五分钟进行一次| 516 | 517 | `man 5 crontab` 查看具体用法帮助 518 | 519 | #### 范例 520 | 521 | 1. student 每天 12 点发广播给自己提醒要吃饭拉! 522 | ```shell 523 | crontab -e 524 | vi 编辑画面 每项工作都是一行。 525 | 0 12 * * * echo “Lunch time!!!!”|wall 526 | 分 时 日 月 周 |<======= 命令 ===========| 527 | ``` 528 | 2. 每个月的第一天下午 2 点 15 分,将/etc 目录打包压缩成/tmp/etc.tar.bz2 文件。 529 | ```shell 530 | 15 14 1 * * tar -jcf /tmp/etc.tar.bz2 /etc 531 | ``` 532 | 533 | 3. 周一到周五的晚上 10 点,将/var 目录打包压缩成/tmp/var.tar.bz2 文件。 534 | ```shell 535 | 0 22 * * 1-5 tar -jcf /tmp/var.tar.bz2 /var 536 | ``` 537 | 4. 每天 0 点 23 分,2 点 23 分,4 点分...22 点 23 分,就输出 “ 休息一会 ” 到终端上。 538 | ```shell 539 | 23 0-23/2 * * * echo "have a rest" 540 | ``` 541 | 5. 每周日的 4 点 5 分提醒自己去跑步。 542 | ```shell 543 | 5 4 * * sun echo "run at 5 after 4 every sunday" 544 | ``` 545 | 546 | ## 日志和计划任务课后作业 547 | 548 | 1. 记录所有日志类型的 info 级别以及大于 info 级别的信息,保存到/var/log/test,但是 mail 邮件信息,authpriv 验证方面的信息和 cron 时间任务相关的信息除外 549 | 2. /var/log/test 日志轮询方式为: 550 | 551 | * 每周轮询一次; 552 | * 保留 6 个文件; 553 | * 以时间命名; 554 | * 创建与原日志同名的新文件。 555 | --- 556 | 3. 再过 10 分钟后, 将 /root/.bashrc 寄给 root 自己 557 | 4. 查看 at 计划任务中的工作 558 | 5. 查看该计划任务的实际指令内容 559 | 6. 由于机房预计划 2016/09/18 停电, 我想要在 2016/09/17 23:00 关 机? 560 | --- 561 | 1. student 每天上午 11:50 发广播给自己提醒要吃饭拉! 562 | 2. 每个月的第一天下午 5 点 30 分,将/etc 目录打包压缩成/tmp/etc.tar.bz2 文件。 563 | 3. 周一到周六的晚上 9 点,将/var 目录打包压缩成/tmp/var.tar.bz2 文件。 564 | 4. 每天 1 点 22 分,3 点 22 分,5 点 22 分...23 点 22 分,就输出 “ 休息一会 ” 到终端上。 565 | 5. 每周六的 6 点 20 分提醒自己去跑步。 566 | -------------------------------------------------------------------------------- /02-Linux用户和组.md: -------------------------------------------------------------------------------- 1 | # Linux用户和组 2 | 3 | 4 | [TOC] 5 | 6 | 7 | 8 | ## 课堂作业 9 | 10 | 1. 添加2个组,一个组名为justice,另外一个组名为ninja。 11 | 2. 添加4个新用户,分别为 superman、batman、wonderwoman、greenlantern,密码均为uplooking;其附加组为justice。 12 | 3. 添加4个新用户,分别为 leo、raph、mikey、don ,密码均为uplooking,其附加组为ninja。 13 | 4. mikey用户总是在系统里搞破坏,root决定封他的号,让他不能登陆。过了几天,再解封。 14 | 5. leo想加入justice,root同意了,将justice作为附加组添加给leo。 15 | 6. don整天搞创造,root要求他的密码要更安全,所以将他的密码设置成7天之后要换密码,并且密码过期前3天要提醒他,如果密码过期后2天还没有设置新密码,那么就封锁don账户。 16 | 7. batman总是喜欢修改密码,没事就在修改密码,而使用该batman账户的人有好几个,比如蝙蝠侠,蝙蝠侠的管家,蝙蝠侠的助手罗宾等等。所以root决定将batman账户的密码的最小存活期改为10天。也就是说10天之内batman账户不能修改密码。 17 | 8. leo想退出justice,root帮他设置一下。 18 | 9. superman想把密码改为uplooking123,让他自己改。发现改不了,密码太简单了,自己去想一个复杂的密码。 19 | 10. 让superman能够修改root用户的密码。 20 | 21 | ## 用户和组的相关文件 22 | 23 | | 文件名 | 作用 | 24 | | :------------------- | :---------------------------------- | 25 | | /etc/passwd | 系统中的账号信息 | 26 | | etc/shadow | 存放密码及其策略相关信息 | 27 | | /etc/group | 存放用户组的信息 | 28 | | /etc/gshadow | 存放用户组的密码及其策略相关信息 | 29 | | /etc/default/useradd | 创建新用户时默认的配置信息 | 30 | | /etc/skel/* | Directory containing default files. | 31 | | /etc/login.defs | 用户和组默认的配置信息 | 32 | | /etc/shells | 该文件记录着合法的 shell 版本 | 33 | 34 | ### /etc/passwd 35 | 36 | 每一行都代表一个账号 , 有几行就代表有几个账号在你的系统中 37 | 38 | 系统统账号: bin, daemon, adm, nobody 39 | 40 | 以“:”作为分隔符,七个字段 41 | 42 | `root:x:0:0:root:/root:/bin/bash` 43 | 44 | 1. 账号名称 :root 45 | 2. 密码 :X 46 | 3. UID: 使用者标识符 47 | rhel6 root_uid=0 sys_uid=1-499 user_uid=500-65535 ( 2^32-1 ) 48 | rhel7 root_uid=0 sys_uid=201-999 user_uid=1000-65535 49 | 4. GID: 用户组标识符 root_guid=0 50 | 5. 用户信息说明栏 51 | 6. 家目录 : 用户的家目录 root 的家目录在 /root, 默认用户的家目录在 /home/yourname 52 | 7. Shell: 命令解释器 53 | 54 | * 系统默认为 /bin/bash 55 | 56 | 57 | * /sbin/nologin 不可通过终端登录系统 58 | 59 | ### /etc/shadow 60 | 61 | 存放密码及其策略相关信息 62 | 63 | 以“:”作为分隔符九个字段 64 | 65 | `root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7:::` 66 | 67 | 1. 账号名称 :root 68 | 2. 密码 : 加密后的字符串,以\$N\$ 开头 69 | 3. 最近变更密码的日期 : 天数,以 1970 年 1 月 1 日作为 1 而累加的日期 70 | echo $(($(date --date="2008/09/04" +%s)/86400+1)) 71 | 14126 72 | 4. 密码不可被更改的天数 :0 : 表示密码随时可以更改, 20 :表示 距最近一次修改密码20 天之内都不能修改密码 73 | 5. 密码需要重新变更的天数 :99999 ( 计算为 273 年 ) 表示密码的变更没有强制性。 74 | 6. 密码需要变更期限前的警告天数 : 在密码到期之前几天提醒 75 | 7. 密码过期后的账号宽限时间 ( 密码失效日 ): 密码过期特性。 76 | 8. 账号失效日期 : 天数,以 1970 年 1 月 1 日作为 1 而累加的日期 77 | 9. 保留 : 保留段 78 | 79 | ### /etc/group 80 | 81 | 存放用户组的信息 82 | 83 | 每一行代表一个群组以“:”作为分隔符四个字段 84 | 85 | `root:x:0:root` 86 | 87 | 1. 组名 :root 88 | 2. 群组密码 :x 一般不设定,通常是给『群组管理员』使用 89 | 3. GID: 群组的 ID 90 | 4. 此群组支持的账号名称 : 一个账号可以加入多个群组 91 | 92 | 例如,将 dabao 加入 root 群组后 : 93 | ```config 94 | root:x:0:root,dmtsai 95 | ``` 96 | 97 | ### /etc/gshadow 98 | 99 | 存放用户组的密码及其策略相关信息 100 | 101 | 每一行代表一个群组 “: ” 作为分隔符四个字段 102 | 103 | `newgroup:!::redhat` 104 | 105 | 1. 组名 :newgroup 106 | 2. 密码栏 : 开头为 ! 表示无合法密码 , 所以无群组管理员 107 | 3. 群组管理员的账号 108 | 4. 此群组支持的账号名称 : 与 /etc/group 相同 109 | 110 | ### /etc/default/useradd 111 | 112 | 创建新用户时默认的配置信息 113 | ```shell 114 | GROUP=100 <== 预设的群组,现已不生效,如果创建用户时不指定群组,则使用与用户同名的群组 115 | HOME=/home <== 默认的家目录所在目录 116 | INACTIVE=-1 <== 密码失效日 , 在 shadow 第 7 栏 117 | EXPIRE= <== 账号失效日 , 在 shadow 第 8 栏 118 | SHELL=/bin/bash <== 预设的 shell /sbin/nologin 将无法登陆 119 | SKEL=/etc/skel<== 用户家目录的内容数据参考目录 120 | CREATE_MAIL_SPOOL=yes <== 是否主动帮助使用者建立邮件信箱 (mailbox) 121 | ``` 122 | 123 | 124 | ### /etc/skel/ 125 | 126 | Directory containing default files. 127 | 128 | .bash_logout .bash_profile .bashrc .gnome2 .mozilla 129 | 130 | ```shell 131 | [root@rhel7 skel]# ll -a /etc/skel 132 | total 40 133 | drwxr-xr-x. 4 root root 4096 Jan 2 01:58 . 134 | drwxr-xr-x. 125 root root 12288 Mar 21 03:09 .. 135 | -rw-r--r--. 1 root root 18 Jul 9 2013 .bash_logout 136 | -rw-r--r--. 1 root root 176 Jul 9 2013 .bash_profile 137 | -rw-r--r--. 1 root root 124 Jul 9 2013 .bashrc 138 | -rw-r--r--. 1 root root 500 May 7 2013 .emacs 139 | drwxr-xr-x. 2 root root 4096 Jul 14 2010 .gnome2 140 | drwxr-xr-x. 4 root root 4096 Jan 2 01:52 .mozilla 141 | ``` 142 | 143 | ### /etc/login.defs 144 | 默认的配置信息 rhel6 下的信息 145 | ```shell 146 | MAIL_DIR /var/spool/mail 用户默认邮件信箱放置目录 147 | PASS_MAX_DAYS 99999 /etc/shadow 第 5 栏 , 密码需要重新变更的天数 148 | PASS_MIN_DAYS 0 /etc/shadow 第 4 栏 , 密码不可被更动的天数 149 | PASS_MIN_LEN 5 密码最短的字符长度 , 已被 pam 模块取代 , 失去效用 ! 150 | PASS_WARN_AGE 7 /etc/shadow 第 6 栏 , 过期前会警告天数 151 | UID_MIN 500 使用者最小的 UID 不能 <500 152 | UID_MAX 60000 使用者最大的 UID 不能 >60000 153 | GID_MIN 500 自定义组最小的 UID 不能 <500 154 | GID_MAX 60000 自定义组最大的 UID 不能 >60000 155 | CREATE_HOME yes 在 username 命令不加 -M 及 -m 时 , 是否主动建立用户家目录 156 | UMASK 077 用户家目录建立的 umask , 因此权限会是 700 『 drwx------ 』 157 | USERGROUPS_ENAB yes 使用 userdel 时 , 是否会删除初始群组(如果使用 userdel 去删除一个账号时 , 该账号所属的初始群组已经没有人隶属于该群组了 , 那举就删掉该群组) 158 | ENCRYPT_METHOD SHA512 经过 SHA512 进行加密处理 159 | ``` 160 | 161 | ### /etc/shells 162 | 163 | 该文件记录着合法的 shell 版本 164 | ```shell 165 | [root@rhel7 skel]# cat /etc/shells 166 | /bin/sh 167 | /bin/bash 168 | /sbin/nologin 169 | /bin/dash 170 | /bin/tcsh 171 | /bin/csh 172 | ``` 173 | 174 | ## 用户和组的相关命令 175 | 176 | | 用户和组 | | 177 | | :------------ | :--------------------------------------- | 178 | | 新建组 | groupadd | 179 | | 新建用户 | useradd | 180 | | 修改密码 | passwd 密码 >8 位字符、小写 / 大写 / 数字 / 特殊符号之间任选 3 位 | 181 | | 修改用户属性 | usermod | 182 | | 修改组属性 | groupmod | 183 | | 修改密码属性 | chage | 184 | | 修改 shell | chsh | 185 | | 删除用户 | userdel | 186 | | 删除组 | groupdel | 187 | | 查看已存在用户的基本信息 | id | 188 | | 查看当前用户支持的群组信息 | groups | 189 | 190 | 通过文件查看 191 | ```shell 192 | /etc/passwd 193 | /etc/shadow 194 | /etc/group 195 | /etc/gshadow 196 | ``` 197 | 198 | ### 新建用户和组 199 | 200 | #### groupadd 201 | 202 | ```shell 203 | groupadd 创建组 204 | -g, --gid GID 205 | -r, --system Create a system group 206 | 207 | 新建组 test 制定 gid 为 888 208 | [root@rhel7 ~]# groupadd -g 888 test 209 | 新建一个系统组 baby 210 | [root@rhel7 ~]# groupadd -r baby 211 | 查看一下刚刚新建的组的信息 212 | [root@rhel7 ~]# tail -n 2 /etc/group 213 | test:x:888: 214 | baby:x:490: 215 | ``` 216 | 217 | #### useradd 218 | ```shell 219 | 创建新用户 220 | useradd [-u UID] [-g 初始群组 ] [-G 次要群组 ] [-mM] [-c 说明栏 ] [-d 家目录绝对路径 ] [-s shell] 账号名 221 | 拓展: -e : 接日期『 YYYY-MM-DD 』 shadow 第八字段账号失效日期 222 | -f : 接天数 shadow 第七字段密码失效日 0 :立刻失效 -1 :永不失效 223 | 失效后可登陆,但是会强制你重新设置密码 224 | [root@rhel7 ~]# useradd -u 888 -g 888 -f 0 -e 2016-03-21 t1 225 | [root@rhel7 ~]# id t1 226 | uid=888(t1) gid=888(test) groups=888(test) 227 | [root@rhel7 ~]# tail -n 1 /etc/passwd 228 | t1:x:888:888::/home/t1:/bin/bash 229 | [root@rhel7 ~]# tail -n 1 /etc/shadow 230 | t1:!!:16880:0:99999:7:0:16881: 231 | ``` 232 | 233 | #### passwd 234 | 235 | ```config 236 | 给用户设置密码 237 | passwd [--sdtin] <== 所有人均可使用更改自己的密码 238 | passwd [-l] [-u] [--sdtin] [-S] [-n 日数 ] [-x 日数 ] [-w 日数 ] [-i 日期 ] 账号 <==root 功能 239 | 选项与参数 : 240 | --stdin : 可以透过来自前一个管线的数据 , 作为密码输入 echo 123 | passwd --stdin dabao 241 | -l : 是 Lock 的缩写 , 会将 /etc/shadow 第二栏最前面加上 ! 使密码失效 242 | -u : 与 -l 相对 , 是 Unlock 的缩写 243 | -S : 列出密码相关参数 shadow 大部分信息。 244 | -n : 后面接天数 ,shadow 第 4 字段 , 密码不可被更动的天数 245 | -x : 后面接天数 ,shadow 第 5 字段 , 密码需要重新变更的天数 246 | -w : 后面接天数 ,shadow 第 6 字段 , 密码需要变更期限前的警告天数 247 | -i : 后面接天数 ,shadow 第 7 字段 , 密码失效日期 248 | ``` 249 | 250 | ```shell 251 | [root@rhel7 ~]# passwd t1 252 | Changing password for user t1. 253 | New password: 254 | BAD PASSWORD: it is based on a dictionary word 255 | Retype new password: 256 | passwd: all authentication tokens updated successfully. 257 | 258 | 设置密码失效日期为 7 天 259 | [root@rhel7 ~]# passwd -i 7 t1 260 | Adjusting aging data for user t1. 261 | passwd: Success 262 | 263 | 查看记录用户密码属性的文件 /etc/shadow ,截取 t1 用户的那一行 264 | [root@rhel7 ~]# sed -n '/t1/p' /etc/shadow 265 | t1:$6$TDnycU/C$0AmM5AoZmoHZQMex.dQCoroH2JxdSnDhLnBMorcUPlWgshYrlstZJmH.Q.fT 266 | OTV.pECGEuqFqugj8YccRqcdD/:16880:0:99999:7:7:16881: 267 | 268 | 截取 t1 用户密码属性,以 : 为分割的第 7 字段 269 | [root@rhel7 ~]# sed -n '/t1/p' /etc/shadow|cut -d":" -f 7 270 | 7 271 | [root@rhel7 ~]# sed -n '/t1/p' /etc/shadow|awk -F: '{print 7}' 272 | 7 273 | ``` 274 | 275 | ### 修改用户和组属性 276 | 277 | #### groupmod 278 | 279 | 修改组属性 280 | 281 | ```shell 282 | groupmod -g gid [gname] 修改 gid 283 | groupmod -n new_gname [gname] 修改组的名字 284 | [root@rhel7 ~]# groupmod -g 999 test 285 | [root@rhel7 ~]# grep test /etc/group 286 | test:x:999: 287 | [root@rhel7 ~]# groupmod -n test1 test 288 | [root@rhel7 ~]# grep test /etc/group 289 | test1:x:999: 290 | ``` 291 | 292 | #### usermod 293 | 294 | 修改用户属性 295 | ```config 296 | usermod [-cdegGlsuLU] username 297 | 选项不参数 : 298 | -c : 后面接账号的说明 修改 /etc/passwd 第 5 字段 299 | -d : 后面接账号的家目录 修改 /etc/passwd 第 6 字段 300 | -e : 后面接日期 , 格式是 YYYY-MM-DD 修改 shadow 第 8 字段 ( 账号失效日 ) 301 | -f : 后面接天数 修改 shadow 第 7 字段 ( 密码失效日期 ) 302 | -g : 后面接初始群组 修改 /etc/passwd 第 4 字段 GID 303 | -G : 后面接次要群组 , 修改这个使用者能够支持的群组 修改 /etc/group 304 | -aG : 『增加次要群组的支持』而非『设定』 305 | -l : 后面接账号名称 修改账号名称 修改 /etc/passwd 第 1 字段 306 | -s : 后面接 Shell 的实际档案 , 例如 /bin/bash /bin/csh 等等 307 | -u : 后面接 UID 数字啦 ! 卲 /etc/passwd 第三栏的资料 ; 308 | -L : 暂时将用户的密码冻结 , 让他无法登入。修改 /etc/shadow 密码栏 309 | -U : 将 /etc/shadow 密码栏的 ! 拿掉 , 解冻 310 | ``` 311 | 312 | ```shell 313 | [root@rhel7 ~]# usermod -g test2 -G test3 t1 314 | [root@rhel7 ~]# id t1 315 | uid=888(t1) gid=1000(test2) groups=1000(test2),1001(test3) 316 | [root@rhel7 ~]# usermod -s /sbin/nologin t1 317 | [root@rhel7 ~]# grep t1 /etc/passwd 318 | t1:x:888:1000::/home/t1:/sbin/nologin 319 | [root@rhel7 ~]# su - t1 320 | This account is currently not available. 321 | ``` 322 | 323 | #### chage 324 | 325 | 修改用户密码属性 326 | 327 | ```config 328 | chage [-ldEImMW] 账号名 329 | 选项与参数 : 330 | -l : 列出该账号的详细密码参数 ; 331 | -d : 后面接日期 , 修改 shadow 第 3 字段 ( 最近一次更改密码的日期 ), 格式 YYYY-MM-DD 332 | -m : 后面接天数 , 修改 shadow 第 4 字段 ( 密码不可被更动的天数 ) 333 | -M : 后面接天数 , 修改 shadow 第 5 字段 ( 密码需要重新变更的天数 ) 334 | -W : 后面接天数 , 修改 shadow 第 6 字段 ( 密码需要变更期限前的警告天数 ) 335 | -I : 后面接天数 , 修改 shadow 第 7 字段 ( 密码失效日期 ) 336 | -E : 后面接日期 , 修改 shadow 第 8 字段 ( 账号失效日 ), 格式 YYYY-MM-DD 337 | ``` 338 | 339 | ```shell 340 | [root@rhel7 ~]# chage t1 341 | Changing the aging information for t1 342 | Enter the new value, or press ENTER for the default 343 | Minimum Password Age [0]: 344 | Maximum Password Age [99999]: 345 | Last Password Change (YYYY-MM-DD) [2016-03-20]: 346 | Password Expiration Warning [7]: 347 | Password Inactive [7]: 348 | Account Expiration Date (YYYY-MM-DD) [2016-03-21]: 349 | ``` 350 | 351 | #### chsh 352 | 353 | change shell 的简写 354 | 355 | ```shell 356 | chsh [-ls] 357 | 选项与参数 : 358 | -l : 列出目前系统上面可用的 shell /etc/shells 里内容 359 | -s : 修改自己的 Shell 360 | [root@rhel7 ~]# chsh -s /bin/bash t1 361 | Changing shell for t1. 362 | Shell changed. 363 | [root@rhel7 ~]# grep t1 /etc/passwd 364 | t1:x:888:1000::/home/t1:/bin/bash 365 | ``` 366 | 367 | ### 删除用户和组 368 | 369 | #### groupdel 370 | 371 | 删除组 372 | 373 | groupdel groupname 374 | 375 | #### userdel 376 | 377 | 删除用户 378 | 379 | ```shell 380 | userdel [-r] username 381 | 选项不参数 : 382 | -r 没有这个选项删除会不彻底,关于用户的目录、文档全部删除 383 | 384 | [root@rhel7 ~]# tail -3 /etc/group 385 | test:x:999: 386 | test2:x:1000: 387 | test3:x:1001:t1 388 | [root@rhel7 ~]# groupdel test3 389 | [root@rhel7 ~]# tail -3 /etc/group 390 | baby:x:490: 391 | test:x:999: 392 | test2:x:1000: 393 | [root@rhel7 ~]# userdel -r t1 394 | [root@rhel7 ~]# ll /home 395 | total 12 396 | drwx------. 27 cong cong 4096 Jan 1 18:40 cong 397 | drwx------. 4 g2 398 | 888 4096 Mar 21 03:56 g2 399 | drwx------. 12 tom tom 4096 Mar 21 02:14 tom 400 | ``` 401 | 402 | ### 查看用户和组信息 403 | 404 | #### id 405 | 406 | 查看已存在用户的基本信息 407 | 408 | ```shell 409 | [root@rhel7 ~]# id root 410 | uid=0(root) gid=0(root) groups=0(root) 411 | [root@rhel7 ~]# id -g root 412 | 0 413 | [root@rhel7 ~]# id -u root 414 | 0 415 | ``` 416 | 417 | #### groups 418 | 419 | 查看当前用户支持的群组信息 420 | 421 | ```shell 422 | [root@rhel7 ~]# groups 423 | root 424 | ``` 425 | 426 | 思考题: root 和普通用户都可以修改 /etc/passwd 文档,那么这个文档的权限是什么呢? 427 | SUID 428 | 429 | ## 用户身份切换 sudo / su 430 | 431 | ### su 432 | 433 | ```shell 434 | su [-lm] [-c 指令 ] [username] 435 | 选项与参数 : 436 | - : 单纯使用 - 如『 su - 』 以 login-shell 变量档案读取方式登入系统 ; 默认切换为 root 437 | -l : 与 - 类似 login-shell 438 | -m :-m 与 -p 一样 , 表示『使用目前的环境设定 , 而不读取新使用者的配置文件』 439 | -c : 接指令 440 | ``` 441 | 442 | 总结: 443 | 1. su - username 或 su -l username 444 | 完整切换成新使用者的环境 用 env 查看环境变量 445 | PATH/USER/MAIL 446 | 2. su - -c " 指令 " 447 | 仅想要执行一次 root 的指令 448 | 3. 使用 root 切换成为任何使用者时 , 不需要输入新用户密码 449 | 4. 缺点:当主机多人管理时, su 切换成 root ,那每个人都需要知道 root 密码,不安全。 450 | 451 | ### sudo 452 | 453 | sudo [-u user name | #uid] [command] 454 | 455 | #### sudo 执行流程 456 | 457 | 1. 在 /etc/sudoers 档案中查看 user 是否有 sudo 执行权限 458 | 2. 若有 sudo 执行权限 , 『输入用户的密码』 459 | 3. 密码正确 , 开始执行 sudo 后续接的指令 460 | 4. root 无需密码,自己切换自己也无需密码 461 | 462 | #### 添加用户 sudo 执行权限的方法 463 | 464 | (如何让用户可以使用 sudo ?) 465 | 1. visudo 可以让系统检验 /etc/sudoers 的语法是否正确 466 | 2. 修改 /etc/sudoers 中的语法 467 | 468 | 1 )单一用户可使用 root 所有指令或某些指令 469 | 470 | ```shell 471 | root ALL=(ALL) ALL <== 找到这一行 ,rh6 在 98 行 472 | username ALL=(ALL) ALL <== 新增这一行 473 | username ALL=(root) /bin/touch<== 新增这一行 474 | ``` 475 | 476 | 语法解释: 477 | 478 | 使用者账号 登入者的来源主机名 =( 可切换的身份 ) 可下达的指令 479 | 480 | root ALL=(ALL) ALL <== 这是默认值 481 | 482 | 1. 使用者帐号:系统哪个帐号可以使用 sudo 483 | 2. 登入者的来源主机名:信任用户 默认 root 可来自任何一部网络主机 484 | 3. 可切换的身份:该账号可以切换成谁来下命令 , 末日 root 可以切换成任何人 485 | 4. 可下达的指令:可用该身份下达什么指令。必需使用绝对路径 ( 可通过 which\whereis 查询 ) 486 | 5. ALL : 是特殊关键词 , 代表任何身份、任何主机、任何命令 487 | 488 | 2 )群组和免密码的功能处理 489 | 490 | ```shell 491 | %wheel ALL=(ALL) ALL<== 找到这一行 ,rh6 在 105 行 492 | %wheel ALL=(ALL) NOPASSWD: ALL<== 找到这一行 ,rh6 在 108 行 493 | ``` 494 | 495 | 语法解释: 496 | 497 | 1. % 接群组 498 | 2. wheel 群组内的用户有使用 sudo 的权限,并可以切换成任何人,执行切换后身份的任何命令 499 | 3. wheel 群组内的用户切换用户时不需要输入自己的密码 500 | 501 | 3)有限的权限操作 502 | 503 | ```shell 504 | dabao ALL=(root) /usr/bin/passwd <== 有 bug , dabao 能修改 root 密码 505 | dabao ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root<== 可以执 506 | 行『 passwd 任意字符』 , 但是『 passwd 』和『 passwd root 』这两个命令不可执行 507 | ``` 508 | 509 | 4 )别名设置 visudo 510 | 511 | ```shell 512 | User_Alias DABAO=dabao,jerry,tom,g1,g2,g3 513 | Cmnd_Alias DABAOCOM = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root 514 | DABAO ALL=(root) DABAOCOM 515 | ``` 516 | 517 | 5) sudo 搭配 su 使用 518 | 519 | ```shell 520 | username ALL=(root) /bin/su - 521 | sudo su - <==sudo -u root su -l root 522 | ``` 523 | 可以直接切换成 root 用户,而且不需要输入 root 密码 524 | 525 | 6 ) 5 分钟内可以不用再输入密码。 526 | 527 | ## Linux用户和组课后作业 528 | 529 | 1. 新建一个用户名为 redhat。密码为 password ,配置以下信息,以达到要求: 530 | * 密码的最小存活期为:1 天 531 | * 密码的最大存活期为:10 天 532 | * 密码过期前 5 天提醒 533 | * 密码过期后如 15 天仍未设置新密码,则封锁该帐户。 534 | 1. 创建一个新组 newgroup、将 redhat 以附加组成员的身份加入 到 newgroup 中。 535 | 2. 添加 3 个用户,用户 harry,natasha,tom,和一个组 ,组名为 admin 组 , 536 | 要求 : 537 | * harry,natasha 用户的附加组为 admin 组; 538 | * tom 用户的登陆 shell 为非交互式 shell; 539 | * 用户密码都为 uplooking 540 | 1. 使用 harry 用户登陆系统,尝试修改自己的密码,密码自己设 定。 541 | 2. 创建一个叫做 alex 用户,用户 uid 为 1234,不能登陆系统。 542 | 3. 以 root 用户身份给 natasha 用户修改密码,密码修改为 abc12345。 543 | 4. 给 tom 用户追加附加组,追加的附加组为 alex,同时给 tom 用户修改 uid,修改为 2222。 544 | -------------------------------------------------------------------------------- /04-Linux压缩打包.md: -------------------------------------------------------------------------------- 1 | # Linux压缩打包 2 | 3 | [TOC] 4 | 5 | ## 压缩的意义和原理 6 | 7 | ### 压缩的意义 8 | 9 | 你是否遇到过以下情况: 10 | 11 | - 文件太大, 一个 u 盘无法全部复制? 12 | - 备份某些重要数据 , 偏偏这些数据量太大了 , 耗掉了你太多的磁盘空间? 13 | 14 | 这个时候,“文件压缩”技术可 就派上用场了 ! 15 | 16 | 因为这些比较大型的文件透过所谓的文件压缩技术后 , 可以将他的磁盘使用量降低 , 可以达到减低文件容量的效果 , 此外 , 有的压缩程序还可以进行容量限制 , 使一个大型文件可以分割成为数个小型文件 , 以方便 U盘携带呢 ! 17 | 18 | 19 | ### 压缩的原理 20 | 21 | 目前我们使用的计算机系统中都是使 bytes(字节)单位来计量的! 事实上 , 计算机最小的计量单位应该是 bits (比特)。 22 | 23 | 1 byte = 8 bits 。 24 | 25 | 如果让计算机记录 1 这个数字他会如何记录 ? 26 | 27 | 假设一个 byte 可以看成下面的样子 : 28 | 29 | □□□□□□□□ 30 | 31 | Tips: 32 | 33 | 1 byte = 8 bits , 所以每个 byte 当中会有 8 个空格 , 而每个空格可以是 0, 或者 1 , 这里仅是做为一个粗略的介绍。由于我们记录数字是 1 , 表示成二进制就是 00000001 , 1 会在最右边占据 1 个 bit , 而其他 的 7 个bits 将会被填上 0 ! 有一种压缩技术示这么做的,他是将重复的数据进行统计记录的。 34 | 35 | 举个例子说 , 如果你的数据『 111.... 』共有 100 个 1 36 | 37 | 那么压缩技术会记录为『 100 个 1 』而不是真的有 100 个 1 的位存在 ! 38 | 39 | 简单的说 , 你可以将他想成 , 其实文件里面有相当多的『空间』存在 , 并不是完全填满的 40 | 41 | - 『压缩』 技术就是将这些『空间』填满 , 以让整个文件占用的容量下降 ! 42 | - 『压缩过的档案』并无法直接被我们的操作系统所使用 , 因此 , 若要使用这些被压缩过的文件数据 , 则必项将他『还原』回到 未压缩前的模样 ,那就是所谓的『解压缩』啰 ! 43 | - 至于压缩前与压缩后的档案所占用的磁盘空间大小 , 就可以被称为是『压缩比』。 44 | 45 | 46 | ### 压缩与解压缩的好处 47 | 48 | 最大的好处就是压缩过的文件容量变小了 , 所以你的 硬盘容量无形当中就可以容纳更多的资料。此外 , 在一些网络数据的传输中 , 也会由于数据量的降低 , 好让网络带宽可以用来作更多的工作 ! 而并是老是卡在一些大型的文件传输上面呢 ! 目前很多的 WWW 网站也是利用文件压缩的技术来进行数据的传送 , 好让网站带宽的可利用率上升。 49 | 50 | ## 压缩打包命令 51 | 52 | 命令概览 53 | 54 | * compress 是一个相当古老的 unix 档案压缩指令。 55 | 56 | * gzip 是 GNUzip 的缩写,它是一个 GNU( 全称是 GNU's Not Unix ) 自由软件的文件压缩程序 ; 由于 gzip 可以产生更理想的压缩比例,一般人多已改用 gzip 为档案压缩工具。 57 | 58 | * bzip2 是一个基于 Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的 LZ77/LZ78 压缩算法来得好 ; 若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 这玩意的压缩比竟然比 gzip 还要好。 59 | 60 | * tar 命令最初的设计目的是将文件备份到磁带上 (tape archive) ,因而得名 tar 。 61 | 62 | ![01](pic/01.png) 63 | 64 | ### .zip 65 | 66 | .zip 扩展名表示文件是使用许多 zip 归档程序和压缩程序之一(但不是 gzip )创建的。因为这是一种非常流行的压缩格式,算法的详细描述也有很多,所以可以找到用于所有操作系统的有用的移植形式。这包括创建和扩展带有 .zip 文件扩展名的档案的压缩和解压缩实用程序。在 Linux 上有两种这样的工具: 67 | 68 | 免费的 Info-ZIP 和以赢利为目的的 PKZIP for Linux 。 69 | 70 | 如果您只是偶尔需要创建或打开 zip 文件,使用 Info-ZIP 。如果希望使用在 MS-DOS 或其它系统上使用的相同工具,请选择PKZIP ( PKZIP 可用于许多操作系统)。用于微软 Windows 的 WinZIP 和用于 Mac OS 的Stufflt 这两种实用程序可以创建和打开相互之间兼容的档案。 71 | 72 | Info-ZIP 在无法使用 gzip 或 tar 的情况下可以提供压缩和解压缩的一个不错的选择,这或许是在Linux 、微软 Windows 和 Mac OS 用户之间交换压缩文件的一种最好的形式。有许多不错的 zip 程序(有开放源码的,也有商业的)可用于这些操作系统,它们应该能确保文件的顺利交换(当然,只要是在特定于某个特定工具的特殊功能关闭的情况下)。 73 | 74 | rhel7 默认带有 info-zip 软件 75 | 76 | ```shell 77 | [root@mastera0 zip-3.0]# which zip 78 | /usr/bin/zip 79 | [root@mastera0 zip-3.0]# rpm -qf /usr/bin/zip 80 | zip-3.0-10.el7.x86_64 81 | [root@mastera0 zip-3.0]# head -n 18 /usr/share/doc/zip-3.0/README 82 | Zip 3.0 is the first Zip update adding large file support. For now Zip 2.3x 83 | remains available and supported, but users should switch to this new release. 84 | Testing for Zip 3.0 has focused mainly on Unix, VMS, Max OS X, and Win32, 85 | and some other ports may not be fully supported yet. If you find your 86 | favorite port is broke, send us the details or, better, send bug fixes. It's 87 | possible that support for some older ports may be dropped in the future. 88 | Copyright (c) 1990-2008 Info-ZIP. All rights reserved. 89 | See the accompanying file LICENSE (the contents of which are also included 90 | in unzip.h, zip.h and wiz.h) for terms of use. If, for some reason, all 91 | of these files are missing, the Info-ZIP license also may be found at: 92 | ftp://ftp.info-zip.org/pub/infozip/license.html and 93 | http://www.info-zip.org/pub/infozip/license.html. 94 | [root@mastera0 ~]# rpm -qi zip 95 | Name 96 | : zip 97 | Version : 3.0 98 | Release : 10.el7 99 | Architecture: x86_64 100 | Install Date: Thu 23 Jun 2016 01:50:41 PM CST 101 | Group 102 | : Applications/Archiving 103 | Size 104 | : 815045License : BSD 105 | Signature : RSA/SHA256, Thu 03 Apr 2014 06:52:17 AM CST, Key ID 199e2f91fd431d51 106 | Source RPM : zip-3.0-10.el7.src.rpm 107 | Build Date : Tue 28 Jan 2014 06:35:49 AM CST 108 | Build Host : x86-019.build.eng.bos.redhat.com 109 | Relocations : (not relocatable) 110 | Packager : Red Hat, Inc. 111 | Vendor 112 | : Red Hat, Inc. 113 | URL 114 | : http://www.info-zip.org/Zip.html 115 | Summary : A file compression and packaging utility compatible with PKZIP 116 | Description : 117 | The zip program is a compression and file packaging utility. Zip is 118 | analogous to a combination of the UNIX tar and compress commands and 119 | is compatible with PKZIP (a compression and file packaging utility for 120 | MS-DOS systems). 121 | Install the zip package if you need to compress files using the zip 122 | program. 123 | ``` 124 | 125 | #### zip 命令用法 126 | 127 | zip 命令可以用来解压缩文件,或者对文件进行打包操作。 zip 是个使用广泛的压缩程序,文件经它压缩后会另外产生具有 “ .zip” 扩展名的压缩文件。 128 | 129 | ```shell 130 | 语法 zip( 选项 )( 参数 ) 131 | 132 | 选项 133 | 134 | -A :调整可执行的自动解压缩文件; 135 | -b< 工作目录 > :指定暂时存放文件的目录; 136 | -c :替每个被压缩的文件加上注释; 137 | -d :从压缩文件内删除指定的文件; 138 | -D :压缩文件内不建立目录名称; 139 | -f :此参数的效果和指定 “ -u” 参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文 140 | 件内,使用本参数会一并将其加入压缩文件中; 141 | -F :尝试修复已损坏的压缩文件; 142 | -g :将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件; 143 | -h :在线帮助; 144 | -i< 范本样式 > :只压缩符合条件的文件; 145 | -j :只保存文件名称及其内容,而不存放任何目录名称; 146 | -J :删除压缩文件前面不必要的数据; 147 | -k :使用 MS-DOS 兼容格式的文件名称; 148 | -l :压缩文件时,把 LF 字符置换成 LF+CR 字符; 149 | -ll :压缩文件时,把 LF+cp 字符置换成 LF 字符; 150 | -L :显示版权信息; 151 | -m :将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中; 152 | -n< 字尾字符串 > :不压缩具有特定字尾字符串的文件; 153 | -o :以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同; 154 | -q :不显示指令执行过程; 155 | -r :递归处理,将指定目录下的所有文件和子目录一并处理; 156 | -S :包含系统和隐藏文件; 157 | -t< 日期时间 > :把压缩文件的日期设成指定的日期; 158 | -T :检查备份文件内的每个文件是否正确无误; 159 | -u :更换较新的文件到压缩文件内; 160 | -v :显示指令执行过程或显示版本信息; 161 | -V :保存 VMS 操作系统的文件属性; 162 | -w :在文件名称里假如版本编号,本参数仅在 VMS 操作系统下有效; 163 | -x< 范本样式 > :压缩时排除符合条件的文件; 164 | -X :不保存额外的文件属性; 165 | -y :直接保存符号连接,而非该链接所指向的文件,本参数仅在 UNIX 之类的系统下有效; 166 | -z :替压缩文件加上注释; 167 | -$ :保存第一个被压缩文件所在磁盘的卷册名称; 168 | -< 压缩效率 > :压缩效率是一个介于 1~9 的数值。 169 | 参数 170 | zip 压缩包:指定要创建的 zip 压缩包; 171 | 文件列表:指定要压缩的文件列表。 172 | 实例 173 | zip -q -r html.zip /home/Blinux/html 174 | zip -q -r html.zip * 175 | ``` 176 | 177 | #### unzip 的用法 178 | 179 | unzip 命令用于解压缩由 zip 命令压缩的 “ .zip” 压缩包 180 | 181 | ```shell 182 | 语法 unzip( 选项 )( 参数 ) 183 | 184 | 选项 185 | 186 | -c :将解压缩的结果显示到屏幕上,并对字符做适当的转换; 187 | -f :更新现有的文件; 188 | -l :显示压缩文件内所包含的文件; 189 | -p :与 -c 参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换; 190 | -t :检查压缩文件是否正确; 191 | -u :与 -f 参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中; 192 | -v :执行时显示详细的信息; 193 | -z :仅显示压缩文件的备注文字; 194 | -a :对文本文件进行必要的字符转换; 195 | -b :不要对文本文件进行字符转换; 196 | -C :压缩文件中的文件名称区分大小写; 197 | -j :不处理压缩文件中原有的目录路径; 198 | -L :将压缩文件中的全部文件名改为小写; 199 | -M :将输出结果送到 more 程序处理; 200 | -n :解压缩时不要覆盖原有的文件; 201 | -o :不必先询问用户, unzip 执行后覆盖原有的文件; 202 | -P< 密码 > :使用 zip 的密码选项; 203 | -q :执行时不显示任何信息; 204 | -s :将文件名中的空白字符转换为底线字符; 205 | -V :保留 VMS 的文件版本信息; 206 | -X :解压缩时同时回存文件原来的 UID/GID ; 207 | -d< 目录 > :指定文件解压缩后所要存储的目录; 208 | -x< 文件 > :指定不要处理 .zip 压缩文件中的哪些文件; 209 | -Z : unzip-Z 等于执行 zipinfo 指令 210 | 211 | 参数 压缩包:指定要解压的 “ .zip” 压缩包。 212 | 213 | 实例 214 | 215 | unzip test.zip 216 | unzip -v test.zip 217 | unzip -n test.zip -d /tmp 218 | ``` 219 | 220 | ### .gz 221 | 222 | #### gzip 的用法 223 | 224 | gzip 命令用来压缩文件。 gzip 是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处 “ .gz”扩展名。 gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。 225 | 226 | gzip 不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和 tar 命令一起构成 Linux 操作系统中比较流行的压缩文件格式。据统计, gzip 命令对文本文件有 60% ~ 70% 的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。 227 | 228 | ```shell 229 | 语法 gzip( 选项 )( 参数 ) 230 | 231 | 选项 232 | 233 | -a 或 —— ascii :使用 ASCII 文字模式; 234 | -d 或 --decompress 或 ----uncompress :解开压缩文件; 235 | -f 或 —— force :强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接; 236 | -h 或 —— help :在线帮助; 237 | -l 或 —— list :列出压缩文件的相关信息; 238 | -L 或 —— license :显示版本与版权信息; 239 | -n 或 --no-name :压缩文件时,不保存原来的文件名称及时间戳记; 240 | -N 或 —— name :压缩文件时,保存原来的文件名称及时间戳记; 241 | -q 或 —— quiet :不显示警告信息; 242 | -r 或 —— recursive :递归处理,将指定目录下的所有文件及子目录一并处理; 243 | -S 或 < 压缩字尾字符串 > 或 ----suffix< 压缩字尾字符串 > :更改压缩字尾字符串; 244 | -t 或 —— test :测试压缩文件是否正确无误; 245 | -v 或 —— verbose :显示指令执行过程; 246 | -V 或 —— version :显示版本信息; 247 | -< 压缩效率 > :压缩效率是一个介于 1~9 的数值,预设值为 “ 6” ,指定愈大的数值,压缩效率就会 248 | 愈高; 249 | --best :此参数的效果和指定 “ -9” 参数相同; 250 | --fast :此参数的效果和指定 “ -1” 参数相同。 251 | 252 | 参数 文件列表:指定要压缩的文件或指定要解压的文件。。 253 | 254 | 实例 255 | 256 | gzip * 将当前目录下的每个文件都压缩成 .gz 文件 257 | gzip test 将 test 文件压缩成 test.gz 文件并删除源文件 258 | gzip -rv /tmp 第归压缩目录中的所有文件,压缩成 .gz 结尾的文件,并显示指令执行过程 259 | gizp -dr /tmp 第归解压 /tmp 目录下的 .gz 结尾的文件 260 | ``` 261 | 262 | #### gunzip 的用法 263 | 264 | gunzip 命令用来解压缩文件。 gunzip 是个使用广泛的解压缩程序,它用于解开被 gzip 压缩过的文件,这些压缩文件预设最后的扩展名为 .gz 。其实压缩或解压缩,都可通过 gzip 指令单独完成。 265 | 266 | ```shell 267 | 语法 gunzip( 选项 )( 参数 ) 268 | 269 | 选项 270 | 271 | -a 或 —— ascii :使用 ASCII 文字模式; 272 | -c 或 --stdout 或 --to-stdout :把解压后的文件输出到标准输出设备; 273 | -f 或 -force :强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接; 274 | -h 或 —— help :在线帮助; 275 | -l 或 —— list :列出压缩文件的相关信息; 276 | -L 或 —— license :显示版本与版权信息; 277 | -n 或 --no-name :解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其忽略不予处理; 278 | -N 或 —— name :解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其回存到解开 279 | 的文件上; 280 | -q 或 —— quiet :不显示警告信息; 281 | -r 或 —— recursive :递归处理,将指定目录下的所有文件及子目录一并处理; 282 | -S 或 < 压缩字尾字符串 > 或 ----suffix< 压缩字尾字符串 > :更改压缩字尾字符串; 283 | -t 或 —— test :测试压缩文件是否正确无误; 284 | -v 或 —— verbose :显示指令执行过程; 285 | -V 或 —— version :显示版本信息; 286 | 287 | 参数 文件列表:指定要解压的压缩包。 288 | 289 | 实例 290 | gzip -d test.gz 291 | gunzip test.gz 292 | 效果一样 293 | ``` 294 | 295 | ### .bz2 296 | 297 | #### bzip2 的用法 298 | 299 | bzip2 命令用于创建和管理(包括解压缩) “ .bz2” 格式的压缩包。 300 | 301 | ```shell 302 | 语法 bzip2( 选项 )( 参数 ) 303 | 304 | 选项 305 | 306 | -c 或 —— stdout :将压缩与解压缩的结果送到标准输出; 307 | -d 或 —— decompress :执行解压缩; 308 | -f 或 -force : bzip2 在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若 309 | 要覆盖。请使用此参数; 310 | -h 或 —— help :在线帮助; 311 | -k 或 —— keep : bzip2 在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数; 312 | -s 或 —— small :降低程序执行时内存的使用量; 313 | -t 或 —— test :测试 .bz2 压缩文件的完整性; 314 | -v 或 —— verbose :压缩或解压缩文件时,显示详细的信息; 315 | -z 或 —— compress :强制执行压缩; 316 | -V 或 —— version :显示版本信息; 317 | --repetitive-best :若文件中有重复出现的资料时,可利用此参数提高压缩效果; 318 | --repetitive-fast :若文件中有重复出现的资料时,可利用此参数加快执行效果。 319 | 320 | 参数 文件列表:指定要压缩的文件或指定要解压的文件。 321 | 322 | 实例 323 | 324 | bzip2 test 压缩 test 文件,生成压缩文件 test.bz2 ,并删除源文件 325 | bzip2 -k test 压缩 test 文件,生成压缩文件 test.bz2 ,并保留源文件 326 | bzip2 -d test.bz2 解压文件 327 | bunzip2 test.bz2 解压文件 328 | ``` 329 | 330 | #### bunzip2 的用法 331 | 332 | bunzip2 命令解压缩由 bzip2 指令创建的 ” .bz2" 压缩包。对文件进行压缩与解压缩。此命令类似于“ gzip/gunzip” 命令,只能对文件进行压缩。对于目录只能压缩目录下的所有文件,压缩完成后,在目录下生成以 “ .bz2” 为后缀的压缩包。 bunzip2 其实是 bzip2 的符号链接,即软链接,因此压缩解压都可以通过 bzip2 实现。 333 | 334 | ```shell 335 | [root@mastera0 ~]# which bzip2 336 | /usr/bin/bzip2 337 | [root@mastera0 ~]# which bunzip2 338 | /usr/bin/bunzip2 339 | [root@mastera0 ~]# ll -i /usr/bin/bzip2 340 | 33853111 -rwxr-xr-x. 1 root root 36752 Jul 31 2014 /usr/bin/bzip2 341 | [root@mastera0 ~]# ll -i /usr/bin/bunzip2 342 | 34293684 lrwxrwxrwx. 1 root root 5 Jun 23 13:50 /usr/bin/bunzip2 -> bzip2 343 | 344 | bunzip2 [ -fkvsVL ] [ filenames ... ] 345 | 346 | -f 或 --force :解压缩时,若输出的文件与现有文件同名时,预设不会覆盖现有的文件; 347 | -k 或 --keep :在解压缩后,预设会删除原来的压缩文件。若要保留压缩文件,请使用此参数; 348 | -s 或 --small :降低程序执行时,内存的使用量; 349 | -v 或 --verbose :解压缩文件时,显示详细的信息; 350 | -l , --license , -V 或 —— version :显示版本信息。 351 | ``` 352 | 353 | 354 | ### .xz 355 | 356 | XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩速度也很快。最初 XZ Utils的是基于 LZMA-SDK 开发,但是 LZMA-SDK 包含了一些 WINDOWS 平台的特性,所以 XZ Utils 为以适应 POSIX 平台作了大幅的修改。XZ Utils 的出现也是为了取代 POSIX 系统中旧的 LZMA Utils。XZ Utils 主要包含了下列部分: 357 | 358 | * 命令行程序 xz ,用来生成和解压缩 .xz 压缩文件。 359 | * 一组实用的脚本工具 (xzcat, xdiff, xzgrep 等)提供浏览,查找以及比较 .xz 文件内 360 | 容等功能。 361 | * liblzma 压缩库,提供算法的实现和近似于 ZLIB 的编程接口。 362 | * 提供对 LZMA Utils 的一些兼容 363 | 364 | xz 文件格式 365 | 366 | XZ Utils 工具生成的压缩文件扩展名为 .xz (MIME 类型为"application/x-xz")。 367 | 368 | .xz 文件格式具有下列特点: 369 | 370 | * 基于数据流: 易于通过管道 (pipe) 生成压缩文件或解压缩文件。.xz 文件格式与 .gz/.bz2 文件一样,不具备对多个文件进行归档打包的能力。若要处理多个文件,可以和归档工具 tar 结合使用,生成扩展名为 .tar.xz 或 .txz 的压缩文件。 371 | * 随机读取: 存储的数据被划分为独立的压缩块,并对每个压缩块进行索引,当每个压缩块比较小时,便能够进行有限的随机读取压缩数据。 372 | * 完整性验证: 可以使用 CRC32、CRC64、SHA-256 来进行数据的完整性验证,也可以增加自定义验证方法。 373 | * 可连接(concatenation): 类似于 .gz/.bz2 文件,可以把多个压缩数据流连接到一个文件中。解压缩时,就像解压一个正常单压缩流文件一样。 374 | * 支持多 filter 和 filter 链: 提供自定义 filter 的能力,也能够将多个 filter 组成filter 链,对数据进行处理。这点与 Unix 命令间使用的管道 (pipe) 类似。 375 | * 可填充(padding): 可以在 .xz 文件末尾填充二进制'0'以充满特定大小的空间,比如备份磁带上的一个块 (block)。 376 | 377 | XZ Utils 具有高压缩率,解压速度快的特点。能够生成更小文件的同时,也能提供稳定快速的解压,在对数据大小比较敏感的场合,比如说大数据的网络传输,文件的备份,处理能力有限的嵌入系统等场合,有着十分广泛的用途。 378 | 379 | #### xz 命令用法 380 | 381 | ```shell 382 | 语法 xz ( 选项 )( 参数 ) 383 | 384 | 选项 385 | 386 | -z, --compress 387 | force compression 强制压缩 388 | -d, --decompress, --uncompress 389 | force decompression 解开压缩文件 390 | -t, --test test compressed file integrity 测试压缩文件是否正确无误 391 | -l, --list list information about .xz files 列出压缩文件的相关信息 392 | -k, --keep keep (don't delete) input files 不删除源文件 393 | -f, --force force overwrite of output file and (de)compress links 强制压缩,覆盖输出文件同名的文件 394 | -c, --stdout, --to-stdout write to standard output and don't delete input files 写入标准输出,不要删除输入文件 395 | -0 ... -9 compression preset; default is 6; take compressor *and* decompressor memory usage into account before using 7-9! 压缩效率是一个介于 396 | 1~9 的数值,预设值为 “ 6” ,指定愈大的数值,压缩效率就会愈高;解压由县考虑使用 7-9 397 | -e, --extreme try to improve compression ratio by using more CPU time; does not affect decompressor memory requirements 通过使用更多的处理器时间 398 | 来提高压缩比;不影响解压时的内存需求 399 | -T, --threads=NUM use at most NUM threads; the default is 1; set to 0 to use the number of processor cores 最多使用的线程数量,默认为 1 ,如果设置为 400 | 0 去使用处理器内核的数量 401 | -q, --quiet suppress warnings; specify twice to suppress errors too 抑制警告;指定两次 402 | 以抑制错误 403 | -v, --verbose be verbose; specify twice for even more verbose 404 | -h, --help display this short help and exit 405 | -H, --long-help display the long help (lists also the advanced options) 406 | -V, --version display the version number and exit 407 | 408 | 参数 文件列表:指定要压缩的文件列表。 409 | 410 | 实例 411 | xz test 压缩一个文件 test ,压缩成功后删除源文件 412 | xz -d -k test.xz 解压 test.xz 文件, -k 参数保证源文件不被删除 413 | xz -l test.xz 查看基本信息,包括压缩率等 414 | xz -k7 test 使用参数 -0, -1, -2, ... -6, ... -9 或参数 --fast, --best 设定压缩率。 xz 命令的默认为-6 。 415 | 借助 xargs 命令并行压缩多文件。下面的命令行可以将 /var/log 目录下所有的扩展名为 .log 的文件压缩。通过 xargs 命令同时运行多个 xz 进行压缩。 416 | find /var/log -type f -iname "*.log" -print0 | xargs -P4 -n16 xz -T1 417 | 注意:运行此命令须有 root 权限。 418 | ``` 419 | 420 | 421 | ### tar 422 | 423 | tar 命令可以为 linux 的文件和目录创建档案。利用 tar ,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。 tar 最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用 tar 命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。 424 | 425 | 首先要弄清两个概念:打包和压缩。 426 | 427 | * 打包是指将一大堆文件或目录变成一个总的文件; 428 | * 压缩则是将一个大的文件通过一些压缩算法变成一个小文件。 429 | 430 | 为什么要区分这两个概念呢? 431 | 432 | 这源于 Linux 中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包( tar 命令),然后再用压缩程序进行压缩( gzip bzip2 命令)。 433 | 434 | ```shell 435 | 语法 tar ( 选项 )( 参数 ) 436 | 437 | 选项 438 | -A 或 --catenate :新增文件到以存在的备份文件; 439 | -B :设置区块大小; 440 | -c 或 --create :建立新的备份文件; 441 | -C < 目录 > :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。 442 | -d :记录文件的差别; 443 | -x 或 --extract 或 --get :从备份文件中还原文件; 444 | -t 或 --list :列出备份文件的内容; 445 | -z 或 --gzip 或 --ungzip :通过 gzip 指令处理备份文件; 446 | -Z 或 --compress 或 --uncompress :通过 compress 指令处理备份文件; 447 | -f< 备份文件 > 或 --file=< 备份文件 > :指定备份文件; 448 | -v 或 --verbose :显示指令执行过程; 449 | -r :添加文件到已经压缩的文件; 450 | -u :添加改变了和现有的文件到已经存在的压缩文件; 451 | -j :支持 bzip2 解压文件; 452 | -J :支持 xz 解压文件; 453 | -v :显示操作过程; 454 | -l :文件系统边界设置; 455 | -k :保留原有文件不覆盖; 456 | -m :保留文件不被覆盖; 457 | -w :确认压缩文件的正确性; 458 | -p 或 --same-permissions :用原来的文件权限还原文件; 459 | -P 或 --absolute-names :文件名使用绝对名称,不移除文件名称前的 “ /” 号; 460 | -N < 日期格式 > 或 --newer=< 日期时间 > :只将较指定日期更新的文件保存到备份文件里; 461 | --exclude=< 范本样式 > :排除符合范本样式的文件。 462 | 463 | 参数 文件列表:指定要打包的文件或目录列表。 464 | 465 | 实例 466 | tar -cvf log.tar log2012.log 仅打包,不压缩! tar -xf 解压 467 | tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩 tar -zxf 解压 468 | tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩 tar -jxf 解压 469 | tar -Jcvf log.tar.xz log2012.log 打包后,以 xz 压缩 tar -Jxf 解压 470 | tar -tf log.tar 查看打包文件 471 | 注意 -f 参数后面必须接文件名 472 | ``` 473 | 474 | ## 04-Linux压缩打包课后习题 475 | 476 | 1. 通过dd创建4个5M的文件,分别为afile;bfile;cfile;dfile,并将这4个文件放在/tmp/test目录中保存 477 | 2. 对这4个相同大小的文件进行压缩,分别使用zip;bzip2;gzip;xz,并观察 478 | 3. 在将压缩文件进行解压,并观察 479 | 4. 将/tmp/test目录进行打包,分别使用gzip和bzip2压缩 480 | -------------------------------------------------------------------------------- /00-linux_history.md: -------------------------------------------------------------------------------- 1 | # LINUX HISTORY 2 | 3 | [TOC] 4 | 5 | ## 硬件发展简介 6 | 7 | ### x86 架构 8 | 9 | 1978年6月8日,Intel发布了新款16位微处理器“8086”,也同时开创了一个新时代:x86架构诞生了。X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世 10 | 界第一台 PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X86指令集和X87 指令集统称为 11 | X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到今天的Pentium 4(以下简为P4)系列,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源, 所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。 12 | 13 | ### Altair 8800 14 | 15 | 世界上的第一台个人电脑--“牵牛星”   16 | 17 | 爱德·罗伯兹(Ed Roberts)的梦想是做一名儿科医生。但是命运却让他加入了美国空军,做一名工程师。退伍后,他在新墨西哥州的阿伯克基市机场附近的荒漠上创办了一家称为米兹(MITS)的公司,生产各种电子部件和设备。公司有一段时间的经营还算顺利。当市场上的手持计算器卖到395美元时,米兹公司推出了 18 | 不到100美元的同类产品。但是不久之后,德州仪器等大公司迅速进入手持计算器的市场,产品价格大幅度下降,低到了米兹公司的成本价以下。米兹公司的其他产品销售情况也很糟。到了1974年,米兹公司已濒临破产边缘。   19 | 20 | 罗伯兹绞尽脑汁思考如何扭转公司的困境。他有了一个想法:能不能创造一种很便宜、能让个人使用的电脑呢?全国已经有很多电脑爱好者,他们都急切希望自己能拥有一台电脑,供个人玩弄,就像很多人在鼓捣自制的无线电收音机一样。市面上现在还没有这样的东西。带着这个想法,他去说服本地银行再给他的公司贷 21 | 一笔款。米兹公司必须至少再贷将近7万美元才能不致于破产。银行对罗伯兹的想法很怀疑。双方一直谈到深夜。不过,银行面临一个两难的选择:要么不再贷款给米兹公司,让它倒闭,银行以前的投资也就全完了。 22 | 要么再放一笔贷款,但这笔新贷款很可能又会打水漂。最后,银行再次让罗伯兹确切告诉他们,这种个人电脑什么时候能开发出来,第一年能卖多少套。罗伯兹对什么时候能做出来是有把握的,只要几个月的时间。 23 | 能卖多少套他就完全没有谱了。于是他说了一个非常乐观的数字:第一年能卖800套,这样销售收入可以有30万美元。拿到贷款后,米兹公司全力开发个人电脑产品。公司必须在最短时间内把产品开发出来并且卖出 24 | 去,不然破产就难以避免。为了缩短开发时间和降低成本,罗伯兹决定尽量采用现成的部件,做出来产品不是一台现成的计算机,而是一套零部件,需要用户自己装配。所有并非必需的产品特征都被去掉了。产品根 25 | 本没有今天的微机不可忽缺的键盘、鼠标、显示器、软盘等等设备。产品也没有软件,所有软件(包括所谓的系统软件)都需要用户用设置开关的方式一条指令一条指令地手工输入计算机。 26 |    27 | 不管多么简陋,这毕竟是世界上的第一台个人电脑,又称微机。米兹公司的微机产品有两个在当时无可比拟的优点。它很便宜,售价只有不到500美元,而当时一些大公司的实验室也做了类似微机的系统,成本在5 28 | 万美元左右。另外,米兹的微机设计具有所谓的可扩展能力。用户可以将米兹的微机买回来后,自己再想法配上更多的内存板子和外部设备。有一个用户花了近500美元买了一台微机,再花了3000美元把内存扩展 29 | 到12KB。《电子科普》(Popular Electronics)杂志听到这个消息后,敏锐地感觉到这是一个历史性的事件,马上决定在1975年1月期作为封面文章报道。但这个个人电脑产品却连名字都还没有。罗伯兹在 30 | 杂志的责任编辑家里讨论了各种名字。刚好,编辑的家人正在看《星际旅行》的电视节目。那一节刚好讲到了牵牛星座。于是,世界上第一台微机就被命名为“牵牛星”,全称是“牵牛星8800(Altair 8800)”。 31 | 32 | 罗伯兹做梦也没想到的是,全美有这么多的电脑爱好者,人人都想拥有一台微机。《电子科普》杂志的报道发表后一个月,米兹公司每天都要收到200多台“牵牛星”电脑的订单。生产线根本来不及满足销售需求。有 33 | 些用户干脆住到公司外面的荒漠上,等着自己的微机生产出来。大多数用户只是购买基本系统。也有用户愿意出495美元,让米兹公司生产一台已经装配好的系统。   34 | 35 | 今天,罗伯兹已经离开了电脑界。他回到乔治亚的老家,获得了医学博士学位,为儿童治病。他为自己创造了计算机领域的一个革命而自豪,但一点也不后悔放弃电脑业,放弃了成为大富翁的机会。他觉得为儿童治病更有意义。爱德·罗伯兹是个很幸福的人,他实现了儿时的梦想。 36 | 37 | ### IBM5150 38 | 39 | IBM推出世界上第一台个人电脑 40 | 41 | 1981年8月12日,总部设在美国纽约州阿蒙克的国际商用机器公司(IBM)推出5150的新款电脑,“个人电脑”这个新生市场随之诞生。IBM5150看起来像个米色的“大盒子”,售价1565美元,只有16K字节的内存,可以使用盒式录音磁带来下载和存储数据,此外也可配备5.25英寸的软件盘驱动器。 42 | 43 | ### MOS Technology 6502 44 | 45 | 当一个满脸横肉的怪人将这个微芯片装在电脑上,并启动电脑时,整个宇宙都震惊了。这个怪人就是苹果公司创始人之一——斯蒂芬·沃兹尼克,那台电脑就是Apple I,处理器用的是由摩斯太克公司研发的8位微处理器6502。 46 | 47 | 这一处理器同时也是Apple II、the Commodore PET、BBC Micro等经典电脑以及诸如任天堂和Atari等游戏系统的大脑。该处理器的设计者之一Chuck Peddle回忆称,他们是在1975年的一个贸易展示会上推出这款处理器的。他称:“我们用芯片装满了两个玻璃。我和我的妻子就坐在那里卖这些芯片。”摩斯太克公司6502微处理器终于脱颖而出,其原因是,6502的速度并不比它的竞争对手快多少,但是它的价格便宜,每部售价为25美元,而英特尔的8080和摩托罗拉的6800售价大约在200美元。 48 | 49 | ![001](pic/001.jpg) 50 | --- 51 | 52 | ## 操作系统简介 53 | 54 | ### Unix 55 | 56 | #### Unix 简史 57 | 58 | 1965年时,贝尔实验室(Bell Labs)加入一项由奇异电子(General Electric)和麻省理工学院(MIT)合作的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multiprocessor、multi-level)的MULTICS操作系统。直到1969年,因MULTICS计划的工作进度太慢,该计划就被停了下来。当时,Ken Thompson(后被称为Unix之父)已经有一个称为「星际旅行」的程序在GE-635的机器上跑,但是反应非常的慢,正巧也被他发现了一部被闲置的PDP-7(Digital的主机),Ken Thompson和Dernis Ritchie就将「星际旅行」的程序移植到PDP-7上。而这部PDP-7就此在整个计算机历史上留下了芳名。 59 | 60 | MULTICS 其实是"MULTiplexed Information and Computing System"的缩写,在1970年时,那部PDP-7却只能支持两个使用者,当时,Brian Kernighan 就开玩笑地戏称他们的系统其实是:"UNiplexed Information and Computing System",缩写为"UNICS",后来,大家取其谐音,就称其为"Unix"了。1970年可称为是Unix元年。 61 | 62 | 1971年,他们申请了一部PDP-11/20,申请的名义是:要发展文书处理系统。该提案被获采纳,他们也发展出了一套文书处理系统 ─ 就是现在Unix操作系统里面文书处理系统(nroff/troff)的前身。有趣的是,没有多久,贝尔实验室的专利部门真的采用了这套系统作为他们处理文件的工具,而贝尔实验室的专利部门也就顺理成章地成为Unix的第一个正式使用者。当时,那部PDP-11/20只有0.5MB磁盘空间。而描述这整个系统的文件被标示为:"First Edition",版本日期是1970年11月。从此以后,Unix的版本就以系统文件的版别来称呼。 63 | 64 | #### UNIX家谱 65 | 66 | UNIX的历史开始于1969年ken Thompson,Dennis Ritchie(即著名的K&G,C语言的发明人)与一群人在一部PDP-7上进行的一些工作,后来这个系统变成了UNIX。它主要的几个版本为: 67 | 68 | * V1(1971):第一版的UNIX,以PDP-11/20的汇编语言写成。包括文件系统,fork、roff、ed等软件。 69 | * V4(1973):以C语言从头写过,这使得UNIX修改容易,可以在几个月内移植到新的硬件平台上。最初C语言是为UNIX设计的,所以C与UNIX间有紧密的关系。 70 | * V6(1975):第一个在贝尔实验室外(尤其是大学中)广为流传的UNIX版本。这也是UNIX分支的起点与广受欢迎的开始。1.xBSD (PDP-II)就是由这个版本衍生出来的。 71 | * V7(1979):在许多UNIX玩家的心目中,这是“最后一个真正的UNIX,”这个版本包括一个完整的K&RC编译器,Bourne shell。V7移植到VAX机器后称为32V。 72 | 73 | 目前开发UNIX(System V)的公司是Unix System Laboratories (USL)。USL本为AT&T所有,1993年初被Novell收购。Novell于1993年末将UNIX这个注册商标转让给X/Open组织。 74 | 75 | 目前为止,UNIX有两大流派:那就是AT&T发布的UNIX操作系统System V与美国加州大学伯克利分校发布的UNIX版BSD(Berkeley Software Distribution)。SVR4是两大流派融合后的产物。1991年底,与System V针锋相对的开放软件基金会(Open Software Foundation)推出了OSF/1。 76 | 77 | 现在几种主要的UNIX版本: 78 | 79 | * AIX:IBM的UNIX,是根据SVR2(最近已经出到SVR3.2)以及一部分BSD延伸而来,加上各种硬件的支持。具备特有的系统管理(SMIT)。 80 | * 386BSD:Jolitz从Net/2 software移植过来的。支持Posix,32位。 81 | * FreeBSD:1.x从386BSD 0.1而来,FreeBSD 2.x版是用4.4BSD lite改写。 82 | * HP-UX(HP):旧系统是从S III(SVRx)发展面来,现在是由SVR2(4.2BSD)发展而来,目前是10.x版。 83 | * Linux(x86):遵从POSIX,SYSV及BSD的扩展,这一点从上页表中即可看出。 84 | * OSF/1(DEC):DEC对OSF/1的移植。 85 | * SCO UNIX(x86):SVR3.2,目前影响较大的PC UNIX。 86 | * SunOS(680x0,Sparc,i386):根据4.3BSD,包含许多来自System V的东西。Sun的主要成果在于:NFS,OpenLook GUI标准,后来演变为Solaris 。这也是目前最著名的UNIX版本之一。 87 | * Ultrix(DEC):根据4.2BSD再加上许多4.3BSD的东西。 88 | * Xenix(x86):Intel硬件平台上的UNIX,以SVR2为基础,由微软推出。在中国使用较广泛。 89 | 90 | #### 黑暗史 91 | 92 | Unix与Linux,SCO与IBM、微软,他们是怎样纠结在一起,形成一团解不开的乱麻? 93 | 94 | ##### 风起Unix 95 | 96 | 1969年“阿波罗11号”登月成功。贝尔实验室中一个叫Ken Thompson的年轻人为了一圆翱游太空的梦想,在当时的Multics系统上写了一个叫《星际之旅》的游戏。但当时大型机的机时费很贵,每玩一次公司就要为此支付75美金,于是Thompson打起了小型机PDP-7的主意。但当时的PDP-7只有一个简陋的运行时系统,不支持多用户,为了能双人对战,Thompson找来Dennis Ritchie一起开发新的作系统。他们只花了一个月的时间就用汇编语言写出了作系统的原型。“你写的系统太差劲,干脆就叫Unics算了。”60年代末的一天,贝尔实验室的一位同事对肯·汤普生这样说。同事布莱恩·科尔尼干 Brian W.Kernighan看到后,戏称这个系统为Unics②。Unix这个名字典出于此。 97 | 98 | 在英文里,Unics发音与Eunuchs一样,而后者的意思是“太监”。汤普生接下同事的嘲弄,稍作修改,把自己研发的系统叫做Unix。 99 | 100 | 1971年,Unix已经能够支持两名用户在PDP-11上玩《星际之旅》了,但因为当时的Unix是用汇编语言写的,无法移植到其他机器上,所以他们决定用高级语言重写Unix,可当时的高级语言无论从运行效率还是功能上都无法满足他们的需要。Thompson先是在BCPL的基础上萃取出了B语言,Ritchie又在B的基础上进行了重新设计,这才有了今天大名鼎鼎的C语言。 101 | 102 | 60年代的计算机虽然已不是庞然大物了,但体积仍然不小,而且爱出故障。汤普生回忆:“计算让人着迷,电子也让人着迷,只是不太干净,很脏,因为经常有东西被烧坏。” 103 | 104 | 操作这些又慢、又笨的大家伙需要专业的计算机程序员,为了提高效率,急需新系统。在这种背景下,汤普生和丹尼斯·利奇研发了Unix操作系统。此时,乔布斯和盖茨还在中学里搞恶作剧,PC和微软操作系统要在10年后才初露端倪。 105 | 106 | Unix两位创始人和贝尔实验室也没把这套操作系统太当回事,只是在内部使用,后来大学、研究机构也可以免费使用,而且还提供给他们源代码,因此Unix源代码被广为扩散。在这段时间里,它没有像后来的商业软件那样急功近利,留下一堆窟窿和补丁,因此,Unix在诞生后的10年里“养在深闺人未识”,在实验室进行着充分的使用和论证,这也是它后来在要求稳定性、安全性较高的企业级客户中得到推崇的主要原因。 107 | 108 | 到了1980年,Unix开始走出实验室,有数以千计的技术高手想把Unix装在家里的机器上。 109 | 110 | 此时,后知后觉的贝尔实验室开始认识到Unix的价值,但由于源代码早已外散,无法将其拢起来进行精细的商业开发,于是干脆采取对外授权的模式,研究机构使用免费,企业使用要交授权费,这有些金矿当做铜矿卖的味道。一位贝尔高级主管曾感慨:“Unix是继晶体管以后的第二个最重要发明。”但贝尔实验室错失商业发展机遇。 111 | 112 | “幸运的时机好比市场上的交易,只要你稍有延误,它就掉价了。”培根在《论时机》中这样写到。当时有多家大学、研究机构和公司获得了Unix授权,并由此开始了各自不同的版本演化之路。1993年,拥有贝尔实验室的美国电话电报公司(AT&T)将自己所拥有的Unix权利卖给Novell,后者成为接受Unix衣钵的合法继承人。当然此时的IBM、DEC、HP和Sun因为早年的授权缘故,有权继续进行各自的Unix版本的研发。 113 | 114 | 1995年,Novell又将Unix相关资产卖给SCO。和两年前AT&T把Unix卖给Novell一把清的局面有所不同,SCO当时没有足够的现金一次性付清,因此Novell初期只是把Unix源代码交给了SCO,对于Unix著作权的归属协议存在着语焉不详和模棱两可的地方。 115 | 116 | 花了钱的SCO宣传自己是Unix正宗传人,Novell当时视Unix为鸡肋,没有异议,而且此时SCO没有对别的获得过Unix授权的厂商置喙,于是大家进入了一段相安无事的时期。 117 | 118 | 119 | ##### 微软的进进出出 120 | 121 | 八十年代末,有人问比尔·盖茨怎么看待Unix与微软构成的竞争,他笑着问道:“哪个Unix?”微软与Unix的关系源远流长,并对SCO的演变起了重要的催化作用。1979年,微软从美国电话电报公司获得授权,为Intel处理器所开发一种Unix操作系统,由于它购买的授权无法直接让该操作系统以“Unix”为名,于是该系统命名为Xenix,可用在个人电脑及微型计算机上使用。微软并不直接把Xenix销售给终端客户,而是以OEM的形式再授权给Intel、Tandy、施乐Altos及SCO公司。 122 | 123 | 对于微软来说,由于需要从美国电话电报公司获得授权,因而这是一种自己难以把握其未来发展命运的操作系统,而且当时其他厂商不同的版本在搅浑这个市场,所以,盖茨在寻找机会退出这个领域。当微软和IBM达成开发OS/2操作系统的协议后,盖茨便失去了推广Xenix的兴趣。 124 | 125 | 多年后的历史资料揭秘显示,微软当时脚踩多条船,除和IBM联手开发OS/2操作系统外,微软还在紧锣密鼓地进行着Windows 3.0系统的研发。微软不可能在三条线上同时投入精力,于是决定舍弃Xenix操作系统。 126 | 127 | “赛车和做人一样,有时候要停,有时候要冲。”这是电视剧《极速传说》中的一句台词。1987年,微软与SCO达成了一项协议,以持有后者股票25%的条件转让了Xenix的所有权。从微软接盘的SCO,将这种操作系统以最快速度移植到386电脑,成为首款支持Intel386芯片的操作系统,抓住了市场的先机。 128 | 129 | 当时的市场格局是这样,小型机加五花八门的Unix操作系统把持了高端的企业级用户市场,其中的代表厂商是IBM、DEC、惠普、SUN、SGI等;Intel芯片加微软操作系统,正在全面控制个人电脑市场,其中的代表厂商包括康柏、AST、佰德等。小型机加Unix操作系统的阵营鄙视Intel芯片加微软操作系统形成的Wintel联盟,前者认为后者简陋,而后者则认为前者是老化顽固。 130 | 131 | SCO此时扮演的角色有点像“蝙蝠”,非鸟非兽,它的运营模式是Intel芯片加Unix操作系统,在两大阵营间翩翩飞。随着装有Intel芯片电脑的攻城略地,SCO也跟着分到一杯羹。80年代末,有媒体称Xenix为“可能是传播最广的UNIX操作系统”。 132 | 133 | 134 | SCO进入了其发展史上最辉煌的时期。当然这段时间,Unix的发展也进入了黄金期。1984年9月《财富》杂志称,全球范围内750所大学中80%的计算机领域的教授是Unix用户,因此当时计算机专业毕业的学生都接触过Unix,他们毕业后成为IT领域的骨干。 135 | 136 | 盖茨抛弃了Unix,但没打算抛弃这块丰饶的市场,而且SCO的成功也刺激了他:自己扔掉的一块鸡肋竟然成了这个小跟班的肥美牛排。换谁不流口水啊?有句谚语是“别让口馋的人看见你的大碗”。 137 | 138 | Unix有个致命缺陷:从来就没有通用版存在。多年以来,由于早期混乱的授权,五花八门、不同版本的Unix遍地开花,所以为其中一个版本写的应用程序,常常要修改后才能运用到另一个上,这对于专业的程序员来说也许不是太大问题,但对技术实力较弱的用户来说,则平添了许多麻烦。 139 | 140 | 从Unix脱身而出的盖茨深知其支离破碎的弱点,他下令微软打造一款“可移植的”的操作系统——“Unix杀手”。这就是微软的Windows NT,包括SCO在内的Unix阵营将感受到它带来的巨大压力。 141 | 142 | 歌手鲍勃·迪伦在《时代在转变》一诗中写到:“动笔预言世事的作家与评论家们,张大你们的双眼,机会不会再来第二遍,轮盘还在旋转,先别言之过先,看不出来谁会被选,因为目前的输家未来会领先,因为时代正在改变。” 143 | 144 | ##### 强悍对手逆袭 145 | 146 | “我不会用狗屎去污染(NT)”。Windows NT研发负责人大卫·卡特勒这样高声地嚷着,他拒绝允诺新一代的操作系统兼容已有的DOS和Windows。原来,定下“Unix杀手”计划后,盖茨准备组织一个团队来完成这项工作。“我太想要一个可移植的操作系统了,”盖茨说,“问题不在于我们是否应该组成团队,而在于何时能组成团队去开发它。” 147 | 148 | 随后机会来了,DEC的核心工程师卡特勒因在公司坐冷板凳而萌生去意。“大多数人学会如何把一件事做得很漂亮以后,便一生一直做这个,”卡特勒一个同事评价他:“卡特勒会从自己的成功中学习。下一次,他会做得更好。所以每次,他都上升到一个新的高度。” 149 | 150 | 卡特勒全身心地投入程序开发,而冷落了两任妻子,后来他发誓再也不会结婚,“结婚是一个错误,你只能犯两次错”。卡特勒在程序开发上精益求精,“对可能干扰他的任何人和事,他不仅置之不理,而且还会对其进行攻击和诋毁”,因此,他与DEC公司高管们相处得很不愉快。 151 | 152 | 盖茨亲自拜会卡特勒,想让他加盟微软。初次见面,卡特勒就给盖茨一个下马威,直言不讳地称微软的代码写得很“烂”,认为盖茨当时捧在手心里的、深以为傲的DOS,在他的眼里就是一个玩具。卡特勒说只有自己才有能力开发出一个能面向未来进行网络管理、具有高可靠性的操作系统。 153 | 154 | 此时的盖茨已走过创业期,拥有海量的财富与强势的权力,耳边吹过的都是“软件神童”的悦耳之音。不过,卡特勒的刺耳之音和轻蔑态度反而坚定了盖茨聘请他的决心,盖茨向对方表示将给予充分的发展空间和自由。励志大师戴尔·肯耐基说:“在世界上,要影响别人的惟一办法就是谈论他们的需要,并告诉他们去如何满足这些需要。” 155 | 156 | 卡特勒到微软之后,盖茨尽可能地满足他的要求,有些甚至是打破微软惯例的。譬如卡特勒不要微软原来的工程师参与他的团队,他把自己在DEC工作时的团队带了过来,其中有些是硬件工程师,是卡特勒的好友。盖茨原来不打算要,但卡特勒威胁不让他们来,自己就不来。 157 | 158 | 盖茨让步,满足了卡特勒所需要的一切。此前,控制欲极强的盖茨会亲自检查微软的大部分代码,在他刨根揭底地穷问下,程序员有时会露出破绽,这时盖茨会不留情面地痛斥,带有攻击性言语,譬如“这是有史以来最愚蠢的代码”会劈头盖脸地砸过去。但盖茨对卡特勒的项目则放手到几乎“放任自流”的地步。Airbnb联合创始人兼CEO布莱恩·切斯基说过:“你有时候必须靠边站,如果你要插手细节,你会很痛苦。但是你要是站得远一点,你就能看清大局。” 159 | 160 | 161 | 盖茨识才的眼光和用人不疑的态度,最终得到了丰厚的回报,1993年,Windows NT完美亮相,成为微软撬动Unix市场的一把利器。卡特勒也获得了Windows NT之父的赞誉,在微软发展史上占有一席之地。罗杰•福尔克在《漫谈企业管理》中提到:“一个人只有处在最能发挥其才能的岗位上,他才会干得最好。”盖茨自己在这一时期说过:“对我来说,跟一伙聪明的工程师一起工作,研发出产品,然后你走出去看到人们确实在使用它们,这才是更大的乐趣所在。” 162 | 163 | 在包括SCO在内的Unix阵营开足马力贬低Windows NT之时,Windows NT却在高端市场上大步前进,SCO则开始走下坡路。 164 | 165 | “节物风光不相待,桑田碧海须臾改。”在微软与Unix阵营的对手进行车轮战的同时,一股新的力量在生成并变得强大起来,左右了战局的发展方向。这就是Linux。 166 | 167 | 起初盖茨认为Linux无足轻重,但大量的用户不这样认为,他们对Linux投去青睐的目光,因为Linux公开授权,允许用户销售、拷贝并且改动程序,只不过要求修改后的代码也免费公开,这些举措成了Linux蔓延的强大推力,并给微软带来了强烈的冲击。 168 | 169 | Linux的存在给了对微软一直心存敌意的对手们一把雪耻的利刃,包括IBM、Oracle、Sun等业界大鳄,纷纷表示扶持Linux,并以各种方式支持Linux,向陷住微软战靴的泥潭灌进去更多的水。微软一度陷入了被动的局面。但随着Linux的发展,战局发生了微妙的变化。 170 | 171 | 在一个公开场合,盖茨表示:“受到Linux蚕食的是Unix,而不是Windows。”他说:“我们确实在与Linux竞争,但转换到Linux的Unix市场是相当可观的。Windows和Linux将共同主导市场。” 172 | 173 | 市场分析机构Gartner也宣称,Linux和开放源代码会继续发展,但它们所掠夺的是Unix而不是微软的领地。与Unix有着千丝万缕联系的Linux,竟然扮演了Unix终结者的角色? 174 | 175 | 这是因为Unix操作系统价格比微软的产品更高,市场份额也更少,受到Linux的冲击也更大,靠着Unix吃饭的SCO对此感同身受。一位Linux厂商技术总监曾放话:“SCO Unix的生命周期已经结束了,系统移植是必然的。” 176 | 177 | 与其坐以待毙,不如奋力一击。进入21世纪后,日渐式微的SCO开始策划一出震惊IT业界的大戏。 178 | 179 | ##### 车轮诉讼大战 180 | 181 | “在过去的18个月,我们发现IBM把一些极其高端的企业运算技术的源代码公开了。其中部分看上去与我们拥有知识产权的技术非常相似,违反了我们与IBM之间的协议。他们的行为之间破坏了我们之间不公开这部分技术的协议,单方面公开了源代码。我们有证据表明部分代码是逐字的抄袭。”2003年5月,SCO的CEO达尔·麦克布莱德这样说。 182 | 183 | SCO控告IBM的Linux破坏了双方之前签订的软件代码授权协议,声称IBM免费散发有知识产权的代码,把一些Unix的代码改头换面后加入Linux产品中,因此要求蓝色巨人赔偿自己10亿美元。“初寒冻巨海,杀气流大荒。”此举在Linux阵营炸开了锅,他们认为SCO此举为“项庄舞剑,意在沛公”,最终目标是挟制整个Linux阵营。 184 | 185 | 随后,微软的动作让这个局面变得混乱起来。起诉IBM后不久,SCO宣布向微软发放Unix技术许可,包括专利权和源代码。就是说,微软以花钱买购买SCO的Unix技术许可权的方式,承认了对方Unix合法传人的地位。 186 | 187 | 布鲁斯·佩伦斯称:“对于微软来说,购买SCO的源代码授权几乎没有任何意义。花钱购买SCO公司的授权,只不过是对一种‘行贿’行为的粉饰,顺便还对未来的Linux用户进行恫吓。可谓一石双鸟!很难想象微软的前对手SCO能为比尔·盖茨冲锋陷阵,但是,微软的钱改变了一切。” 188 | 189 | Linux阵营担心的就是这一点,微软此举强化了SCO的Unix“权威地位”,增强了SCO挑战IBM的决心。一旦SCO拿下IBM,就打开了一个收钱口袋,其他推行Linux的厂商只有乖乖纳贡。 190 | 191 | 而且使用Linux的广大商业用户也面临着被追索的危机,更多的潜在用户将会对Linux望而生畏,这非常符合微软一直针对Linux实施的心理战战术,让用户在恐惧、不确定、怀疑的状态下对Linux敬而远之。考虑到历史上微软与SCO复杂的关系,人们怀疑二者在密谋,认为SCO在扮演为微软火中取栗的角色。2004年初,麦克布莱德警告:全球一些大公司由于使用了Linux将可能很快面临诉讼,其中包括英国石油、西门子和富士通。就是说,SCO的诉讼风暴即将席卷全球。 192 | 193 | 借着SCO对Linux阵营的压力,2004年11月,微软CEO鲍尔默在新加坡举行的一个高级别政府论坛上表示,Linux侵犯了至少228项专利,不过他并没有明确表示侵犯了哪些专利。他说:“对于那些已经加入世界贸易组织的国家而言,使用Linux就意味着有一天会有人过来向你收取专利费。” 194 | 195 | 196 | 2005年1月,美国法院判决IBM交出20亿行的程序代码给SCO,消息传出后,SCO股价暴涨20%。 197 | 198 | SCO似乎可以动手敛钱了,然而风云又变,半路杀出一个程咬金。Novell公司站了出来,称自己才是Unix版权的合法拥有者,说自己当年没有把Unix版权卖给SCO,SCO也只是个授权使用者,并且要对方把从微软和Sun收到的授权许可费给吐出来。 199 | 200 | 于是,SCO又和Novell公司干上了,开始了法庭上的互有胜负的对峙。 201 | 202 | ##### 树敌过多后的破产 203 | 204 | “SCO公司在诉讼过程中树敌过多。”业内人士温伯格这样表示。连年诉讼耗尽了SCO资源,公司重点也没有放在业务上,话又说回来,其Unix业务已日薄西山,也没啥好继续开展的了。 205 | 206 | 2007年8月,美国犹他州地方法院一名法官裁定,Unix操作系统的版权归属于Novell,而不是SCO。这意味着SCO需要向Novell支付数百万美元的赔偿。 207 | 208 | 此举也意味着,SCO在与IBM进行的法律大战中失去胜算。Linux阵营头顶的乌云也随即散去。这年12月27日,SCO正式被纳斯达克摘牌。 209 | 210 | 芥川龙之介说过:人生好比一盒火柴,严禁使用是愚蠢的,滥用则是危险的。 211 | 212 | 213 | ![002](pic/002.jpg) 214 | 215 | ### Minix 216 | 217 | Minix原来是荷兰阿姆斯特丹的Vrije大学计算机科学系的Andrew S. Tanenbaum教授所发展的一个类Unix操作系统。全部的程序码共约12,000行,并置于他的著作Operating Systems: Design andImplementation(ISBN 0-13-637331-3)的附录里作为范例。Minix的系统要求在当时来说非常简单,只要三片磁片就可以启动。Minix原始是设计给1980年代到1990年代的IBM PC和IBM PC/AT兼容电脑上执行。1.5版也有移植到以Motorola 68000系列CPU为基础的电脑上(如Atari ST,Amiga,和早期的Apple Macintosh)和以SPARC为基础的机器(如升阳sun公司的工作站)。2.0版则只有x86架构的版本。 218 | 219 | 因为AT&T的政策改变,在Version 7 Unix推出之后,发布新的使用条款,将UNIX源代码私有化,在大学中不再能使用UNIX源代码。塔能鲍姆教授为了能在课堂上教授学生操作系统运作的实务细节,决定在不使用任何AT&T的源代码前提下,自行开发与UNIX兼容的操作系统,以避免版权上的争议。他以小型UNIX(mini-UNIX)之意,将它称为MINIX。 220 | 221 | 全套Minix除了起动的部份以汇编语言编写以外,其他大部份都是纯粹用C语言编写。分为:内核、内存管理及档案管理三部份。 222 | 223 | #### 与Linux的关系 224 | 225 | 如果想了解类Unix系统的内部工作情况,学生可以在他们自己的电脑上运行Minix。据报道,即使是毫无经验的学生也能在几个月的典型培训课程的学习中获得对整个系统的很好的了解。Minix最有名的学生用户是Linus Torvalds,他在芬兰的赫尔辛基大学用Minix操作平台建立了一个新的操作系统的内核,他把它叫做Linux。 226 | 227 | Linux是其作者受到Minix的影响而作成的(Linus Torvalds不喜欢他的386电脑上的MS-DOS操作系统,安装了Minix,并以它为样本开发了原始的Linux内核)。但在设计哲学上,Linux则和Minix大相迳庭。Minix在内核设计上采用微内核的原则,但Linux则和原始的Unix相同都采用宏内核的概念。在Linux发展之初,双方还于1992年在新闻组上有过一场精彩的理念争论。Minix的作者和支持者认为Linux的单内核构造是“向七十年代的大倒退”,而Linux的支持者认为Minix本身没有实用性。 228 | 229 | 230 | #### 授权方式 231 | 232 | 在授权方式上,Minix的版权宣告在早期被认为是相当自由的,在作者Andrew S. Tanenbaum希望拿Minix作为一个公开的教材与出版社希望保护程序码著作财产权的平衡下,它只要求一个相当低的授权费。但因为它并不是一个开放源码的授权方案,所以志愿工作者在以GPL方式散布的Linux核心出现后就多转向Linux平台。而Unix也在柏克莱系统与AT&T达成协议后,出现了以BSD 授权散布的FreeBSD开放平台。Minix虽然在2000年改用BSD 授权,但这时其它的操作系统在功能上大幅超越了它,而它失去了发展成一个广泛使用的操作系统的机会,只留下,如它的作者Andrew S. Tanenbaum,原来期望的,作为一个开放的教材的用途。 233 | 234 | ![003](pic/003.jpg) 235 | 236 | 237 | ### GUN 238 | 239 | GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。Richard Stallman最早是在net.unix-wizards新闻组上公布该消息,并附带《GNU宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General PublicLicense,GPL)。即“反版权”(或称Copyleft)概念。 240 | 241 | #### 历史 242 | 243 | 1985年Richard Stallman又创立了自由软件基金会(Free Software Foundation)来为GNU计划提供技术、法律以及财政支持。尽管GNU计划大部分时候是由个人自愿无偿贡献,但FSF有时还是会聘请程序员帮助编写。当GNU计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持。当中最著名的就是之后被Red Hat兼并的Cygnus Solutions。 244 | 245 | 到了1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs[1] 。GCC(GNUCompiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。以及大部分UNIX系统GNU操作系统的内核Linux的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。 246 | 247 | 1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。Linux之后在网上广泛流传,许多程序员参与了开发与修改。1992年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。该操作系统往往被称为“GNU/Linux”或简称Linux。(尽管如此GNU计划自己的内核Hurd依然在开发中,已经发布Beta版本。) 248 | 249 | 许多UNIX系统上也安装了GNU软件,因为GNU软件的质量比之前UNIX的软件还要好。GNU工具还被广泛地移植到Windows和Mac OS上。 250 | 251 | #### 协议条款 252 | 253 | GNU 包含3个协议条款: 254 | 1. GPL:GNU通用公共许可证(GNU General Public License) 255 | 2. LGPL:GNU较宽松公共许可证 (GNU Lesser General Public License), ) ,旧称 GNU Library General Public License (GNU 库通用公共许可证); 256 | 3. GFDL : GNU自由文档许可证(GNU Free Documentation License )的缩写形式。 257 | 258 | 这里指的自由,并不是价格免费,这和价格无关而是使用软件对所有的用户来说是自由的。 259 | 260 | 通过如下途径实现这一目标: 261 | 262 | 1. 它要求软件以源代码的形式发布,并规定任何用户能够以源代码的形式将软件复制或发布给别的用户。 263 | 2. 如果用户的软件使用了受 GPL 保护的任何软件的一部分,那么该软件就继承了 GPL 软件,并因此而成为 GPL 软件,也就是说必须随应用程序一起发布源代码。 264 | 3. GPL 并不排斥对自由软件进行商业性质的包装和发行,也不限制在自由软件的基础上打包发行其他非自由软件。 265 | 266 | 由于GPL很难被商业软件所应用,它要求调用它的库的代码也得GPL,全部开放,并且一同发布,不能直接连接。所以后来GNU推出了LGPL许可证 267 | 268 | 在GPL与LGPL许可证保护下发布源代码的结果很相似,对旧代码所做的任何修改对于想知道这些代码的人必须是公开的,唯一真正的不同之处在于私人版权代码是否可以与开放源代码相互连接,LGPL允许实体连接私人代码到开放源代码,并可以在任何形式下发布这些合成的二进制代码。只要这些代码是动态连接的就没有限制。(使用动态链接时,即使是程序在运行中调用函数库中的函数时,应用程序本身和函数库也是不同的实体) 269 | 270 | #### 自由软件 271 | 272 | “自由软件” 是权利问题,不是价格问题。要理解这个概念,自由应该是“言论自由”中的“自由”,而不是“免费啤酒”中的“免费”。 273 | 274 | 自由软件关乎使用者运行、复制、发布、研究、修改和改进该软件的自由。 更精确地说,自由软件赋予软件使用者四种自由: 275 | 276 | 1. 不论目的为何,有运行该软件的自由(自由之零)。 277 | 2. 有研究该软件如何运行,以及按需改写该软件的自由(自由之一)。取得该软件源代码为达成此目的之前提。 278 | 3. 有重新发布拷贝的自由,这样你可以借此来敦亲睦邻(自由之二)。 279 | 4. 有改进该软件,以及向公众发布改进的自由,这样整个社群都可受惠(自由之三)。取得该软件源码为达成此目的之前提。 280 | 281 | ![004](pic/006.jpg) 282 | 283 | ### Linux 284 | 285 | Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。 286 | 287 | 严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。 288 | 289 | #### Linux简史 290 | 291 | Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU计划、POSIX 标准和Internet 网络。 292 | 293 | 1981 年IBM公司推出微型计算机IBM PC。 294 | 295 | 1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。 296 | 297 | 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。 298 | 299 | 1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell 软件了。 300 | 301 | 1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。 302 | 303 | 1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-like kernel sources for 386-AT)。 304 | 305 | 1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。 306 | 307 | 1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。 308 | 309 | 1995年1月,Bob Young创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux"发行版",在市场上出售。这在经营模式上是一种创举。 310 | 311 | 1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux已经进入了实用阶段,全球大约有350万人使用。 312 | 313 | 1998年2月,以Eric Raymond为首的一批年轻的"老牛羚骨干分子"终于认识到GNU/Linux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了"Open Source Intiative"(开放源代码促进会)"复兴"的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。 314 | 315 | 2001年1月,Linux 2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。 316 | 317 | 2003年12月,Linux 2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。 318 | 319 | 2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”, Asianux,MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。 320 | 321 | ![005](pic/004.jpg) 322 | 323 | ![006](pic/005.jpg) -------------------------------------------------------------------------------- /03-Linux文件和目录.md: -------------------------------------------------------------------------------- 1 | # Linux 文件和目录 2 | 3 | [TOC] 4 | 5 | ## Linux 目录 6 | 7 | ### Linux 目录配置的依据 --FHS 8 | 9 | 因为利用 Linux 来开发产品或 distributions 的社区 / 公司或个人实在太多了 , 如果每个人都用自己的想法来配置文件放置的目录 , 那将可能造成很多管理上的困扰。 你能想象 , 你进入一个企业之后 , 所 接触到的 Linux 目录配置方法竟然跟你以前学的完全不同吗 ? 很难想象吧 ~ 所以 , 后来就有所谓的Filesystem Hierarchy Standard (FHS) 标准的出炉了 ! 10 | 11 | 根据 FHS(http://www.pathname.com/fhs/) 的官方文件指出 , 他们的主要目的是希望让使用者可以了解到已安装软件通常放置在哪个目录下 , 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户 , 都能够遵循 FHS 的标准。 也就是说 ,FHS 的重点在于规范每个特定的目录下应该存放什么样子的数据而已。 12 | 13 | 亊实上 ,FHS 是根据过去的经验一直再持续的改版的 ,FHS 依据文件系统使用的频繁与否允许使用者随意更动 , 而将目录定义成为四种交互作用的形态 , 用表格来说有点像底下这样 : 14 | 15 | 16 | 17 | | | 可分享的 (shareable) | 不可分享的 (unshareable) | 18 | | :-------------- | :---------------------- | :------------------ | 19 | | 不变的 (static) | /usr ( 软件放置处 ) | /etc ( 配置文件 ) | 20 | | | /opt ( 第三方协力软件 ) | /boot ( 开机不核心档 ) | 21 | | 可变动的 (variable) | /var/mail ( 使用者邮件信箱 ) | /var/run ( 程序相关 ) | 22 | | | /var/spool/news ( 新闻组 ) | /var/lock ( 程序相关 ) | 23 | 24 | 25 | 26 | ![02](pic/02.png) 27 | 28 | 29 | 30 | ### 目录树 31 | 32 | 在类 Unix 系统中并不存在 C/D/E/F 盘符,一切的文件都是从 “ 根 (/)” 目录开始的并按照文件系统目录标准 FHS 采用树形结构来存放文件并定义了每个区域的用途。 33 | 34 | 目录名称严格的区分大小写,例如 root 、 rOOt 、 Root 、 rooT 等等均代表是不同的独立目录,并且名称中不得包含反斜杠 (/) 。 35 | 36 | ![04](pic/04.png) 37 | 38 | 主要常见的目录定义: 39 | 40 | | 目录名称 | 应放置文件的内容 | 41 | | :---------- | :------------------------------- | 42 | | /boot | 开机所需文件 —— 内核,开机菜单及所需配置文件等 | 43 | | /dev | 任何设备与接口都以文件形式存放在此目录 | 44 | | /etc | 配置文件 | 45 | | /home | 用户主目录 | 46 | | /bin | 单用户维护模式下还能够被操作的命令 | 47 | | /lib | 开机时用到的函数库及/bin 与/sbin 下面命令要调用的函数 | 48 | | /sbin | 开机过程中需要的 | 49 | | /media | 一般挂载或删除的设备 | 50 | | /opt | 放置第三方的软件 | 51 | | /root | 系统管理员的主文件夹 | 52 | | /srv | 一些网络服务的数据目录 | 53 | | /tmp | 任何人均可使用的 “ 共享 ” 临时目录 | 54 | | /proc | 虚拟文件系统,例如系统内核,进程,外部设备及网络状态等 | 55 | | /usr/local | 用户自行安装的软件 | 56 | | /usr/sbin | 非系统开机时需要的软件/命令/脚本 | 57 | | /usr/share | 帮助与说明文件,也可放置共享文件。 | 58 | | /var | 主要存放经常变化的文件,如日志。 | 59 | | /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里1.3 路径 | 60 | 61 | 另外一个重要的概念 “ 路径 ” ,这个路径指的是如何找到某个文件,分为 “ 绝对路径 ” 与 “ 相对路径 ” : 62 | 63 | * 绝对路径 (absolute): 由根目录 (/) 开始写起的目录或文件名 64 | * 相对路径 (relative): 相对于当前路径的写法 65 | 66 | 举例来说一个客人想找下厕所,你有两种回答的方法。 67 | 68 | * 绝对路径:首先坐车来到你家,到了你家后,右手边第一个房间就是厕所。 69 | * 相对路径:前面右拐第一个房间。 70 | 71 | 如果你说的是绝对路径,那么任何客人都可以按照这个提示找到你家的厕所,但缺点是过于繁琐,如果说的是相对路径,那么这个人并不是在每个路口右转都能找到厕所,缺点是不具备普遍性。 72 | 73 | ```shell 74 | [root@rhel7 ~]# cd /etc/sysconfig/network-scripts/ 75 | [root@rhel7 network-scripts]# pwd 76 | /etc/sysconfig/network-scripts 77 | [root@rhel7 network-scripts]# cd ../modules 78 | [root@rhel7 modules]# pwd 79 | /etc/sysconfig/modules 80 | ``` 81 | 82 | ## 文件属性 83 | 84 | 类 Unix 系统的设计初衷就是为让多用户同时工作,所以也迫使 Linux 系统有了极强的安全性。接下来我们一起来看看 linux 系统示如何实现安全性的。 85 | 86 | ```shell 87 | [root@rhel7 tmp]# ll / 88 | total 4148 89 | lrwxrwxrwx. 1 root root 7 May 5 17:28 bin -> usr/bin 90 | dr-xr-xr-x. 4 root root 4096 May 5 17:40 boot 91 | drwxr-xr-x. 15 root root 4096 Aug 19 13:19 content 92 | -rw------- 1 root root 2166784 Aug 8 05:24 core.2052 93 | -rw------- 1 root root 19017728 Aug 8 05:27 core.2488 94 | drwxr-xr-x 19 root root 3380 Oct 26 12:22 dev 95 | drwxr-xr-x. 138 root root 12288 Oct 26 12:22 etc 96 | drwxr-xr-x. 4 root root 31 Aug 23 17:32 home 97 | lrwxrwxrwx. 1 root root 7 May 5 17:28 lib -> usr/lib 98 | lrwxrwxrwx. 1 root root 9 May 5 17:28 lib64 -> usr/lib64 99 | drwxr-xr-x. 2 root root 6 May 25 2015 media 100 | drwxr-xr-x. 2 root root 6 May 25 2015 mnt 101 | drwxr-xr-x. 4 root root 36 May 6 13:19 opt 102 | dr-xr-xr-x 229 root root 0 Oct 26 2016 proc 103 | dr-xr-x---. 26 root root 4096 Oct 12 14:11 root 104 | drwxr-xr-x 39 root root 1200 Oct 26 12:24 run 105 | lrwxrwxrwx. 1 root root 8 May 5 17:28 sbin -> usr/sbin 106 | drwxr-xr-x. 2 root root 6 May 25 2015 srv 107 | dr-xr-xr-x 13 root root 0 Oct 26 2016 sys 108 | drwxrwxrwt. 31 root root 4096 Oct 26 12:42 tmp 109 | drwxr-xr-x. 13 root root 4096 May 5 17:28 usr 110 | drwxr-xr-x. 23 root root 4096 Oct 26 2016 var 111 | ``` 112 | 113 | 第二字段,文件硬链接数或目录子目录数 114 | 115 | ### 文件的分类 116 | | 文件 | | 操作 | 117 | | :------ | :------------- | :--------------------------------- | 118 | | 普通文件 | 纯文本档 (ASCII) | touch file | 119 | | | 二进制文件 (binary) | | 120 | | | 数据格式文件 (data) | | 121 | | 目录 | (directory) | mkdir dire | 122 | | 连结档 | (link) | ln file hfile | 123 | | | | ln -s file sfile | 124 | | | | ln -s 'pwd'/file ssfile 绝对路径的软链接文件 | 125 | | 设备与装置文件 | (device) | mknod bfile b 252 0 块设备 | 126 | | | | mknod cfile c 4 2 字符设备 | 127 | | 数据输送文件 | (FIFO, pipe) | mkfifo pfile 管道文件 | 128 | | 资料接口文件 | (sockets) | mksock sfile sock 文件 | 129 | 130 | -: 普通文件, d: 目录文件, l: 链接文件, b: 块设备文件, c: 字符设备文件, p: 管道文件 131 | 132 | ### 一般权限 UGO 133 | 134 | Linux 系统中一切都是文件,文件和目录的所属与权限 —— 来分别规定所有者、所有组、其余人的读,写,执行权限。 135 | 136 | 读 (read) ,写 (write) ,执行 (execute )简写即为 (r,w,x) ,亦可用数字 (4,2,1) 表示 137 | 138 | | 权限 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 | 139 | | :--- | :---- | :--- | :--- | :---- | :--- | :--- | :--- | :--- | :--- | 140 | | 字符表示 | r | w | x | r | w | x | r | w | x | 141 | | 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | 142 | | 权限分配 | 文件所有者 | | | 文件所属组 | | | 其他用户 | | | 143 | 144 | 145 | 举例 : 如果某文件权限为 7 则代表可读,可写,可执行 (4+2+1) 。若权限为 6(4+2) 则代表可读,可写。那么权限为 5 与 3 时分别代表了什么? 146 | 147 | 答案:权限为 5 代表可读 (4) 和可执行 (1) 。而权限为 3 代表可写 (2) 和可执行 (1) 。 148 | 149 | --- 150 | 151 | 文件的权限为 rw-r–r– 也就是分别表示所有者 ( 属主 ) 有读写权限,所有组 ( 属组 ) 有读权限,其余人也仅有读权限。 152 | 153 | 这个时候发现问题了吗?对于目录文件的读和写权限我们还可以理解,目录要能执行操作? 154 | 155 | 156 | 普通文件即实际保存数据的地方,其并不具备删除自身的权限: 157 | 158 | * r: 可读取文件的实际内容 159 | * w: 可编辑 / 新增 / 修改该文件的实际内容 160 | * x: 可被执行 161 | 162 | 目录文件即保存有目录结构和文件权限: 163 | 164 | * r: 可读取目录结构和权限 165 | * w: 可更改目录结构列表、新建 / 删除 / 重命名 / 转移子文件 / 目录。 166 | * x: 表示用户可进入到该目录中 167 | 168 | ### 特殊权限 suid\sgid\sticky 169 | 170 | 单纯对文件位置的 rwx 权限肯定不能满足我们对安全、便捷工作的需求,所以便有了 SUID 与 SGID 的特殊权限机制。 171 | 172 | SUID 173 | * 范围 : 二进制的可执行的文件 174 | * 作用 : 临时拥有所有者的权限 175 | 176 | SGID 177 | * 范围 : 目录或者拥有可执行权限的文件 178 | * 作用 : 继承目录所属组 179 | 180 | SBIT ( STICKY ) 181 | * 范围 : 目录 182 | * 作用 : 只有 root 用户和文件拥有者有权删除目录中的文件。 183 | 184 | 185 | SUID 186 | 187 | 比如: 188 | `-rwsr-xr-x. 1 root root 27832 Jan 30 2014 /usr/bin/passwd` 189 | 190 | 所有用户都可以执行用于修改用户密码的 passwd 命令,但用户密码保存在 /etc/shadow 文件中,默认权限是 000 即除了超级用户 root 外的所有用户都没有查看或编辑该文件的权限,所以对 passwd 命令加上SUID 权限位,则可让普通用户临时获得程序所有者的身份,即以 root 用户的身份将变更的密码信息写入到 shadow 文件中。 191 | 192 | `---s--x--x. 1 root root 130712 Sep 1 2015 sudo` 193 | 194 | SGID: 195 | 196 | 功能一:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序设置) 197 | 198 | 举例: 199 | ```shell 200 | -r-xr-sr-x. 1 root tty 201 | -rwxr-sr-x. 1 root tty 202 | 15344 Jan 27 2014 wall 203 | 19536 Aug 21 2015 write 204 | ``` 205 | 206 | 功能二:在该目录中创建的文件自动继承此目录的用户组(只可以对目录设置) 207 | 208 | 比如:我们将某个部门的工作目录给予了 SGID 权限,这样所有人创建的文件都归相同的工作组,这样方便以后的管理。 209 | 210 | SBIT(Sticky Bit): 211 | 212 | 比如: 213 | `drwxrwxrwt. 7 root root 4096 Jun 22 13:20 /tmp` 214 | 215 | 一般老师希望学生可以将作业上传到某个特定目录 —— 但为了避免某些小破坏份子,想限制删除其他人文件的话,那就要设置 SBIT 位了,当然也可以叫做特殊权限位之粘滞位。 216 | 217 | ### 隐藏属性 ATTR 218 | 219 | 文件权限除了 UGO 读写执行与 SUID 、 SGID 、 SBIT 外还有一种隐藏权限,例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很 “ 奇怪 ” 的文件,就要怀疑是文件被设置隐藏权限了。 220 | 221 | chattr 命令用于设置文件的隐藏权限,格式为: “ chattr [ 参数 ] 文件 ” 。 222 | 223 | | 参数 | 作用 | 224 | | :--- | :---------------------------------- | 225 | | i | 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除。 | 226 | | a | 仅允许补充(追加)内容.无法覆盖/删除(Append Only)。 | 227 | | S | 文件内容变更后立即同步到硬盘(sync)。 | 228 | | s | 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)。 | 229 | | A | 不再修改这个文件的最后访问时间(atime)。 | 230 | | b | 不再修改文件或目录的存取时间。 | 231 | | D | 检查压缩文件中的错误。 | 232 | | d | 当使用 dump 命令备份时忽略本文件/目录。 | 233 | | c | 默认将文件或目录进行压缩。 | 234 | | u | 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复。 | 235 | | t | 让文件系统支持尾部合并(tail-merging)。 | 236 | | X | 可以直接访问压缩文件的内容。 | 237 | 238 | lsattr 命令用于显示文件的隐藏权限,格式为: “ lsattr [ 参数 ] 文件 ” 。 239 | 240 | | 参数 | 作用 | 241 | | :--- | :------------------------ | 242 | | a | 显示所有文件和目录。 | 243 | | l | 显示隐藏属性的全称(默认简写成一个字母)。 | 244 | | R | 递归处理,将指定目录下的所有文件及子目录一并处理。 | 245 | | d | 若目标文件为目录,请加此参数。 | 246 | 247 | 具体用法见第三章节 248 | 249 | ### 文件访问控制列表 ACL 250 | 251 | 不知大家有没有发现其实上面讲解的 rwx 权限、特殊权限、隐藏权限都是对某一类用户设置的,而如果希望对某个指定的用户进行单独的权限设置,那么就需要用文件的访问控制列表来实现啦。 252 | 253 | 我们可以基于普通文件或目录设置进行设置 ACL ,通俗来说 ACL 就是设置指定的特定用户或用户组对某个文件的操作权限。并且如果对某个目录设置了访问控制策略,那么子文件则继承其访问策略,而若对文件设置了访问控制策略则不再继承上级目录的控制策略。 254 | 255 | ACL:Access Control List 缩写 ,UGO 的 rwx 权限以外的细部权限设置。 256 | 257 | * setfacl 命令用于增加或者修改 ACL 规则,格式为: ” setfacl [ 参数 ] 文件 ” 。 258 | * getfacl 命令用于显示文件的 ACL 规则,格式为: ” getfacl 文件 ” 。 259 | 260 | 详细命令用法请看第三章节。 261 | 262 | ## 文件相关的命令 263 | 264 | | 文件 | 命令 | 解释 | 265 | | :------ | :------------------------------ | :---------------- | 266 | | 文件的管理 | ls ,cd, pwd, touch,mkdir, rmdir | 新建、删除 | 267 | | | cp, rm, mv | 复制、删除、移动 | 268 | | 文件内容的查看 | cat, tac, nl | 直接查看内容 | 269 | | | more, less | 可翻页查看 | 270 | | | head, tail | 资料撷取 | 271 | | | od | 非纯文本档 | 272 | | 文件的权限 | chmod chown | 文件的拥有者和所属组 ugo 权限 | 273 | | | umask | 文件预设 | 274 | | | chattr, lsattr | 文件隐藏属性 | 275 | | | SUID, SGID, SBIT | 文件特殊权限 | 276 | | 文件类型 | file | 文件类型查看 | 277 | | 文件的搜索 | which | 指令文件的搜索 | 278 | | | whereis, locate, find | 文件的搜索 | 279 | 280 | ### 权限的修改 chmod chown chgrp umask 281 | 282 | #### chmod 283 | 284 | chmod [ u g o a 所有用户 ] [ + - = ] [ rwx] /[ 777] 285 | 286 | * w 结合 x 权限可以对目录下的文件进行以下操作 : cd rm touch cp 287 | * r 结合 x 权限可以对目录下的文件进行 ls 操作 288 | * x 决定了能否进入目录 289 | 290 | ```shell 291 | [ root@www tmp]# ll dabao 292 | -rw-r--r--. 1 root root 0 Mar 21 06:09 dabao 293 | [ root@www tmp]# chmod 777 dabao 294 | [ root@www tmp]# ll dabao 295 | -rwxrwxrwx. 1 root root 0 Mar 21 06:09 dabao3.1.2 chown 296 | ``` 297 | 298 | chown user:group 目录 / 文件 299 | 300 | -R 针对目录递归修改拥有者 301 | 302 | ```shell 303 | [ root@www tmp]# chown dabao. dabao 304 | [ root@www tmp]# ll dabao 305 | -rwxrwxrwx. 1 dabao dabao 0 Mar 21 06:09 dabao 306 | [ root@www tmp]# chown -R dabao dabao1 307 | [ root@www tmp]# ll -R dabao1 308 | dabao1: 309 | total 4 310 | drwxr-xr-x. 3 dabao root 4096 Mar 21 06:11 1 311 | dabao1/1: 312 | total 4 313 | drwxr-xr-x. 2 dabao root 4096 Mar 21 06:11 2 314 | dabao1/1/2: 315 | total 0 316 | ``` 317 | 318 | #### chgrp 319 | 320 | 修改文件目录的所属组 321 | 322 | ```shell 323 | [ root@www tmp]# chgrp -R dabao dabao1 324 | [ root@www tmp]# ll -R dabao1 325 | dabao1: 326 | total 4 327 | drwxr-xr-x. 3 dabao dabao 4096 Mar 21 06:11 1 328 | dabao1/1: 329 | total 4 330 | drwxr-xr-x. 2 dabao dabao 4096 Mar 21 06:11 2 331 | dabao1/1/2: 332 | total 0 333 | ``` 334 | 335 | #### umask 336 | umask 创建文件 / 目录的默认权限 337 | 338 | 公式 339 | 340 | 最大权限 -umask= 默认权限 341 | 342 | - user 文件 666 -002 = 644 rw-rw-r-- 343 | - root 文件 666 -022 = 664 rw-r--r-- 344 | - user 目录 777 -002 = 755 rwxrwxr-x 345 | - root 目录 777 -022 = 775 rwxr-xr-x 346 | 347 | umask 777 只针对当前环境临时生效 348 | 349 | ```shell 350 | [ root@www tmp]# umask 351 | 0022 352 | ``` 353 | 354 | #### 相关文档 /etc/profile ~/.bash_profile 355 | 356 | - /etc/profile 定义了普通用户和 root 用户的 umask 值 , 对所有用户生效 357 | - ~/.bash_profile 可以定义当前用户的 umask 值 , 只对当前用户生效 , 需要重新登陆用户后生效。 358 | 359 | 默认属性相加减 , 则档案变成 :666-003=663, 是 -rw-rw--wx , 错 !! 360 | 361 | ### ATTR 权限命令 chattr lsattr 362 | 363 | #### chattr 364 | 365 | 配置文件案隐藏属性 366 | 367 | 属性设置常见的是 a 和 i 的设定 , 必须要 root 身份 368 | 369 | chattr [ +-= ][ ASacdistu] 文件 / 目录 370 | 371 | | 参数 | 作用 | 372 | | :--- | :--------------------------------------- | 373 | | + | 增加 | 374 | | - | 移除 | 375 | | = | 设定为 | 376 | | A | 访问时间 atime 不修改 , 对速度较慢计算机有帮助 | 377 | | S | 『同步』写入磁盘 | 378 | | a | 只能增加数据 , 不能删除 / 修改数据 (root) | 379 | | c | 自动『压缩』 , 读取时自动解压缩 | 380 | | d | 不被 dump 备份 | 381 | | i | 以下操作不可执行 : 『删除、改名、设置连结、写入、新增资料』 ( root ) | 382 | | s | 彻底删除 , 无法挽回 | 383 | | u | 与 s 相反 , 删除可挽回 | 384 | 385 | 386 | #### lsattr 387 | 388 | lsattr [ -adR] 文件 / 目录 389 | 390 | | 参数 | 作用 | 391 | | :--- | :-------- | 392 | | -a | 显示隐藏文件的属性 | 393 | | -d | 仅列出目录本身属性 | 394 | | -R | 连同子目录 | 395 | 396 | 397 | ```shell 398 | A 访问时间 atime 不修改 399 | [root@rhel7 tmp]# chattr +A file1 400 | [root@rhel7 tmp]# lsattr file1 401 | -------A-------- file1 402 | [root@rhel7 tmp]# cat file1 403 | hi 404 | [root@rhel7 tmp]# stat file1 405 | File: ‘file1’ 406 | Size: 3 407 | Blocks: 8 408 | IO Block: 4096 regular file 409 | Device: fd00h/64768d 410 | Inode: 52973916 Links: 1 411 | Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 412 | Context: unconfined_u:object_r:user_tmp_t:s0Access: 2016-06-22 14:49:50.221000000 +0800 413 | Modify: 2016-06-22 14:49:48.025000000 +0800 414 | Change: 2016-06-22 14:50:14.621000000 +0800 415 | Birth: - 416 | [root@rhel7 tmp]# cat file1 417 | hi 418 | [root@rhel7 tmp]# stat file1 419 | File: ‘file1’ 420 | Size: 3 421 | Blocks: 8 422 | IO Block: 4096 regular file 423 | Device: fd00h/64768d 424 | Inode: 52973916 Links: 1 425 | Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 426 | Context: unconfined_u:object_r:user_tmp_t:s0 427 | Access: 2016-06-22 14:49:50.221000000 +0800 428 | Modify: 2016-06-22 14:49:48.025000000 +0800 429 | Change: 2016-06-22 14:50:14.621000000 +0800 430 | Birth: - 431 | [root@rhel7 tmp]# chattr -A file1 432 | a 只能增加数据 , 不能删除 / 修改数据 (root) 433 | [root@rhel7 tmp]# chattr +a file1 434 | [root@rhel7 tmp]# lsattr file1 435 | -----a---------- file1 436 | [root@rhel7 tmp]# echo 99 > file1 437 | -bash: file1: Operation not permitted 438 | [root@rhel7 tmp]# echo 99 >> file1 439 | [root@rhel7 tmp]# cat file1 440 | hi 441 | 99 442 | i 以下操作不可执行 : 『删除、改名、设置连结、写入、新增资料』 ( root ) 443 | [root@rhel7 tmp]# chattr +i file1 444 | [root@rhel7 tmp]# rm -rf file1 445 | rm: cannot remove ‘file1’: Operation not permitted 446 | [root@rhel7 tmp]# mv file1 file100 447 | mv: cannot move ‘file1’ to ‘file100’: Operation not permitted 448 | [root@rhel7 tmp]# link file1 file1h 449 | link: cannot create link ‘file1h’ to ‘file1’: Operation not permitted 450 | [root@rhel7 tmp]# echo nini>>file1 451 | -bash: file1: Permission denied 452 | [root@rhel7 tmp]# chattr -i file1 453 | [root@rhel7 tmp]# lsattr file1 454 | ---------------- file1 455 | ``` 456 | 457 | 458 | ### ACL 权限命令 459 | 460 | #### ACL 权限概念 461 | 462 | ACL:Access Control List 缩写 ,UGO 的 rwx 权限以外的细部权限设置。 463 | 464 | ACL 可以针对单一用户 , 单一文件 , 单一目录 r,w,x 的权限规范 465 | 466 | 针对几个项目 : 467 | 1. 使用者 (user): 可以针对使用者设定权限 468 | 2. 群组 (group): 针对群组为对象设定权限 469 | 3. 默认属性 (mask): 还可以针对在该目录下在建立新档案或目录时 , 规范新数据的默认权限 470 | 471 | 472 | #### getfacl 473 | 474 | 475 | 取得文件 / 目录的 ACL 设定内容 476 | 477 | getfacl filename 478 | 479 | ```shell 480 | [root@www tmp]# getfacl dabao 481 | file: dabao 482 | owner: dabao 483 | group: dabao 484 | user::rwx 485 | group::rwx 486 | other::rwx 487 | ``` 488 | 489 | #### setfacl 490 | 491 | 设置文件 / 目录的 ACL 规范 492 | 493 | setfacl [-bkRd] [{-m|-x} acl 参数 ] 目标文件名 494 | 495 | | 参数 | 作用 | 496 | | :--- | :--------------------------------- | 497 | | -m | 设置 acl 参数 | 498 | | -x | 删除 acl 参数 | 499 | | -b | 删除所有 acl 参数 | 500 | | -k | 删除预设的 acl 参数 | 501 | | -R | 递归设置 acl 参数 | 502 | | -d | 设置『预设 acl 参数』只对目录有效 , 在该目录新建的数据会引用 | 503 | 504 | 命令格式 : 505 | 506 | ```shell 507 | 『 u:[ 使用者账号列表 ]:[ rwx] 』 <= = 针对特定用户 508 | 『 g:[ 群组列表 ]:[rwx] 』 <= = 针对特定用户组 509 | 『 m:[ rwx] 』 <= = 针对有效权限 mask 510 | 『 d:[ ug]: 使用者列表 :[ rwx] 』 针对预设权限 , 属性将继承到次目录 511 | ``` 512 | 513 | ```shell 514 | [root@rhel7 tmp]# setfacl -m u:student:rwx file1 515 | [root@rhel7 tmp]# setfacl -m g:student:rw file1 516 | [root@rhel7 tmp]# getfacl file1 517 | file: file1 518 | owner: root 519 | group: root 520 | user::rw- 521 | user:student:rwx 522 | group::r-- 523 | group:student:rw- 524 | mask::rwx 525 | other::r-- 526 | -d 针对预设权限 , 属性将继承到次目录 527 | [root@rhel7 tmp]# mkdir dabao 528 | [root@rhel7 tmp]# setfacl -d -m u:student:rwx dabao 529 | [root@rhel7 tmp]# getfacl dabao 530 | file: dabao 531 | owner: root 532 | group: root 533 | user::rwx 534 | group::r-x 535 | other::r-x 536 | default:user::rwx 537 | default:user:student:rwx 538 | default:group::r-x 539 | default:mask::rwx 540 | default:other::r-x 541 | [root@rhel7 tmp]# ll dabao -d 542 | drwxr-xr-x+ 2 root root 6 Jun 22 15:09 dabao 543 | [root@rhel7 tmp]# touch dabao/kk 544 | [root@rhel7 tmp]# ll dabao 545 | total 4 546 | -rw-rw-r--+ 1 root root 0 Jun 22 15:10 kk 547 | [root@rhel7 tmp]# getfacl dabao/kk 548 | file: dabao/kk 549 | owner: root 550 | group: root 551 | user::rw- 552 | user:student:rwx 553 | effective:rw- 554 | group::r-x 555 | effective:r-- 556 | mask::rw- 557 | other::r-- 558 | 切换为 student 用户 559 | [student@rhel7 tmp]$ cd dabao 560 | [student@rhel7 dabao]$ ll 561 | total 4 562 | -rw-rw-r--+ 1 root root 0 Jun 22 15:10 kk 563 | [student@rhel7 dabao]$ cat kk 564 | ``` 565 | 566 | ## 文件存储结构 567 | 568 | Linux 操作系统的文件权限 (rwx) 与文件属性 ( 拥有者、群组、 时间参数等 ) , 文件系统会将这两部分 569 | 的数据分别存放在不同的区块 , 权限不属性放置到 inode 中 , 实际数据则放置到 data block 区块中。 570 | 另外 , 还有一个超级区块 (superblock) 会记录整个 文件系统的整体信息 , 包括 inode 和 block 571 | 的总量、使用量、剩余量等。 572 | 573 | ![07](pic/07.png) 574 | 575 | - 文件的属性和权限数据 --> 放置到 inode 4 号 576 | - 文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码 577 | 578 | 579 | 对于目录: inode 记录该目录的相关权限与属性 , 并记录分配到的那块 block 号码 ; 而 block 则 580 | 是记录在该目录下的文件或目录的文件名和对应的 inode 号的数据。如下图所示: 581 | 582 | ![08](pic/08.png) 583 | 584 | ## 软硬方式链接 585 | 586 | 在 Linux 系统中的 ln 命令能够让用户创建出两种不同类型的文件快捷方式,一定要注意区分: 587 | 588 | 硬链接 (hard link) 可以被理解为一个 “ 指向原始文件 inode 的指针 ” ,系统不为它分配独立的 inode 589 | 与文件,所以实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同。于是每添加一个硬链接, 590 | 该文件的 inode 连接数就会增加 1 ,直到该文件的 inode 连接数归 0 才是彻底删除。概括来说因为硬链 591 | 接实际就是指向原文件 inode 的指针,即便原始文件被删除依然可以通过链接文件访问,但是不能跨文件 592 | 系统也不能链接目录文件。 593 | 594 | 软链接也称为符号链接( symbolic link )即 “ 仅仅包含它索要链接文件的路径名 ” 因此能做目录链接也 595 | 可以跨越文件系统,但原始文件被删除后链接文件也将失效,如同 WinodwTM 中的 “ 快捷方式 ” 。 596 | 597 | ln 命令用于创建链接文件,格式为: “ ln [ 选项 ] 目标 ” 。 598 | - 创建硬链接 :“ln 文件名 链接名 ” 599 | - 创建软链接 :“ln -s 文件名 连接名 ” 600 | 601 | | 参数 | 作用 | 602 | | :--- | :--------------- | 603 | | -s | 创建"符号链接"(默认是硬链接) | 604 | | -f | 强制创建文件或目录的链接 | 605 | | -i | 覆盖前先询问 | 606 | | -v | 显示创建链接的过程 | 607 | 608 | 609 | ```shell 610 | [root@rhel7 tmp]# echo this is a > file 611 | [root@rhel7 tmp]# cat file 612 | this is a 613 | [root@rhel7 tmp]# ll file 614 | -rw-r--r--. 1 root root 10 Jun 22 16:02 file 615 | [root@rhel7 tmp]# ln file fileh 616 | [root@rhel7 tmp]# ll file fileh 617 | [root@rhel7 tmp]# ll file fileh files -i 618 | 52973928 -rw-r--r--. 2 root root 10 Jun 22 16:02 file 619 | 52973928 -rw-r--r--. 2 root root 10 Jun 22 16:02 fileh 620 | 52973930 lrwxrwxrwx. 1 root root 4 Jun 22 16:03 files -> filefile 621 | ``` 622 | 623 | ![09](pic/09.png) 624 | 625 | ## 指令和文件的搜索 626 | 627 | which whereis locate find 628 | 629 | ### 肉眼查找 : ls -R 630 | 631 | ```shell 632 | [ root@www ~]# ls -R /tmp 633 | /tmp: 634 | dabao 635 | dabao1 636 | /tmp/dabao1: 637 | 1 638 | /tmp/dabao1/1: 639 | 2 640 | /tmp/dabao1/1/2: 641 | 642 | ### 指令的搜寻 :which 643 | 644 | which [ -a] command 645 | 646 | 选项与参数 : 647 | 648 | -a 649 | - : 将所有由 PATH 目录中可以找到的指令均列出 650 | - : 只显示第一个找到的 651 | 652 | 注意 : 653 | 1. 系统内建命令找不到 , type 查看 654 | 2. alias 命令别名 655 | 656 | ```shell 657 | [ root@www ~]# which cat 658 | /bin/cat 659 | [ root@www ~]# which postfix 660 | /usr/sbin/postfix 661 | ``` 662 | 663 | ### 文件名的搜寻 :whereis, locate, find 664 | 665 | #### whereis 666 | 667 | whereis [ -bmsu] [ -BMS directory...-f] filename.. 668 | 669 | | 参数 | 作用 | 670 | | :--- | :---------------------- | 671 | | -b | 只寻找 binary 二进制 格式的文件 | 672 | | -m | 只寻找在 说明文件 manual 路径下的文件 | 673 | | -s | 只寻找 source 来源的文件 | 674 | | -u | 搜寻不在上述三个项目当中的其他特殊文件 | 675 | | -l | 查看 whereis 可搜寻的路径 | 676 | 677 | ```shell 678 | [ root@www ~]# whereis /etc/passwd 679 | passwd: /usr/bin/passwd /etc/passwd.OLD /etc/passwd /usr/share/man/man1/passwd.1.gz 680 | /usr/share/man/man5/passwd.5.gz 681 | [ root@www ~]# whereis man 682 | man: /usr/bin/man /etc/man.config /usr/share/man /usr/share/man/man7/man.7.gz 683 | /usr/share/man/man1p/man.1p.gz /usr/share/man/man1/man.1.gz 684 | ``` 685 | 686 | #### locate 687 | 688 | locate [ -ir] keyword 689 | 690 | | 参数 | 作用 | 691 | | :--- | :------------- | 692 | | -i | 忽略大小写的差异 ; | 693 | | -r | 后面可接正规表示法的显示方式 | 694 | 695 | 696 | * 安装软件 `mlocate` 之后才会有 `updatedb` 命令和 `locate` 命令,最小化安装的 rhel 系统默认不安装。 697 | * `locate` 寻找的数据是由『已建立的数据库 `/var/lib/mlocate/mlocate.db` 里面的数据所搜 698 | 寻到 , 所以不用直接在去硬盘中存取数据 , 速度快 699 | * `updatedb`: 根据 `/etc/updatedb.conf` 的设定去搜寻系统硬盘内的文件名 , 并更新`/var/lib/mlocate.mlocate.db` 700 | * `PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"` <== 设定了不搜寻的目录 701 | 702 | #### find 703 | 704 | find [ PATH] [ option] [ action] 705 | 706 | 选项与参数 : 707 | 708 | 1. 与时间有关 :-atime, -ctime ,-mtime , 以 -mtime 说明 709 | 710 | * -mtime n 711 | * -mtime +n 712 | * -mtime -n 713 | * -newer file : 列出比 file 还要新的档案 714 | 715 | ```shell 716 | if n= 2 now= 2015/12/24 717 | then 718 | -mtime 2: 2015/12/22 当天内容改过的文件 719 | -mtime +2: 2 天之前 , 2015/12/22 之前被容被改过的文件 , 及 21\20\19... 720 | -mtime -2: 2 天以内 , 2015/12/24 和 2015/12/23 号修改过的文件 721 | <--|--|--|--|--|--|--|--|--|--|--|2-|--|--| 722 | <----------------------------+2->|--|--|--| 723 | <--|--|--|--|--|--|--|--|--|--|--|--|<-2->| 724 | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 现在 725 | ``` 726 | 727 | 1. 与用户和组有关 728 | 729 | * -uid n 730 | * -gid n 731 | * -user name 732 | * -group name 733 | * -nouser 734 | * -nogroup 735 | 736 | ```shell 737 | [ root@www ~]# find /tmp -user dabao 738 | /tmp/dabao 739 | /tmp/dabao1 740 | /tmp/dabao1/1 741 | /tmp/dabao1/1/2 742 | ``` 743 | 744 | 1. 与档案的权限及名称有关 745 | * -name filename: 搜寻文件名为 filename 的文件 ; 746 | * -size [ +-]SIZE: SIZE 的规格有 747 | * c: 代表 byte 748 | * k: 代表 1024bytes w: 字数 , 占两个字符 M\G 749 | * -type TYPE:f 普通文件 d 目录 l 链接文件 750 | * -perm mode : 文件权限『刚好等于』 mode 的档案 mode 范围 : 7777 ~ 0000 751 | * -perm -mode: 文件权限『必须要全部囊括 mode 权限』 752 | * -perm +mode: 文件权限『包含 mode 权限』的文件 753 | 754 | ```shell 755 | [ root@www ~]# find /tmp -name "*da*" 756 | /tmp/dabao 757 | /tmp/orbit-root/linc-bd3-0-5dc8fa181da 758 | /tmp/orbit-root/linc-da1-0-76ab0a1c521dd 759 | /tmp/orbit-root/linc-cc4-0-c0fda335ced5 760 | /tmp/dabao1 761 | [ root@www ~]# find /tmp -type f 762 | /tmp/pulse-BzLrQ7uHulwz/pid 763 | /tmp/.X0-lock 764 | /tmp/dabao 765 | /tmp/orbit-root/bonobo-activation-server-23d28d39cfff8983f6cac2ca00000055-ior 766 | /tmp/orbit-root/bonobo-activation-register-23d28d39cfff8983f6cac2ca00000055.lock 767 | /tmp/lurakm9.tmp/luraktg.tmp 768 | /tmp/lurakm9.tmp/lurakt2.tmp 769 | /tmp/lurakm9.tmp/lurakvs.tmp 770 | ``` 771 | 772 | 1. 额外动作 773 | 774 | -exec [ 命令 ] : 后面可再接额外的命令来处理搜寻到的结果 775 | 776 | `find / -perm +7000 -exec ls -l {} \;` 777 | <= = 固定格式 : `find [ 路径 参数 ] -exec [ 命令 ] {} \;` 778 | 779 | -ok 格式同-exec,区别ok会带提示(交互式的找到后是否执行该命令) 780 | 781 | -print: 将结果输出屏幕上 , 预设动作 782 | 783 | ```shell 784 | [ root@www ~]# find /tmp -name "dabao*" -exec ls -l {} \; 785 | -rwxrwxrwx+ 1 dabao dabao 0 Mar 21 06:09 /tmp/dabao 786 | total 4 787 | drwxr-xr-x. 3 dabao dabao 4096 Mar 21 06:11 1 788 | ``` 789 | 790 | ## Linux 文件和目录作业 791 | 792 | ### UGO 权限作业 793 | 794 | 1. 查看 /var/spool/mail 下所有文件 , 并指出其拥有者和所属组分 别是谁 , 其拥有者和所属组对应的 795 | 权限分别是什么 ? 796 | 2. 在 /tmp/ 目录下创建 7 个目录 , 目录名分别为 test1 到 test7 797 | - 1) 将该 7 个目录的拥有者改为 student 用户。 798 | - 2) 在这 7 个目录下分别创建 file1 和 file2 799 | - 3) 针对这 7 个目录的 student 用户分别设置数字为 1 到 7 的权限。 800 | - 4) 分别对这个 7 个目录执行以下命令 : 801 | ```shell 802 | ls file1 803 | ls -l file1 804 | cd testx 805 | touch file3 806 | rm file2 807 | chmod 777 file1 808 | ``` 809 | 并总结结论。 810 | 1. 新建一个组 , 组名为 group, 要求将 test1 目录的所属组改为 group 组 , 并将 test1 目录下的 811 | 所有文件的所属组都改为 group 组。 812 | 813 | ### 特殊权限作业 814 | 1. 在 /tmp/ 目录下创建一个 testdir 目录 , 要求任何人在该目录下 创建的文件都只能由自己或者目录 815 | 拥有者去删除 , 其余人不能够 去删除。 816 | 2. 创建一个文件 , 让任何人执行这个文件时候 , 临时拥有文件拥 有者的权限。 817 | 818 | ### ATTR 权限作业 819 | 1. 创建一个文件 , 文件名任意 , 要求 , 该文件的访问时间不被 修改 , 同时 , 该文件只能被追加内容 , 不允许被 820 | 修改和删除。 取消该文件的 Attr 权限。 821 | 822 | ### ACL 权限作业 823 | 1. 在 /tmp 下创建一个 file 文件 , 要求 student 用户对 file 有完整 的权限 ,kevin 用户对 824 | file 有 rw- 的权限 ,carol 用户对 file 有 -wx 的权限 ,natasha 用户对该文件有 r-- 的权限。 825 | 2. 清空 file 的 attr 权限。 826 | -------------------------------------------------------------------------------- /09-Linux文件系统和磁盘管理.md: -------------------------------------------------------------------------------- 1 | # Linux文件系统和磁盘管理 2 | 3 | [TOC] 4 | 5 | ## 文件系统 6 | 7 | ### 资源虚拟化 8 | 9 | ![20](pic/20.png) 10 | 11 | Linux操作系统内核由6个部分组成: 12 | * 进程调度与管理 13 | * 主存管理和虚存管理 14 | * VFS和文件管理 15 | * 设备管理 16 | * 网络接口和通信 17 | * 用来实现资源抽象 18 | * 资源分配和资源共享等功能。 19 | 20 | ### 文件系统的概念 21 | 22 | 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 23 | 24 | 从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。 25 | 26 | 具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 27 | 28 | ### 文件系统的类型 29 | 30 | 查看系统支持的文件系统 31 | `ls /lib/modules/$(uname -r)/kernel/fs ` 32 | 33 | 系统目前已加载到内存中支持的文件系统 34 | `more /proc/filesystems` 35 | 36 | ### 文件系统的结构 37 | 38 | 索引式文件系统(indexed allocation) 39 | 40 | ![21](pic/21.png) 41 | 42 | 文件系统内的信息主要有: 43 | * superblock:记录filesystem的整体信息,包括 inode/block的总量、使用量、剩余量, 以及文件系统的格式等; 44 | * inode:记录文件属性,一个文件占一个inode,同时记录该文件数据所在的block 号码; 45 | * block:实际记录文件的内容,若档案太大时,会占用多个 block 46 | 47 | ### 文件系统的区别 48 | 49 | rhel6 50 | ```shell 51 | [root@rhel6 ~]# mkfs 52 | mkfs mkfs.ext2 mkfs.ext4 mkfs.msdos 53 | mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.vfat 54 | ``` 55 | rhel7 56 | ```shell 57 | [root@rhel7 ~]# mkfs 58 | mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs 59 | mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat 60 | ``` 61 | 62 | EXT4 Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能,不向下兼容ext3。 63 | 64 | XFS 针对海量小文件的存储及超大文件的存储有一些有时,但 EXT 系统相对稳定。XFS 是 Silicon Graphics,Inc. 于 90 年代初开发的文件系统。它至今仍作为 SGI 基于 IRIX 的产品(从工作站到超级计算机)的底层文件系统来使用。现在,XFS 也可以用于 Linux。XFS 的 Linux 版的到来是激动人心的,首先因为它为 Linux 社区提供了一种健壮的、优秀的以及功能丰富的文件系统,并且这种文件系统所具有的可伸缩性能够满足最苛刻的存储需求。 65 | 66 | ### 文件系统的简单操作 67 | 68 | ![22](pic/22.png) 69 | 70 | #### df 71 | 72 | ![23](pic/23.png) 73 | 74 | 实例: 75 | 76 | 1. 使用-h选项以KB以上的单位来显示,可读性高 77 | ```shell 78 | [#3#root@rhel6 ~]#df -h 79 | Filesystem Size Used Avail Use% Mounted on 80 | /dev/mapper/vg_rhel6-LogVol01 17G 3.0G 13G 19% / 81 | tmpfs 499M 72K 499M 1% /dev/shm 82 | /dev/vda1 477M 58M 390M 13% /boot 83 | /dev/mapper/vg_rhel6-LogVol00 380M 2.3M 354M 1% /home 84 | ``` 85 | 2. 查看全部文件系统: 86 | ```shell 87 | [#4#root@rhel6 ~]#df -a 88 | Filesystem 1K-blocks Used Available Use% Mounted on 89 | /dev/mapper/vg_rhel6-LogVol01 17535796 3127044 13494936 19% / 90 | proc 0 0 0 - /proc 91 | sysfs 0 0 0 - /sys 92 | devpts 0 0 0 - /dev/pts 93 | tmpfs 510368 72 510296 1% /dev/shm 94 | /dev/vda1 487652 58631 399325 13% /boot 95 | /dev/mapper/vg_rhel6-LogVol00 388480 2335 361569 1% /home 96 | none 0 0 0 - /proc/sys/fs/binfmt_misc 97 | ``` 98 | 99 | #### du 100 | 101 | ![24](pic/24.png) 102 | 103 | 实例: 104 | 1. 查看指定目录所占空间 105 | ```shell 106 | [#9#root@rhel6 ~]#du -s /var/ 107 | 140252 /var/ 108 | [#10#root@rhel6 ~]#du -sh /var/ 109 | 137M /var/ 110 | ``` 111 | 2. 查看指定目录下的所有文件,包括隐藏文件 112 | ```shell 113 | [#16#root@rhel6 ~]#du -h /tmp 114 | 8.0K /tmp/pulse-oCBy0hGD1JT6 115 | 4.0K /tmp/.X11-unix 116 | 4.0K /tmp/.esd-0 117 | 4.0K /tmp/virtual-root.JyC7Qb 118 | 8.0K /tmp/orbit-gdm 119 | 4.0K /tmp/.ICE-unix 120 | 8.0K /tmp/pulse-q5sECpImz7Ju 121 | 48K /tmp 122 | [#15#root@rhel6 ~]#du -ha /tmp 123 | 4.0K /tmp/pulse-oCBy0hGD1JT6/pid 124 | 0 /tmp/pulse-oCBy0hGD1JT6/native 125 | 8.0K /tmp/pulse-oCBy0hGD1JT6 126 | 0 /tmp/.X11-unix/X0 127 | 4.0K /tmp/.X11-unix 128 | 0 /tmp/.esd-0/socket 129 | 4.0K /tmp/.esd-0 130 | 4.0K /tmp/virtual-root.JyC7Qb 131 | 4.0K /tmp/.X0-lock 132 | 0 /tmp/orbit-gdm/linc-6c2-0-7846478690c68 133 | 0 /tmp/orbit-gdm/bonobo-activation-register-75c59b1ecf3edd6ad04cfcfd00000056.lock 134 | 4.0K /tmp/orbit-gdm/bonobo-activation-server-75c59b1ecf3edd6ad04cfcfd00000056-ior 135 | 0 /tmp/orbit-gdm/linc-6e5-0-3bda60586d2f0 136 | 0 /tmp/orbit-gdm/linc-6bb-0-2bf2fd0bb015c 137 | 0 /tmp/orbit-gdm/linc-6e1-0-44f3459db98f9 138 | 0 /tmp/orbit-gdm/linc-6d9-0-26db8cdee8dec 139 | 0 /tmp/orbit-gdm/linc-6e0-0-7f7b8d4664593 140 | 0 /tmp/orbit-gdm/linc-6e4-0-540f978681aee 141 | 0 /tmp/orbit-gdm/linc-6d4-0-3a04cbe9566 142 | 0 /tmp/orbit-gdm/linc-6d5-0-75caf0f81ab48 143 | 8.0K /tmp/orbit-gdm 144 | 0 /tmp/.ICE-unix/1723 145 | 4.0K /tmp/.ICE-unix 146 | 4.0K /tmp/pulse-q5sECpImz7Ju/pid 147 | 0 /tmp/pulse-q5sECpImz7Ju/native 148 | 8.0K /tmp/pulse-q5sECpImz7Ju 149 | 48K /tmp 150 | ``` 151 | 152 | ## 磁盘的分割、格式化与挂载 153 | 154 | 新增一颗硬盘时 , 该怎么做 : 155 | 1. 对磁盘进行分割 , 以建立可用的分区 partition ; 156 | 2. 对该 partition 进行格式化 ( format ), 以建立系统可用的文件系统 filesystem; 157 | 3. 若想要仔细一点 , 则可对刚刚建立好的 filesystem 进行检验 ; 158 | 4. 在 Linux 系统上 , 需要建立挂载点 ( 目录 ), 并将他挂载上来。 159 | 5. 如果 ll /dev/ 新建的分区不存在,则使用 partx -a /dev/vdb 让新建的分区被读取生效,或者重启电脑 160 | 161 | ### 分割 fdisk 162 | 163 | fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区。它采用传统的问答式界面。 164 | 165 | 语法 fdisk(选项)(参数) 166 | 167 | 选项 168 | 169 | * -b<分区大小>:指定每个分区的大小; 170 | * -l:列出指定的外围设备的分区表状况; 171 | * -s<分区编号>:将指定的分区大小输出到标准输出上,单位为区块; 172 | * -u:搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址; 173 | * -v:显示版本信息。 174 | 175 | 参数 设备文件:指定要进行分区或者显示分区的硬盘设备文件。 176 | 177 | ```shell 178 | [#20#root@rhel6 ~]#fdisk -l 179 | 180 | Disk /dev/vda: 21.5 GB, 21474836480 bytes 181 | 16 heads, 63 sectors/track, 41610 cylinders 182 | Units = cylinders of 1008 * 512 = 516096 bytes 183 | Sector size (logical/physical): 512 bytes / 512 bytes 184 | I/O size (minimum/optimal): 512 bytes / 512 bytes 185 | Disk identifier: 0x000d166b 186 | 187 | Device Boot Start End Blocks Id System 188 | /dev/vda1 * 3 1018 512000 83 Linux 189 | Partition 1 does not end on cylinder boundary. 190 | /dev/vda2 1018 5179 2097152 82 Linux swap / Solaris 191 | Partition 2 does not end on cylinder boundary. 192 | /dev/vda3 5179 41611 18361344 8e Linux LVM 193 | Partition 3 does not end on cylinder boundary. 194 | 195 | Disk /dev/vdb: 10.7 GB, 10737418240 bytes 196 | 16 heads, 63 sectors/track, 20805 cylinders 197 | Units = cylinders of 1008 * 512 = 516096 bytes 198 | Sector size (logical/physical): 512 bytes / 512 bytes 199 | I/O size (minimum/optimal): 512 bytes / 512 bytes 200 | Disk identifier: 0x00000000 201 | 202 | 203 | Disk /dev/mapper/vg_rhel6-LogVol01: 18.4 GB, 18379440128 bytes 204 | 255 heads, 63 sectors/track, 2234 cylinders 205 | Units = cylinders of 16065 * 512 = 8225280 bytes 206 | Sector size (logical/physical): 512 bytes / 512 bytes 207 | I/O size (minimum/optimal): 512 bytes / 512 bytes 208 | Disk identifier: 0x00000000 209 | 210 | 211 | Disk /dev/mapper/vg_rhel6-LogVol00: 419 MB, 419430400 bytes 212 | 255 heads, 63 sectors/track, 50 cylinders 213 | Units = cylinders of 16065 * 512 = 8225280 bytes 214 | Sector size (logical/physical): 512 bytes / 512 bytes 215 | I/O size (minimum/optimal): 512 bytes / 512 bytes 216 | Disk identifier: 0x00000000 217 | [#21#root@rhel6 ~]#fdisk /dev/vdb 218 | Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel 219 | Building a new DOS disklabel with disk identifier 0x23c41712. 220 | Changes will remain in memory only, until you decide to write them. 221 | After that, of course, the previous content won't be recoverable. 222 | 223 | Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) 224 | 225 | WARNING: DOS-compatible mode is deprecated. It's strongly recommended to 226 | switch off the mode (command 'c') and change display units to 227 | sectors (command 'u'). 228 | 229 | Command (m for help): m <== 输入 m 后 , 就会看到底下这些指令介绍 230 | Command action 231 | a toggle a bootable flag 232 | b edit bsd disklabel 233 | c toggle the dos compatibility flag 234 | d delete a partition <== 删除一个分区 235 | l list known partition types 236 | m print this menu 237 | n add a new partition <== 新增一个分区 238 | o create a new empty DOS partition table 239 | p print the partition table== 在屏幕上显示分割表 240 | q quit without saving changes<== 不储存离开 fdisk 程序 241 | s create a new empty Sun disklabel 242 | t change a partition's system id 243 | u change display/entry units 244 | v verify the partition table 245 | w write table to disk and exit<== 将刚刚的动作写入分割表 246 | x extra functionality (experts only) 247 | Command (m for help): p 248 | 249 | Disk /dev/vdb: 10.7 GB, 10737418240 bytes 250 | 16 heads, 63 sectors/track, 20805 cylinders 251 | Units = cylinders of 1008 * 512 = 516096 bytes 252 | Sector size (logical/physical): 512 bytes / 512 bytes 253 | I/O size (minimum/optimal): 512 bytes / 512 bytes 254 | Disk identifier: 0x23c41712 255 | 256 | Device Boot Start End Blocks Id System 257 | 258 | Command (m for help): n 259 | Command action 260 | e extended 261 | p primary partition (1-4) 262 | p 263 | Partition number (1-4): 1 264 | First cylinder (1-20805, default 1): 265 | Using default value 1 266 | Last cylinder, +cylinders or +size{K,M,G} (1-20805, default 20805): 267 | Using default value 20805 268 | 269 | Command (m for help): p 270 | 271 | Disk /dev/vdb: 10.7 GB, 10737418240 bytes 272 | 16 heads, 63 sectors/track, 20805 cylinders 273 | Units = cylinders of 1008 * 512 = 516096 bytes 274 | Sector size (logical/physical): 512 bytes / 512 bytes 275 | I/O size (minimum/optimal): 512 bytes / 512 bytes 276 | Disk identifier: 0x23c41712 277 | 278 | Device Boot Start End Blocks Id System 279 | /dev/vdb1 1 20805 10485688+ 83 Linux 280 | 281 | Command (m for help): w 282 | The partition table has been altered! 283 | 284 | Calling ioctl() to re-read partition table. 285 | Syncing disks. 286 | [#22#root@rhel6 ~]#ls /dev|grep vdb 287 | vdb 288 | vdb1 289 | [root@rhel7 ~]# fdisk /dev/vdb 290 | Welcome to fdisk (util-linux 2.23.2). 291 | 292 | Changes will remain in memory only, until you decide to write them. 293 | Be careful before using the write command. 294 | 295 | Device does not contain a recognized partition table 296 | Building a new DOS disklabel with disk identifier 0x8366bb08. 297 | 298 | Command (m for help): p 299 | 300 | Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors 301 | Units = sectors of 1 * 512 = 512 bytes 302 | Sector size (logical/physical): 512 bytes / 512 bytes 303 | I/O size (minimum/optimal): 512 bytes / 512 bytes 304 | Disk label type: dos 305 | Disk identifier: 0x8366bb08 306 | 307 | Device Boot Start End Blocks Id System 308 | 309 | Command (m for help): n 310 | Partition type: 311 | p primary (0 primary, 0 extended, 4 free) 312 | e extended 313 | Select (default p): p 314 | Partition number (1-4, default 1): 1 315 | First sector (2048-20971519, default 2048): 316 | Using default value 2048 317 | Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): 318 | Using default value 20971519 319 | Partition 1 of type Linux and of size 10 GiB is set 320 | 321 | Command (m for help): p 322 | 323 | Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors 324 | Units = sectors of 1 * 512 = 512 bytes 325 | Sector size (logical/physical): 512 bytes / 512 bytes 326 | I/O size (minimum/optimal): 512 bytes / 512 bytes 327 | Disk label type: dos 328 | Disk identifier: 0x8366bb08 329 | 330 | Device Boot Start End Blocks Id System 331 | /dev/vdb1 2048 20971519 10484736 83 Linux 332 | 333 | Command (m for help): w 334 | The partition table has been altered! 335 | 336 | Calling ioctl() to re-read partition table. 337 | Syncing disks. 338 | ``` 339 | 340 | ### 磁盘格式化 mkfs 341 | 342 | ![25](pic/25.png) 343 | 344 | 1. rhel6实例:查看支持的文件系统;将/dev/vdb1格式化成ext4文件系统 345 | ```shell 346 | [#23#root@rhel6 ~]#mkfs 347 | mkfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.msdos mkfs.vfat 348 | [#24#root@rhel6 ~]#mkfs.ext4 /dev/vdb1 349 | mke2fs 1.41.12 (17-May-2010) 350 | Filesystem label= 351 | OS type: Linux 352 | Block size=4096 (log=2) 353 | Fragment size=4096 (log=2) 354 | Stride=0 blocks, Stripe width=0 blocks 355 | 655360 inodes, 2621422 blocks 356 | 131071 blocks (5.00%) reserved for the super user 357 | First data block=0 358 | Maximum filesystem blocks=2684354560 359 | 80 block groups 360 | 32768 blocks per group, 32768 fragments per group 361 | 8192 inodes per group 362 | Superblock backups stored on blocks: 363 | 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 364 | Writing inode tables: done 365 | Creating journal (32768 blocks): done 366 | Writing superblocks and filesystem accounting information: done 367 | This filesystem will be automatically checked every 38 mounts or 368 | 180 days, whichever comes first. Use tune2fs -c or -i to override. 369 | ``` 370 | 371 | 2. rhel7实例:查看支持的文件系统;将/dev/vdb1格式化成xfs文件系统 372 | ```shell 373 | [root@rhel7 ~]# mkfs 374 | mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs 375 | mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat 376 | [root@rhel7 ~]# mkfs.xfs /dev/vdb1 377 | meta-data=/dev/vdb1 isize=256 agcount=4, agsize=655296 blks 378 | = sectsz=512 attr=2, projid32bit=1 379 | = crc=0 380 | data = bsize=4096 blocks=2621184, imaxpct=25 381 | = sunit=0 swidth=0 blks 382 | naming =version 2 bsize=4096 ascii-ci=0 ftype=0 383 | log =internal log bsize=4096 blocks=2560, version=2 384 | = sectsz=512 sunit=0 blks, lazy-count=1 385 | realtime =none extsz=4096 blocks=0, rtextents=0 386 | ``` 387 | 388 | 389 | ### 挂载 390 | 391 | /etc/fstab 392 | 393 | /etc/filesystems: 系统指定的测试挂载文件系统类型 ; 394 | 395 | /proc/filesystems:Linux 系统已经加载的文件系统类型。 396 | 397 | #### mount 的用法 398 | 399 | 1) 标准用法 `mount -t ext4 /dev/vdb1 /mnt/vdb1 ` 400 | 401 | 2) 远程挂载 `mount ip:/xx /xx` 402 | 403 | `mount 172.25.254.250 : /content /mnt` <== 远程挂载案例 404 | 405 | 3) 其他选项: 406 | 407 | A.-o loop 挂载镜像文件 408 | 409 | * 用法: mount -o loop 被挂载的文件 挂载点 410 | * 例如: mount -o loop rhel-server-6.5-x86_64-dvd.iso /test 411 | 412 | B.-o ro 以只读方式挂载 413 | 414 | * 用法: mount -o ro 被挂在的设备 挂载点 415 | * 例如: mount -o ro /dev/vdb1 /test 416 | 417 | C.-o remount 重新挂载 418 | 419 | * 用法: mount -o remount 被挂载的设备 挂载点 420 | * 例如: mount -o remount,rw,auto / <== 重新挂载根目录 421 | 422 | mount -o remount,ro newdir <== 重新挂载为只读 423 | 424 | D.-t iso9660 挂载CD/DVD 425 | 426 | * 用法: mount -t iso9660 被挂载的设备 挂载点 427 | * 例如: mount -t iso9660 /dev/dvdrom /media/dvdrom 428 | 429 | #### mount 的查看 430 | 431 | df -h 432 | 433 | mount <== 查看设备和目录挂载点的关系 434 | ```shell 435 | [#27#root@rhel6 ~]#mount 436 | /dev/mapper/vg_rhel6-LogVol01 on / type ext4 (rw) 437 | proc on /proc type proc (rw) 438 | sysfs on /sys type sysfs (rw) 439 | devpts on /dev/pts type devpts (rw,gid=5,mode=620) 440 | tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") 441 | /dev/vda1 on /boot type ext4 (rw) 442 | /dev/mapper/vg_rhel6-LogVol00 on /home type ext4 (rw) 443 | none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) 444 | ``` 445 | 446 | #### umount 447 | 448 | umount [-fn] 设备文件名与挂载点 449 | 450 | umount /mnt 451 | 452 | 注意事项: 453 | 1. 对某个挂载点使用多次 mount ,会把之前的内容隐藏起来,只能看到最后一次挂载的设备文件里的内容 454 | 2. 不要在挂载点里面执行 umount 命令,会报错 455 | 3. 尽量不要在挂载点里执行 mount 挂载命令 456 | 4. mount 命令为临时生效 457 | 458 | ### /etc/fstab 将永久生效 459 | 460 | ![26](pic/26.png) 461 | 462 | 是否需要检测:非 0 代表检测,数字越小优先级越高 463 | 464 | 修改后保存,通过 `mount -a `让配置生效 465 | 466 | ## 磁盘配额 Quota 467 | 468 | 如前面介绍章节讲到的类 Unix 系统最初设计理念就让许多人一起使用,多任务的操作系统,但是硬件的资源是固定有限 的,如果出现个小破坏份子不断的创建文件或下载电影,那么硬盘空间总有一天会被占满的吧,这时就需要 quota服务 帮助我们为每个用户限制可以使用的硬盘空间,一旦超出预算就不再允许他们使用。 469 | 470 | ### 作用和分类 471 | 472 | quota 的磁盘配额可以限制用户的硬盘可用空间或最大创建文件数量,并且还有软/硬限制的区别: 473 | 474 | * 软限制:当达到软限制时会提示用户,但允许用户在规定期限内继续使用。 475 | * 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。 476 | 477 | ### 相关命令 478 | 479 | #### quotacheck 480 | 481 | quotacheck命令通过扫描指定的文件系统,获取磁盘的使用情况,创建、检查和修复磁盘配额(quota)文件。执行quotacheck指令,扫描挂入系统的分区,并在各分区的文件系统根目录下产生quota.user和quota.group文件,设置用户和群组的磁盘空间限制。 482 | 483 | 语法 quotacheck(选项)(参数) 484 | 485 | 选项 486 | * -a:扫描在/etc/fstab文件里,有加入quota设置的分区; 487 | * -d:详细显示指令执行过程,便于排错或了解程序执行的情形; 488 | * -g:扫描磁盘空间时,计算每个群组识别码所占用的目录和文件数目; 489 | * -R:排除根目录所在的分区; 490 | * -u:扫描磁盘空间时,计算每个用户识别码所占用的目录和文件数目; 491 | * -v:显示指令执行过程。 492 | 493 | 参数 文件系统:指定要扫描的文件系统。 494 | 495 | #### quota 496 | 497 | quota命令用于显示用户或者工作组的磁盘配额信息。输出信息包括磁盘使用和配额限制。 498 | 499 | 语法 quota(选项)(参数) 500 | 501 | 选项 502 | * -g:列出群组的磁盘空间限制; 503 | * -q:简明列表,只列出超过限制的部分; 504 | * -u:列出用户的磁盘空间限制; 505 | * -v:显示该用户或群组,在所有挂入系统的存储设备的空间限制; 506 | * -V:显示版本信息。 507 | 508 | 参数 用户或者工作组:指定要显示的用户或者工作组。 509 | 510 | #### quotaon 511 | 512 | quotaon命令用于激活Linux内核中指定文件系统的磁盘配额功能。 513 | 514 | 语法 quotaon(选项)(参数) 515 | 516 | 选项 517 | * -a:开启在/ect/fstab文件里,有加入quota设置的分区的空间限制; 518 | * -g:开启群组的磁盘空间限制; 519 | * -u:开启用户的磁盘空间限制; 520 | * -v:显示指令指令执行过程。 521 | 522 | 参数 文件系统:指定要激活磁盘配额功能的文件系统。 523 | 524 | #### repquota 525 | 526 | repquota命令以报表的格式输出指定分区,或者文件系统的磁盘配额信息。 527 | 528 | 语法 repquota(选项)(参数) 529 | 530 | 选项 531 | * -a:列出在/etc/fstab文件里,有加入quota设置的分区的使用状况,包括用户和群组; 532 | * -g:列出所有群组的磁盘空间限制; 533 | * -u:列出所有用户的磁盘空间限制; 534 | * -v:显示该用户或群组的所有空间限制。 535 | 536 | 参数 文件系统:要打印报表的文件系统或者对应的设备文件名。 537 | 538 | #### edquota 539 | 540 | edquota 命令用于超级用户编辑其他用户的 quota 配额限制 541 | 542 | 格式为: “ edquota [参数] [用户]”。 543 | 544 | 参数 作用 545 | * -u 编辑用户的配额限制。 546 | * -g 编辑用户组的配额限制。 547 | * -r 通过 RPC 协议编辑远程的配额。 548 | 549 | 550 | #### xfs_quota 551 | 552 | xfs_quota 命令用于管理 XFS 文件系统的 quota 硬盘配额 553 | 554 | 格式为: “ quota [参数] 配额 文件系统 ” 。 555 | 556 | 参数 作用 557 | * -c 命令 以交换式或参数的形式设置要执行的命令。 558 | * -p 设置提示或报错信息的程序名称,默认为 xfs_quota。 559 | * -x 专家模式,能够对 quota 做更多复杂的配置。 560 | 561 | ### 实验 562 | 563 | #### rhel6 quota实验 564 | 565 | 划分分区/dev/vdb2,格式化成ext4文件系统,并挂载在student家目录下使用,限制磁盘软限制为 3M、磁盘硬限制为 6M、文件软限制为 20 个且文件硬限制为 30 个 566 | 1. 挂载时需要加上 -o usrquota,grpquota 选项 :mount -o usrquota,grpquota /dev/vdb2 /home/student 567 | 2. /etc/skel 需要的文件需要复制到家目录下 :cp .bash* .gnome2 .mozilla -r /home/student 568 | 3. 修改家目录权限 :chown student.student /home/student ;setenforce 0 569 | 4. 检测:quotacheck -cugm /home/student/ 检测结果 : aquota.group aquota.user <== 只有 root 用户有读写权限 570 | 5. 激活 :quotaon /home/student 571 | 6. 打印磁盘配额的报告 :repquota /home/student 572 | 7. 编辑edquota student 573 | 574 | ```shell 575 | [root@rhel6 ~]# mount -o usrquota,grpquota /dev/vdb2 /home/student 576 | [root@rhel6 ~]# ll /home/student 577 | total 16 578 | drwx------. 2 root root 16384 Jul 1 15:56 lost+found 579 | [root@rhel6 ~]# cd /etc/skel 580 | [root@rhel6 skel]# cp .bash* .gnome* .moz* -r /home/student 581 | [root@rhel6 skel]# ll /home/student -a 582 | total 42 583 | drwxr-xr-x. 5 root root 4096 Jul 1 16:00 . 584 | drwxr-xr-x. 4 root root 1024 Jul 2 2015 .. 585 | -rw-r--r--. 1 root root 18 Jul 1 16:00 .bash_logout 586 | -rw-r--r--. 1 root root 176 Jul 1 16:00 .bash_profile 587 | -rw-r--r--. 1 root root 124 Jul 1 16:00 .bashrc 588 | drwxr-xr-x. 2 root root 4096 Jul 1 16:00 .gnome2 589 | drwx------. 2 root root 16384 Jul 1 15:56 lost+found 590 | drwxr-xr-x. 4 root root 4096 Jul 1 16:00 .mozilla 591 | [root@rhel6 skel]# chown student. /home/student -R 592 | [root@rhel6 skel]# setenforce 0 593 | [root@rhel6 skel]# quotacheck -cugm /home/student 594 | [root@rhel6 skel]# ll /home/student 595 | total 32 596 | -rw-------. 1 root root 6144 Jul 1 16:03 aquota.group 597 | -rw-------. 1 root root 6144 Jul 1 16:03 aquota.user 598 | drwx------. 2 student student 16384 Jul 1 15:56 lost+found 599 | [root@rhel6 skel]# quotaon /home/student 600 | [root@rhel6 skel]# repquota /home/student 601 | *** Report for user quotas on device /dev/vdb2 602 | Block grace time: 7days; Inode grace time: 7days 603 | Block limits File limits 604 | User used soft hard grace used soft hard grace 605 | ---------------------------------------------------------------------- 606 | student -- 48 0 0 9 0 0 607 | 608 | 609 | [root@rhel6 skel]# edquota student 610 | edquota: WARNING - /dev/vdb2: cannot change current inode allocation 611 | [root@rhel6 skel]# edquota student 612 | [root@rhel6 skel]# repquota /home/student 613 | *** Report for user quotas on device /dev/vdb2 614 | Block grace time: 7days; Inode grace time: 7days 615 | Block limits File limits 616 | User used soft hard grace used soft hard grace 617 | ---------------------------------------------------------------------- 618 | student -+ 48 3072 6144 9 3 6 7days 619 | 620 | 621 | [root@rhel6 skel]# quota student 622 | Disk quotas for user student (uid 500): 623 | Filesystem blocks quota limit grace files quota limit grace 624 | /dev/vdb2 48 3072 6144 9* 3 6 7days 625 | [root@rhel6 skel]# su - student 626 | [student@rhel6 ~]$ touch file{1..10} 627 | vdb2: write failed, user file limit reached. 628 | touch: cannot touch `file1': Disk quota exceeded 629 | touch: cannot touch `file2': Disk quota exceeded 630 | touch: cannot touch `file3': Disk quota exceeded 631 | touch: cannot touch `file4': Disk quota exceeded 632 | touch: cannot touch `file5': Disk quota exceeded 633 | touch: cannot touch `file6': Disk quota exceeded 634 | touch: cannot touch `file7': Disk quota exceeded 635 | touch: cannot touch `file8': Disk quota exceeded 636 | touch: cannot touch `file9': Disk quota exceeded 637 | touch: cannot touch `file10': Disk quota exceeded 638 | ``` 639 | 640 | #### rhel7 quota实验 641 | 642 | root用户: 643 | 1. 查看内核是否支持 quota 功能: dmesg | grep quota 644 | 2. 查看 quota 程序包是否已经安装: rpm -q quota 645 | 3. 查看 boot 目录是否支持 quota 功能(noquota 表示暂时不支持): mount|grep boot 646 | 4. 让/boot 目录支持 quota 功能: vim /etc/fstab 属性中添加usrquota 647 | 5. 重启主机后即可生效: reboot 648 | 6. 查看 boot 目录是否支持 quota 功能(usrquota 表示已经支持): mount|grep boot 649 | 7. 创建一个用于 quota 实验的用户 tom: useradd tom && echo uplooking|passwd tom 650 | 8. 需要允许其他用户对/boot 目录写入文件操作: chmod -Rf o+w /boot 651 | 9. 使用 xfs_quota 命令设置对 tom 用户在/boot 目录的磁盘配额,具体要求如下: 652 | 使用 quota 专家模式限制磁盘软限制为 3m、磁盘硬限制为 6m、文件软限制为 3 个且文件硬限制为 6 个。 获取当前/boot 目录上的 quota 配额限制 653 | ```shell 654 | xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot 655 | xfs_quota -x -c report /boot 656 | ``` 657 | 切换至 tom 用户: su - tom 658 | 659 | 1. 正常创建了一个为 5M 的文件: dd if=/dev/zero of=/boot/tom bs=5M count=1 660 | 2. 创建 8M 文件时强制终止并报错了: dd if=/dev/zero of=/boot/tom bs=8M count=1 661 | 3. 查看当前用户的 quota 限制(显示硬盘配额已占满): quota 662 | 663 | 切换至root用户:exit 664 | 665 | 1. 编辑 tom 的配额限制,将硬盘的硬限制修改为 8m(8192k): edquota -u tom 666 | 667 | 切换至 tom 用户: su - tom 668 | 669 | 1. 再来创建 8m 的文件就不会有问题了: dd if=/dev/zero of=/boot/tom bs=8M count=1 670 | 671 | ```shell 672 | [root@rhel7 ~]# dmesg|grep quota 673 | [ 0.836809] VFS: Disk quotas dquot_6.5.2 674 | [root@rhel7 ~]# rpm -q quota 675 | quota-4.01-11.el7.x86_64 676 | [root@rhel7 ~]# mount|grep boot 677 | /dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota) 678 | [root@rhel7 ~]# vim /etc/fstab 679 | UUID=abbadca9-0a0d-453f-b713-d3d978cd6909 /boot xfs defaults,usrquota 1 2 680 | [root@rhel7 ~]# reboot 681 | [root@rhel7 ~]# mount|grep boot 682 | /dev/vda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota) 683 | [root@rhel7 ~]# useradd tom 684 | [root@rhel7 ~]# passwd tom 685 | Changing password for user tom. 686 | New password: 687 | BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word 688 | Retype new password: 689 | passwd: all authentication tokens updated successfully. 690 | [root@rhel7 ~]# chmod -Rf o+w /boot 691 | [root@rhel7 ~]# ll -d /boot 692 | dr-xr-xrwx. 3 root root 4096 Jun 27 03:59 /boot 693 | [root@rhel7 ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot 694 | [root@rhel7 ~]# xfs_quota -x -c report /boot 695 | User quota on /boot (/dev/vda1) 696 | Blocks 697 | User ID Used Soft Hard Warn/Grace 698 | ---------- -------------------------------------------------- 699 | root 120384 0 0 00 [--------] 700 | tom 0 3072 6144 00 [--------] 701 | 702 | [root@rhel7 ~]# su - tom 703 | Last login: Fri Jul 1 02:51:33 EDT 2016 on pts/0 704 | [tom@rhel7 ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1 705 | 1+0 records in 706 | 1+0 records out 707 | 5242880 bytes (5.2 MB) copied, 0.0270144 s, 194 MB/s 708 | [tom@rhel7 ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1 709 | dd: error writing ‘/boot/tom’: Disk quota exceeded 710 | 1+0 records in 711 | 0+0 records out 712 | 6291456 bytes (6.3 MB) copied, 0.218067 s, 28.9 MB/s 713 | [tom@rhel7 ~]$ quota 714 | Disk quotas for user tom (uid 1001): 715 | Filesystem blocks quota limit grace files quota limit grace 716 | /dev/vda1 6144* 3072 6144 6days 1 3 6 717 | [tom@rhel7 ~]$ exit 718 | logout 719 | [root@rhel7 ~]# edquota -u tom 720 | Disk quotas for user tom (uid 1001): 721 | Filesystem blocks soft hard inodes soft hard 722 | /dev/vda1 8192 3072 8192 1 3 6 723 | [root@rhel7 ~]# xfs_quota -x -c report /boot 724 | User quota on /boot (/dev/vda1) 725 | Blocks 726 | User ID Used Soft Hard Warn/Grace 727 | ---------- -------------------------------------------------- 728 | root 120384 0 0 00 [--------] 729 | tom 6144 3072 8192 00 [6 days] 730 | 731 | [root@rhel7 ~]# su - tom 732 | Last login: Fri Jul 1 02:58:22 EDT 2016 on pts/0 733 | [tom@rhel7 ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1 734 | 1+0 records in 735 | 1+0 records out 736 | 8388608 bytes (8.4 MB) copied, 0.267325 s, 31.4 MB/s 737 | [tom@rhel7 ~]$ exit 738 | logout 739 | ``` 740 | 741 | ## 逻辑卷管理 LVM 742 | 743 | 逻辑卷管理 (Logical Volume Manager) 744 | 745 | ### 作用 746 | 747 | 当用户根据实际情况需要对分区增加、减小等调整时,经常会受到硬盘 “ 灵活性 ” 的限制,很不方便。 748 | 749 | 逻辑卷管理器则是在磁盘分区与文件系统之间添加的逻辑层,提供一个抽象的卷组,使得管理者可以忽略底层磁盘布局, 从而实现对分区的灵活动态调整,这毫不夸张,所以红帽 RHEL7 系统已经默认启用了 LVM(Logical Volume Manager) 机制。 750 | 751 | ### 原理 752 | 753 | ![00](pic/00.png) 754 | 755 | 将物理分区做成 pv ;将 pv 组合成 vg ;再从 vg 分出 lv 分区 -->pv-->vg-->lv 756 | 757 | * 物理卷(PV,Physical Volume ): 整个硬盘设备或使用 fdisk 命令建立的硬盘分区。 758 | * 卷组(VG,Volume Group ) :由一个或多个物理卷(PV)组成的整体 759 | * 逻辑卷(LV,Logical Volume ):从卷组(VG)出切割出的空间来用于创建文件系统,大小由 PE 的个数决定。 760 | 761 | 762 | ### 步骤 763 | 764 | ![27](pic/27.png) 765 | ![28](pic/28.png) 766 | ![30](pic/30.png) 767 | ![31](pic/31.png) 768 | 769 | ### 实验 770 | 771 | 实验:linear 目前用户的映射目标为linear型,线性型,/dev/vdb1 pv1 100M;/dev/vdb2 pv2 100M;/dev/vdb3 pv 3 100M----->myvg 300M----->lv1-linear 20M;lv2-linear 60M现在lv1-linear不够用了,需要拓展60M的空间,lv2-linear也不够用了,需要拓展30M的空间,如何做才能提高读写速度? 772 | 773 | ![32](pic/32.png) 774 | 775 | ```shell 776 | root@iscsi1-f15 ~]# dmsetup table|grep my 777 | myvg-lv1--linear: 0 40960 linear 252:21 2048 778 | myvg-lv1--linear: 40960 32768 linear 252:21 165888 779 | myvg-lv1--linear: 73728 90112 linear 252:22 2048 780 | myvg-lv2--linear: 0 122880 linear 252:21 43008 781 | myvg-lv2--linear: 122880 65536 linear 252:22 92160 782 | –------------------------------------------------------------------------ 783 | [root@iscsi1-f15 ~]# dmsetup table|grep myvg 784 | myvg-lv1--linear: 0 73728 linear 252:25 2048 785 | myvg-lv1--linear: 73728 90112 linear 252:25 75776 786 | myvg-lv2--linear: 0 122880 linear 252:25 165888 787 | myvg-lv2--linear: 122880 65536 linear 252:25 288768 788 | ``` 789 | 790 | ```shell 791 | [root@iscsi1-f15 ~]# fdisk /dev/vdb --->vdb[123] 100M 792 | [root@iscsi1-f15 ~]# pvcreate /dev/vdb[123] 793 | [root@iscsi1-f15 ~]# vgcreate myvg /dev/vdb[123] 794 | [root@iscsi1-f15 ~]# lvcreate -L 20M myvg -n lv1-linear 795 | [root@iscsi1-f15 ~]# lvcreate -L 60M myvg -n lv2-linear 796 | [root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv1-linear 797 | [root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv2-linear 798 | [root@iscsi1-f15 ~]# mount /dev/myvg/lv1-linear /opt/lv1 799 | [root@iscsi1-f15 ~]# mount /dev/myvg/lv2-linear /opt/lv2 800 | [root@iscsi1-f15 ~]# lvextend -L +60M /dev/myvg/lv1-linear 801 | [root@iscsi1-f15 ~]# lvextend -L +30M /dev/myvg/lv2-linear 802 | [root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv1-linear 803 | [root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv2-linear 804 | [root@iscsi1-f15 ~]# dmsetup table|grep my 805 | myvg-lv1--linear: 0 40960 linear 252:21 2048 806 | myvg-lv1--linear: 40960 32768 linear 252:21 165888 807 | myvg-lv1--linear: 73728 90112 linear 252:22 2048 808 | myvg-lv2--linear: 0 122880 linear 252:21 43008 809 | myvg-lv2--linear: 122880 65536 linear 252:22 92160 810 | –------------------------------------------------------------------------ 811 | [root@iscsi1-f15 ~]# fdisk /dev/vdb --->vdb4 500M vdb5 500M 812 | [root@iscsi1-f15 ~]# partx -a /dev/vdb 813 | [root@iscsi1-f15 ~]# pvcreate /dev/vdb[45] 814 | [root@iscsi1-f15 ~]# vgextend myvg /dev/vdb[45] 815 | [root@iscsi1-f15 ~]# pvmove /dev/vdb1 /dev/vdb4 816 | [root@iscsi1-f15 ~]# pvmove /dev/vdb2 /dev/vdb4 817 | [root@iscsi1-f15 ~]# pvmove /dev/vdb4 /dev/vdb5 818 | [root@iscsi1-f15 ~]# dmsetup table|grep myvg 819 | myvg-lv1--linear: 0 73728 linear 252:25 2048 820 | myvg-lv1--linear: 73728 90112 linear 252:25 75776 821 | myvg-lv2--linear: 0 122880 linear 252:25 165888 822 | myvg-lv2--linear: 122880 65536 linear 252:25 288768 823 | ``` 824 | 825 | 826 | ## Linux文件系统和磁盘管理作业 827 | 828 | 1. 分别在rhel6和rhel7上划分/dev/vdb磁盘,要求,/dev/vdb1大小为1G,/dev/vdb2大小为2G;创建对应操作系统默认的文件系统,rhel6默认ext4,rhel7默认xfs。 829 | 2. rhel6上将/dev/vdb2挂载在student家目录下使用,限制磁盘软限制为 3M、磁盘硬限制为 6M、文件软限制为 20 个且文件硬限制为 30 个 830 | 3. rhel7上完成: 831 | root用户: 832 | ```shell 833 | 1. 查看内核是否支持 quota 功能: 834 | 2. 查看 quota 程序包是否已经安装: 835 | 3. 查看 boot 目录是否支持 quota 功能(noquota 表示暂时不支持): 836 | 4. 让/boot 目录支持 quota 功能: 837 | 5. 重启主机后即可生效: 838 | 6. 查看 boot 目录是否支持 quota 功能(usrquota 表示已经支持): 839 | 7. 创建一个用于 quota 实验的用户 tom: 840 | 8. 需要允许其他用户对/boot 目录写入文件操作: 841 | 9. 使用 xfs_quota 命令设置对 tom 用户在/boot 目录的磁盘配额,具体要求如下: 842 | 使用 quota 专家模式限制磁盘软限制为 3m、磁盘硬限制为 6m、文件软限制为 3 个且文件硬限制为 6 个。 获取当前/boot 目录上的 quota 配额限制 843 | ``` 844 | 切换至 tom 用户: 845 | 1. 正常创建了一个为 5M 的文件: 846 | 2. 创建 8M 文件时强制终止并报错了: 847 | 3. 查看当前用户的 quota 限制(显示硬盘配额已占满): 848 | 849 | 切换至root用户: 850 | 1. 编辑 tom 的配额限制,将硬盘的硬限制修改为 8m(8192k): 851 | 852 | 切换至 tom 用户: 853 | 1. 再来创建 8m 的文件就不会有问题了: 854 | --- 855 | 4. rhel6和rhel7上完成lvm逻辑卷管理,要求: 856 | ```shell 857 | 1)/dev/vdb1 100M;/dev/vdb2 100M;/dev/vdb3 100M;/dev/vdb4 100M 858 | 2) 将/dev/vdb[1,2,3,4]做成pv 859 | 3)/dev/vdb1,/dev/vdb2组成vgtest300M 860 | 4)从vgtest中划分50M的lvtest1 861 | 5)将lvtest1挂载到/mnt下使用 862 | 6)拓展lvtest1至200M 863 | 7)拓展lvtest1至400M 864 | 8)缩小lvtest1至50M 865 | ``` 866 | --------------------------------------------------------------------------------