第七十四讲——ssh服务 telent :远程登录协议基于23/tcp C/S架构:S是server服务端,C是client客户端 ssh:secure.shell,应用层协议 22/tcp 通信过程以及认证过程是加密的,为主机认证,用户认证过程加密,数据的传输过程加密。 ssh v1 v2(version版本) ssh v1无法防范中间人攻击(man-in-middle) 认证的方式有两种,一是基于口令认证,二是基于密钥认证。 实际上协议只是一种规范,ssh便是以C/S架构的形式使用ssh协议规范建立会话。 在linux上使用的是openSSH C/S:服务器端sshd,配置文件位于/etc/ssh/sshd_confog 客户端为ssh,配置文件位于/etc/ssh/ssh_config。 openSSH命令: #ssh-keygen 密钥生成器 #ssh-copy-id 将公钥传输至远程服务器 #scp 远程复制,且复制过程加密,是一种跨主机的安全复制工具。 我们在使用ssh远程连接的时候,如果没有指定用户,则默认使用当前主机上当前已登录的主机作为登录的用户。 ssh远程连接的格式如下: #ssh USERNAME@HOST #ssh –l USERNAME HOST 我们如果只是想执行一条命令,还可以这么做 #ssh USERNAME@HOST ‘COMMAND’ 在登录远程主机成功时执行命令后退出。 #scp SRC(源) DEST(目标) SRC(源)可以是多个,但是DEST(目标)一定要是目录 #scp –r 递归复制,或者-a选项。 不论远程主机作为源还是作为目标,都要指定远程主机的属性: #scp USERNAM@HOST:/path/to/somewhere DEST(目标) #ssh-keygen 密钥生成器 #ssh-keygen -t rsarsa为加密方式,是一种常用的加密方式。 生成密钥之后,密钥保存在当前用户家目录下的.ssh目录下 ~/.ssh/id.rsa私钥 ~/.ssh/id-rsa.pub公钥 将生成的公钥复制到远程主机上对应用户的家目录下 ~/.ssh/authorized_keys文件中,或者~/.ssh/authorized_keys2文件中。 我们只能使用追加保存,因为需要登录到主机的用户不止我们一个。 #ssh-keygen生成密钥时会有输入密码的提示,这个密码是用于加密私钥的,这样一来以后每一次访问私钥都需要输入密码。 ~/.ssh目录的权限一定要是700 我们可以使用scp命令将公钥传输到远程主机,并将id_rsa.pub中的内容追加到远程主机~/.ssh/authorized.keys中。 cat id_rsa.pub >> ~/.ssh/authorized.keys如果.ssh目录不存在则需要创建 我们也可以使用ssh-copy-id实现上述步骤,但是并不是所有的主机都支持ssh-copy-id命令 #ssh-copy-id -i指定key的位置,一般来说在~/.ssh/id_rsa.pub shh-copy-id -i ~/.ssh/id_rsa.pub root@172.168.0.1 远程主机不需要指定公钥的位置 此过程只是单向的,本地主机使用私钥,远程主机使用公钥,如果是双向,则需要在两台主机上都写入对方公钥。 #ssh-keygen时也可以自行指定,不需要再交互窗口输入 -t 加密类型 rsa -f 文件的保存位置 -P(大写)密码的指定 #ssh-keygen –t rsa –f ~/.ssh/id_rsa.pub –P‘password’ ssh功能很强大,是很重量级的服务,因此并不适用于小系统,于是就有了专门为嵌入式系统打造的ssh。 dropbear:嵌入式系统专门的服务端和客户端工具 dropbear服务器端叫做dropbear 客户端叫做dbclient dropbearkey生成服务器端使用的key,主要用于服务器端实现主机认证的需要。 dropbear默认使用nsswitch实现名称的解析,因此,我们使用dropbear的时候也得将nsswitch一并安装。 nsswitch相关文件: /etc/nsswitch.conf /lib/libnss_files* /usr/lib/libnss3.so /usr/lib/libnss_files* 如果没有nsswitch,就无法完成名称的解析,也就无法实现将用户名转换成id dropbear会在用户登录时检查其默认shell是否为当前系统的安全shell,什么是安全shell?写入/etc/shells文件中的shell为安全shell,在这个文件中我么可以定义允许使用的shell。 我们得使用宿主机编译dropbear 首先我们得下载dropbear源码,并确认主机上的编译环境是否准备就绪。 #tar –xf dropbear* #cd dropbear目录 #./configure #make #make install 如果我们对编译指定的条件不了解,可以查看其帮助文档: #./configure --help |less 查看安装帮助文档 安装好文件之后进行移植,这里所谓的移植其实就是将程序copy到相应的目录,然后将程序依赖的库文件也一并复制到/lib/目录下。 我们还需要一个远程用户的伪终端。 在/etc/fstab中写入 devpts(名称) /dev/pts(挂载点) devpts(文件系统类型) mode=620(权限,还可以指定其他) 0 0 mkdir /dev/pts dropbearkey生成的密钥位于/etc/dropbear目录下 RSA:dropbear_rsa_host_key 长度可以指定,为8的整数倍 DSS:dropbear_dss_host_key长度固定,默认为1024 #dropbearkey -t 指定加密类型rsa/dss -f 指定文件的位置 -s 指定密钥的长度,SIZE(可以省略) 指定一个服务启动时使用-E、-F表示在前端运行。 给自己讲linux 2017-02-12 评论 2388 次浏览
第七十三讲——日志系统:syslog 根据记录的详细程度可以划分日志的级别,一般来讲不同的日志系统所支持的日志级别是不一样的。 日志的子系统:facility(设施等等) 动作:一是将产生的信息记录到文件,二是将记录的信息发送给其它主机,并由其它主机记录,三是通过管道送给其他命令,由其它命令来进行处理。 linux上的日志系统有:syslog、syslog-ng(g代表第几代next generation) syslog比较古老,在红帽5及以前的版本使用 redhat 6 以后使用的是syslog-ng 我们需要注意的是,在linux上,任何一个程序都可以自己产生日志,自己负责记录,指定记录位置 这样一来,每一个程序的日志记录就会不一样,很难识别其中的内容。于是linux操作系统创建了一个程序,负责记录各程序产生的日志信息,这个程序就是syslog,syslog是一个服务,专门用于提供记录日志的功能,可以为各程序记录日志,每一个程序都可以理解为syslog的子系统,但是一些web服务并不是使用syslog记录日志,因为它们可以定义更具体、更详细、更容易定制的格式。 也就是说,syslog固然是一个接口,但是未必所有人都使用,一般来说系统中常见的固定在系统和欣赏的facility(设施),它们所产生的日志才交由syslog处理。 syslog有两个进程: syslogd:系统,专门记录非内核所产生的日志 klogd:内核,专门记录内核所产生的日志 syslogd与klogd记录的日志详细程度有很大的不同 我们在开机的时候,最先看到的信息是输出到物理终端上的,然后切换到虚拟终端(login界面),ssh登录的为伪终端。 因此:kernel ---->物理终端(/dev/console) kernel在初始化的时候会探测各硬件类型,这些信息都会记录下来,在/var/log/dmesg中查看,我们可以直接#cat /var/log/dmesg文件,也可以直接调用#demesg命令查看。 #cat /var/log/dmesg 记录内核的操作 #dmesg 命令查看 这些为启动init程序之前产生的日志 init启动后所有的记录有syslogd完成,非内核日志。 /var/log/messges: 系统标准错误日志信息 大多数子系统产生的错误日志都存放于该文件当中。 init所产生的信息都在/var/log/messages中,因此在/var/log/messages中并不完全是错误的信息 /var/log/messages文件是记录信息最多的文件,当随着时间的推移,文件会变得越来越大,因此日志文件需要滚动。 日志的滚动:每隔一段时间将一个旧的日志文件更名,并打开一个新的messages进行记录。 日志的滚动可以按照日期进行滚动,也可以按照文件的大小进行滚动,日志的滚动我们也称为日志的切割,可以将日期和文件的大小结合起来使用,即先满足那一个条件就先进行切割。 #logrotate 日志的滚动命令 在/etc/cron.daily/下有一个logrotate脚本 /etc/logratate.conf为logrotate的配置文件。 rotate #(number) #为数字,意为保留几个分割。 在logrotate脚本中,包含了/etc/logrotate.d下的所有的文件,各子系统的定义,如果我们需要进行定义,也可以在/etc/logrotate/目录下参照其他文件来定义日志如何滚动,只需要将配置文件写入相应的目录,无需复杂的脚本。 /var/log/maillog 邮件系统产生的日志信息,邮件由谁发送给谁都有相应的记录。 /var/log/secure 这个文件的权限比较独特,一般不允许随意查看,里面记录了用户登录的所有信息,谁尝试登录过该主机,由哪个主机登录,我们可对此文件进行分析,从而判断是否被入侵。 syslogd和klogd属于进程。 配置文件:centOS 5以前:/etc/syslogconf centOS 6开始:/etc/rsyslog.conf 配置文件的定义格式为: facility(子系统) priority(日志级别) action(动作) facility。可以理解为日志的来源或者设备,目前常用的facility有一下几种: auth 认证相关 authpriv 权限,授权相关 cron 计划任务相关 daemon 守护进程相关 kern 内核相关 lpr 打印相关 mail 邮件相关 mark 标记相关 news 新闻相关 security 安全相关,与auth相似 syslog syslog自己的,即日志系统产生的日志信息 user 用户相关 uucp unix to unix to cp相关 local 0 – local 7 用户自定义 *表示所有的facility priority 日志级别(log level)一般有以下几种级别,由低到高 debug 程序或者系统的调试信息 info 一般信息 notice 不影响正常功能,但是需要注意的信息 warning/warn 可能影响系统功能,需要提醒用户的重要事件 err/error 错误信息 crit 比较严重的 alert 必须马上处理 emerg/oanic 会导致系统不可用 *表示所有的日志级别 none 跟*相反,表示什么也没有,什么都不记录。 从日志的级别可以看出,级别越低记录的信息越详细。 一般来说,我们定义一个日志级别后,比我们定义的级别高的内容都会被记录 action动作,即日志的记录位置 系统上的绝对路径 普通文件,如/var/log/* | 管道,通过管道送给其他命令处理 终端 如/dev/console @HOST 远程主机例如@10.0.0.1 用户 系统用户,如root *登录到系统上的所有用户,一般emerg级别的日志是这样定义的。 定义日志级别的格式: mail.info /var/log/maillog 表示将mail相关的日志级别定义为info,并记录到/var/log/maillog中。 auth.=info @10.0.0.1 只记录info级别的信息,并发送到10.0.0.1主机 user.!=info 表示只记录user相关的info之外的所有信息 user.!error 表示只记录比error级别低的信息 *.info 记录所有可能产生日志子系统info级别以上的信息。 mail.* 表示记录mail级别所产生的所有级别的信息。 cron.info;mail.info 多个日志来源使用分号隔开 cron,mail.info 等价于 cron.info,mail.info mail.*;mail.!=info 表示记录除了info级别外的所有信息。 日志信息是同步写入磁盘的。 重新修改配置文件后不会立即生效,但是重启服务的过程中有日志需要处理rsyslog是接收不到的,我们可以借助一个命令实现不重启服务读取配置文件的信息 #reload service rsyslog reload 向rsyslog程序发送1信号 在/etc/sysconfig/rsyslog中写入 SYSLOGD_OPTION=”-c 5” 我们在引号中加入-r选项可以启用远程日志服务,可以接受其他主机的日志。 buybox中也有klogd/syslogd,因此,我们只需要一个配置文件就可以定义需要记录的日志信息,在redhat系列6.0以后,使用的都是syslog.ng,syslog.ng同syslog的风格不尽相同,但是红帽尽可能的使两者的风格统一。 给自己讲linux 2017-02-11 评论 2443 次浏览
第七十二讲——使用buybox手动攒系统 kernel+initrd(buybox制作)+rootfs(buybox制作) 在内核中是没有编译ext3文件系统的,而真正的文件系统是ext3格式的,这就意味着buybox要提供ext3文件系统,当ext3装载进内核,内核就能够识别ext3文件系统了,就能够加载根文件系统rootfs,rootfs基于buybox制作,虽然buybox很小,但是buybox能够提供的命令非常多。 #make arch/ 只编译核心(内核) 只编译对应目录下的源程序,但是arch还是紧密的依赖各模块的,所以会遍历各模块。 当编译完成之后,在arch目录下会有一个目录,32位操作系统下为X86/boot/bzimage bzimage表示是使用bz压缩的映像文件,于是我们只需要将这个文件复制到/boot目录下并改名为vmlinuz即可。 硬件驱动:initrd用于装载访问根文件系统所依赖的驱动(存储设备和文件系统相关的模块)。余下的驱动由rc.sysinit完成初始化,如果系统所在的设备为U盘的话,initrd还需要提供U盘的驱动。即initrd需要提供内核访问真正根文件系统所在设备需要的驱动程序,和文件系统相关的模块。 rootfs: buybox的init是不支持运行级别的 buybox只支持ash,hash,如需要支持bash则需要移植。 busybox提供的init的配置文件/etc/inittab的格式与系统带的格式不尽相同,如果我们移植了系统上的init,则/etc/inittab也要符合其规则。 首先对硬盘分区挂载,安装grub grub-install –root-directory=/mnt/root(为新硬盘的挂载点) /dev/sd# 为新硬盘中的系统创建必须得目录。 提供内核:将编译后的bzimage复制到新系统的/boot目录下 #sync 同步硬盘数据 提供initrd文件,使用buybox(先将buybox先展开) buybox所依赖的内核的头文件比我们rhel5.8系统的要新一点,因此我们先去下载一个新的内核文件。 #mkdir */buybox*/include/mtd #cp 下载内核下/include/mnt/ubi-user.sh */buybox*/include/mtd 即将展开后的内核的头文件放入buybox中, 然后切换到buybox目录中,执行make menuconfig 打开buybox中的配置文件,只需要将编译选项修改一下,编译为一个静态文件,移植起来比较方便,安装路径也可以修改,直接更改为需要的目录。 #make install 创建initrd文件: cd到buybox目录 #mkdir /tmp/initrd #cp _install/* /tmp/initrd -a 除了bash命令,其他的命令基本上都有 将目录里为linuxrc的链接文件删除。 创建设备文件: #mknod */dev/console c 5 1 #mknod */dev/null c 5 3 #ls dev/确定设备下的设别文件没有问题 创建init脚本 #vim init #!/bin/sh(buybox下没有bash,只有ash,hash) mount –t proc(类型) proc(文件系统) /proc(挂载点) mount –t sysfs sysfs /sys #挂载proc和sys伪文件系统,proc中为内核参数的映射文件,sys用于输出硬件信息,在这里必须要手动声明,不然内核无法正常工作,或者说内核无法探测到其他硬件,也无法将信息输出给用户空间 insmod /lib/modules/jbd.ko insmod /lib/modules/etx3.ko #加载内核模块(ext3文件系统) 为了将加载模块的信息进行输出到启动屏幕,我们还需要对init脚本进行修饰。 #vim init #!/bin/sh buybox支持的为ash,hash echo “mounting proc and sys...” mount –t proc proc /proc mount –t sysfs sysfs /sys echo “loading ext3 modules...” insmod /lib/modules/jbd.ko insmod /lib/modules/ext3.ko echo “defect and export hardwareinfomation...” mdev –S echo “mount real rootfs to/mount/sysroot...” mount –t ext3 /dev/hda2 /mnt/sysroot echo “switch read rootfs..” exec switch_root /mnt/sysroot /sbin/init 保存并给予执行权限 #chmod +x init 内核的版本一定要与模块相匹配 给自己讲linux 2017-02-10 评论 2449 次浏览
第七十一讲——计划任务 我们在写完脚本后期望这个脚本在将来的某一时刻执行,这种机制称为任务计划。 一是在未来的某个时间点执行一次某个任务 二是周期性的执行某一任务 任务计划的实现: 当任务只执行一次的时候,我们可以使用命令完成。 #at at 时间 会给出一个at>的提示符,在at提示符下输入需要执行的命令,可以写入多条,使用ctrl+d提交。 at 指定时间的方法有很多 一是指定几点几分(绝对时间)HH:mm 二是以日月年的格式指定 DD.MM.YY now+#一向对时间来进行指定,单位可以为minutes、hours、days、weeks now+3minutes 还可以指定模糊时间: noon 正午 12:00 midnight 午夜 24:00 teatime 喝茶时间 下午16:00 命令的执行结果将会以邮件的形式发送给安排任务的用户。 at –l显示作业的列表,有四列: 第几个作业 执行时间 执行队列(作业队列,只能使用单个字符分类,默认为a) 执行用户 删除一个作业 at –d 作业号(job ID) #batch batch不会要求指定时间,它会在系统空闲时自动执行。 若果所有的用户都可以执行at命令,那么系统就会变得很繁忙,所以我们可能需要对用户进行限制。 /etc/at.deny黑名单 /etc/at.allow白名单 这两个文件不能同时存在,若同时存在只有at.allow生效,如果两个文件都不存在,则默认只有root用户能够使用at命令 如果黑名单存在,但是为空,则所有用户都允许。 如果白名单存在,但是为空,则默认只有root用户允许执行。 周期性的执行某任务: 当我们需要周期性的执行某项任务,必须借助cron服务来实现。 cron:自身是一个不间断运行的服务 如果在执行时间的阶段因关机错过了服务则不会再次执行服务,因此cron有一个补充程序。 anacron:cron的补充,能够实现cron因各种原因在过去时间点该执行而未执行的任务,在恢复正常之后执行一次。 anacron能够监控cron服务,在服务器上anacron是默认不启动的,因为服务器不经常关机。 cron:系统cron和用户cron的格式是不一样的。 系统cron任务:有七个阶段(需指定执行者) /etc/ccrontab 五个段指时间,一个段指用户,一个段指任务 系统cron格式:分钟 小时 天 月 周 用户 任务 用户cron任务:有六个阶段(五个段指时间,一个段指任务) /var/spool/cron/USERNAME cron中的每一个字段都使用空格隔开 用户cron格式:分钟 小时 天 月 周 用户 任务 每一段时间的取值范围都是特定的 分钟 0-59 小时0-23 天1-31 月1-12 周0-7 0/7都表示周日 时间的同配表示: * 所有对应有效的取值 , 离散的时间点例如 10,40 * * * *每小时的10分、40分执行一次,即为每半小时任务。 ‘-‘ 连续的时间点 1012 * * 1-5 每周一至周五的12:10执行一次 ‘/’ 表示对应取值范围“每” */3* * * * 每隔三分钟执行一次 0 */2 * * *每两小时执行一次 cron的执行结果将会以邮件的形式发送给管理员,如果不想接受邮件,可以将所有的结果送入/dev/null cron的环境变量:cron中执行的命令也会到PATH环境变量中去寻找,因此应在脚本中声明PATH环境变量,如果用户么有登陆则不能以用户的环境变量去执行,cron的环境变量很简单/bin:/sbin:/usr/bin:/usr/sbin,这样我们的计划任务才能够正常的执行,当用户在线时计划任务是正常执行的,但是当用户登出后就不一定了,因此我们在cron中的命令要写绝对路径,或者先声明环境变量。 我们很多的脚本中也是需要环境变量的,因此我们在脚本中需要先定义好环境变量。 cron中进行全局声明: export PATH=/bin:/sbin:/usr/sbin:/usr/bin等等 对于系统而言,和用户没有关系,因此可以直接定义PATH PATH=* MAILTO=username 邮件接受者 SHELL=/bin/bash 以哪一个shell作为命令解释器。 run-parts 由红帽系统提供的功能,可以执行一个目录中的脚本,按顺序执行,如果我们想要将某一个脚本提前执行,在脚本名称前加上数字即可。 如果有用户定义cron,则在/var/spool/cron下有一个与用户名同名的文件。 用户计划任务的管理,周期性执行的任务。 使用crontab命令 crontab –l 列出当前用户的cron任务 -e 编辑(能够自动检查语法错误) -r 移除所有任务(删除cron文件) -u USERNAME,跟上其他三个选项,管理其他用户的cron(仅限管理员) anacron,作为cron的补充,即当cron中的任务由于意外没能正常执行,当系统恢复之后执行此前没有执行的cron任务,nancron只是作为cron的补充,无法替代cron。 anacron:/etc/anacron,一共有四个段,前两个段指的是时间,第三个段是注释信息,第四个段为需要执行的任务。 第一字段:指这个任务过去有*天没有执行(最小单位为天) 第二字段:当开机后的第几分钟执行此计划任务 我们需要知道的是,无论是cron还是anacron,我们需要确保cron服务一定要执行。 #service cron status #service anacron status 一般来说,nancron服务在服务器上是默认关闭的,因为服务器大多是7*24小时在线的,需要用到anacron的是笔记本一类需要关机的机器。 给自己讲linux 2017-02-09 评论 2522 次浏览
第七十讲——攒系统之外的杂项 我们可能已经能够将攒的小linux在虚拟机上挂载启动了,看着启动起来的界面是不是感觉也不是那么难?我们在复制命令及其依赖的库文件时是不是觉得太繁琐了,实在是辛苦,当然写个脚本也是能够代替手工操作的,以之前的脚本功底按理说实现起来并不复杂。 那么接下来就介绍一个逆天的工具,其实也不是工具,是一个程序,叫buybox,这个程序能够实现多个命令的操作,仅依靠一个二进制的程序,听起来是不是很厉害的样子? 我们下载buybox并安装,进入/bin下有许多的连接文件,这些链接文件名称都是系统中的命令,且都指向buybox,也就是说名字不一样功能也就不一样,实在是厉害。 所以我们完全可以使用buybox+内核搭建一个平台,也就是说,我们可以使用buybox做成一个initrd文件,即虚拟根文件系统,再使用buybox来作为真正的根文件系统+kernel,但是buybox上面没有bash,但是我们可以移植过去,busybox自带的shell有ash和hash。 查看本机的硬件信息: cat /proc/cpuinfo lsusb列出本机的usb属性信息 lspci 显示出pci总线的所有设备类型 hal-device更为详细的硬件信息 Hardware Abstract Layer硬件抽象层 驱动可以做进内核,也可以做成模块,一般来说核心硬件,如硬盘驱动最好做进内核,而网卡驱动一类做成模块。 内核的编译: 一配置: #make menuconfig #make gconfig #make kconfig 二编译整个内核 #make 三模块的安装位置/lib/mudles/KERNEL_VERSION #make install 四是安装 make install 我们可能会遇到当编译完内核后,还需要添加模块,这个时候我们只需要编译一个模块或者一个目录,即实现部分编译。 一是只实现编译某子目录下的相关代码 #make /dir(指定相应的目录即可) 在我们解压内核后会看到arch目录,此目录下为根硬件平台相关的内核核心,但是在编译核心时也会编译模块,因为我们选择了哪些模块以及内核支持哪些模块,核心得知道,核心会将模块遍历一遍,可能不会安装或者编译。 二是只编译部分模块 make /device/net 三是只编译某一模块 make */device/net/pcnet32.ko 四是将编译完成的结果放到别的目录 make o=/tmp/kernel 编译buybox,同内核编译。 make menuconfig make make install 交叉编译:用A平台编译非A平台上的程序的方式叫做交叉编译。 bash特性: 变量的默认赋值: 当一个变量为空或者不存在时(用户没有从键盘上输入),我们可以这么操作: ${A:-30}即当$A存在且不为空时为$A中的值,否则将30赋值给$A ${A:+30} 与-相反,如果A不空使用后面的值,如果A为空,则A为空。 ${parameter:+word} 如果parameter未定义或者为空,则变量展开为word的值,并将展开后的值赋值给parameter 变量的切片: ${A:3:4}表示截取变量A略过前三个字符后,截取四个字符,截取字段可以省略,表示至末尾字符。 3:略过几个字符 4:截取几个字符 我们知道服务脚本是支持配置文件的,一般说来服务脚本位于/etc/rc.d/init.d下,配置文件位于/etc/sysconfig下 服务脚本的配置文件一般与服务脚本同名 局部变量,使用local进行定义,只在函数中有效。 #mktmp 用于创建临时文件或目录 #mktmp /tmp/file.## ##为随机生成的数值,该命令的返回值为一个文件的路径。 #mktmp –t 创建一个临时目录。 信号:进程间通信的一种方式 kill –SIGNAL PID 1 HUP 2 INT 9 KILL 15 TERM 我们在脚本中可以实现(9、15)信号外的信号捕捉 ctrl + c 发送的是2号信号 在脚本内部使用trap命令进行命令的捕捉 trap ‘COMMAND’(执行的命令)信号列表(需要捕捉的信号列表) 一行中执行多个语句时使用分号分隔即可。 当我们退出时需要执行很多的操作,此时我们可以定义一个函数,将一些创建的临时文件删除,或其它保护操作。 给自己讲linux 2017-02-08 评论 1718 次浏览
第六十九讲——手动攒系统(二) 当我们攒完一个小系统后,添加所需要的命令,但是我们经过尝试使用halt、init命令并不能实现关机、重启,原因是我们使用halt –p/init 0都是先进行运行级别的切换,再执行对应级别下的脚本,K##、S##等等,所以执行halt命令并不能在命令行下关机。 exec halt –p使用exec后指令替换父进程,然而exec helt –p也不能完成在新攒的系统上关机。 因此我们需要将脚本写入对应级别下,并在inittab文件中声明级别。 10:0:wait:/etc/rc.d/rc.sysdone(脚本名字随意,自己要能够看懂) 我切换级别的时候,应该是先将对应级别下K开头的stop掉,S开头的脚本start起来。 在我们攒系统的过程中因为硬盘的同步可能不是实时的,我们使用sync命令同步数据到硬盘,否则会因为数据不全或者文件系统中的inod号异常而造成文件系统崩溃。当文件系统损坏时,我们应当进行修复,修复之前应当先将所有文件打包存放到其他地方。 首先cd到损坏的文件系统中 find . |cpio –H newc –quit –o |gzip -9>/root/sysroot.gz 卸载损坏的文件系统,umount 挂载点 修复文件系统,其实也就是重新格式化文件系统 mke2fs –j /dev/sd# 重新挂载文件系统到指定的挂载点,mount命令实现挂载,不再赘述。 cd 进入修复好的文件系统中,将打包的文件还原回来 zcat /root/sysroot.gz |cpio –id 展开归档后继续重新以新的硬盘作为启动盘尝试启动攒的linux系统。 在红帽系列系统启动时,如果服务正确启动,我们会看到显示绿色的OK字样,如果服务启动失败,则显示FAIL红色,且总是显示在行末,其实现的机制为输出打印时计算屏宽。 例如: A=”12346” echo ${#A}在变量名前加#,取变量中所包含字符串的长度。 ${#VARNAME},使用此特性计算[ok]/[fail]字符的长度。 stty –F /dev/console size 显示物理终端的屏幕大小 输出为25 80 25行 80列(又叫屏宽) 使用屏宽减去字符的长度得到空格的长度,然后将[OK]/[FAIL]追加在行末。 当我们在脚本中调用一个文件中定义的函数的时候,得先装载,装载的方法为: . /path/to/function_name(函数所在目录) 函数文件在头部不用声明魔数,即!#/bin/bash等等 我们在登录操作系统后,会发现下面会有一些打印的信息,这些信息实际上是从一个文件中读取的并输出的,这个文件为/etc/isue,而内核在使用这个文件的时候并不是全部打印,因为在/etc/issue文件中存在逃逸字符,例如\r、\m分别代表uname –r、uname –m,这是由mingetty调用完成的。 #man mingetty可以查看到在/etc/issue文件中支持的逃逸字符。/etc/issue为终端的提示信息,在要求用户登录时显示,也可以使用mingetty指定显示。 grub.conf(/boot/grub/) ############## timeout=5 title linuxhobby.top root (hd0,0) kernel /vmlinuz ro root=/dev/hda#(指定根的位置) quiet(静默模式) 内核的初始化信息 ############## 我们需要知道的是,我们在操作系统启动起来之后看见的登录界面是由login程序所提供的页面。 login也可以实现用户的验证,在编译login时需要依赖pam模块,pam是红帽验证用户的插入式模块,对于系统来说,认证用户是到特定的位置实现的,这个特定的位置就是/etc/passwd、/etc/shadow。 而实际上,操作系统并不是这么工作的(直接访问passwd、shadow文件),我们的用户账号是放在别的位置,例如放在NIS、LDAP、MYSQL数据库中,只是我们传统是放在这两个文件当中。 这也就意味着我们在编译login程序时,将其直接连接到/etc/passwd、/etc/shadow文件,这样一来我们想要变更认证方式就变得比较困难,所以在/etc/passwd、/etc/shadow文件之间有一个中间层(nsswitch) nsswitch:network service switch网络服务转换/切换 nsswitch是一个柜架,它能够完成到哪儿去找用户的账号密码,在我们想要变更认证方式的时候,只需要修改/etc/nsswitch.conf即可实现。 nsswitch实现的功能叫做网络服务转换,也叫做名称解析开关,它只是定义了名称解析是如何工作的:用户的名称转换成ID号,将用户的组名转换成ID号,将主机名转换成ID号。 nsswitch既然是一个服务(程序),那么就可能会依赖库文件,nsswitch依赖的库文件都是以libnss开头的,32位的操作系统存在/lib下,64位存在于/lib64.在/usr/lib(64)下也存在库文件。 我们在攒一个操作系统的时候,需要将必须的库文件复制过去,nsswitch中间层所需要的库文件也是。 /lib(64)/libnss* files(链接文件) 指定、/etc/passwd、/etc/passwd的位置 在复制时保留链接文件使用-d选项 cp –d 复制链接时,保持连接属性。 我们在执行mingetty程序的时候,mingetty会启动一个终端,在启动终端后再在这个终端上执行一个login的程序(打印登录提示符) --loginprog=/bin/login默认调用的登录程序,我们可以定义/bin/bash让其直接执行bash程序 mount –n –o remount,rw /将根重新挂载为读写 stty –F /dev/console speed 显示当前显示器的速率,显示器属于线性设备,一般为38400. e2fsck –f /dev/sd# 强制检查文件系统,检查文件系统是相当耗费资源的,所以在服务器上一般将自动检查文件系统关闭,避免服务器瞬间超负荷运转。 小技巧: 在虚拟机中添加一块SCSI硬盘不能被立即识别的办法(重启一般能够解决) #cd /sys/class/scsi_host/ ls当前目录会发现有几个或一个以host#开头的文件,我们向其中echo一句话 #echo “- - -” >host#/scan 此时我们使用fdisk –l查看会发现scsi类型的硬盘已经显示出来了。 给自己讲linux 2017-02-07 评论 1718 次浏览