第七十六讲——加密类型机器算法(粗略涉及) TCP/IP中不提供任何加密协议,传输都是以明文的方式,就像明信片的方式传输,其他人可以查看其中的信息。 数据传输的机密性:明文传输有(ftp/http/smtp/telent) 数据传输的完整性:无论是别人篡改,还是在传输过程中由于信号问题导致数据错乱,我们都拒绝使用这样的数据,这样就能够保证数据的完整性,但是数据的完整性并不意味着全部的问题。 身份的认证:即身份的验证,在建立联系的时候能够有一种有效的手段来保证它就是所声称的那个人,这个过程就是身份验证的问题。 如何保证数据的机密性?一般来说,我们会对数据进行一定程度的处理,让人从表面的数据上猜测不出来其中的意思,这样的过程就是加密,加密本身就是一种转换规则,这种转换规则能够将我们输入的数据转换成一堆杂乱无章的难以识别的数据。 加密过程:明文(plaintext)---->(转换规则) 密文(ciphertext) 解密过程:密文(ciphertext) --->(转换规则) 明文(plaintext) 转换算法: 互联网安全体系结构设计中的一种基本法则,保证数据机密性的不是算法本身,而是秘钥,我们是依靠秘钥来保证数据的安全性的,这样一来即使得到了转换的规则但是没有秘钥也无法将密文转换成明文。 我们更换密钥是相当简单的,但是更换算法相当麻烦,而且算法是有限的,也不是说能设计就能够设计出来的,转换算法本身是复杂的数学运算实现的,一般来说,算法都是由数学家设计的,设计一个算法需要很长的时间,需要考虑各种因素,还要进行全方位的测试,还要考虑到计算能力的发展速度,几十年内会不会被破解,所以数据的安全性不是依赖算法,二是依赖秘钥,当然,算法是基础。 最初的时候TCP/IP协议设计的时候只是为了将两台计算机连接起来,并没有考虑到安全性的问题。 先讲一讲对称加密算法: 为什么叫对称加密算法?原因就是这个算法提供一个黑盒子,但是需要用户提供密钥,加密解密都是同一个密钥,所以才称为对称加密算法。 对称加密算法的特点是加密速度很快,但是其安全性几乎完全依靠秘钥。在通信对象很多的时候,对称加密算法无法完成有效的秘钥管理。 所以说对称加密算法在一定程度上解决了数据机密性的问题,但是没有办法帮助用户解决秘钥有效管理的问题。 数据完整性的问题:保证数据的完整性。 使用单项加密提取数据的指纹(特征码),将特征码附加在明文的后面,而后进行传递明文,以确定这串明文还是之前的那一段,没有被修改过。那么怎么去确定这段明文没有被修改过? 我们可以使用同样的加密算法对明文进行特征码的提取,并与接的特征码进行比较,如果特征码相同,则数据没有被修改。 单项加密的特性: 输入一样,输出必然一样。 雪崩效应,输入的一些微小改变,将会引起结果的巨大改变,避免密码的暴力破解。 定长输出,无论原始数据的大小,结果都是相同的 不可逆,单项加密的过程是不可逆的,也就是说无法根据特征码还原数据。 但是我们在传输的过程中有可能会因为传输设备的原因造成特征码或者数据的改变,造成提取的特征码与原特征码不相符,这样的情况数据就会拒绝接受。 我们需要防范中间人攻击,所以数据机密性手段并不能保证机密性本身,还需要借助额外的其他机制,将生成的特征码加密处理,用于数据完整性的校验。 还可以协商生成密码:密钥交换(IKE internet key exchange) Diffie-Heliman协议,是著名的互联网交换协议算法,其交换的过程如下: A----->B p、g(大素数,生成数[生成其它数]) p、g在换联网差UN蔬果称中国是可见的。 A主机在本地选择一个随机数x B主机在本地选择一个随机数y 且A主机不知道y,B不知道x。 A:g^x%p g的x次方对p取模 B:g^y%p g的y次方对p取模 根据离散对数原理,此时A只知道x,但是获取到了g^y%p的值B只知道y,但是获取到了g^x%p的值。由此我们可以列出一组方程 A:(g^y%p)^x=g^xy%p B:(g^x%p)^y=g^xy%p 我们可以看到,经过计算后A和B主机得到了相同的值,这个值就是秘钥。 这种算法的出现使得双方的秘钥交换变得十分简便,虽然解决了密码的问题但是却不能进行身份的验证。这种需求催生出了非对称加密算法的产生,也就是公钥算法。 公钥是从私钥中提取出来的,为了保证其安全性,私钥一般很长,使用公钥加密的只能使用私钥解密,使用私钥加密的只能使用公钥解密。 非对称加密算法中,公钥是公开的,所有人都知道,发送方使用的私钥能够实现身份的验证,发送方使用对方的公钥加密可以保证数据的机密性,公钥算法很少用来加密数据,因为其加密速度太慢,一般用于实现身份的验证。 于是,有了公钥算法之后,我们就可以将数据的特征码使用私钥加密,所有人都能够解密,但是不能够还原回去,这样结合起来就完成了数据的完整性和身份的验证。 但是公钥的获取成了一个难题,怎么在能知道这个公钥是不是对方的?为了解决这个问题,借助第三方机构进行认证。用户将自己的公钥提供给第三方机构,由第三方机构进行公证,制作一个数字证书,通信双方都有相同的证书机构发证机关的安全性很重要,因为我们需要自己去copy一份,合作和提交自己的公钥制作好之后下发,但是这个是收费的服务,而且费用不菲。 给自己讲linux 2017-02-14 评论 2316 次浏览
第七十五讲——常见系统故障的排除 我们首先要确定问题的故障特征 重现故障 实用工具收集进一步的信息 排除不可能的原因 定位故障 先从简单的问题入手 一次尝试一种方式 我们要记住两点: 一是修改配置文件的时候一定要备份源文件!! 二是尽可能的借助于工具,可以是命令,也可以是专门的诊断工具。 可能出现的故障: 管理员密码忘记 系统无法正常启动,可能是grub损坏(MBR损坏,grub配置文件丢失),还可能是系统初始化故障(某文件系统无法正常挂载,例如网络文件系统不在线,驱动不兼容),服务故障,用户无法登陆操作系统(bahs故障)。 命令无法运行:环境变量配置有误 编译过程无法继续:开发环境缺少组件。 MBR损坏时我们可以借助其他主机进行修复,还可以进入紧急救援模式。 boot.iso必须要有主机提供安装环境 使用完整的系统安装光盘 boot:linux rescue进入紧急救援模式,类似于win PE,但是要实现一些功能可能需要切换到真正的根下。 我们先以只读的方式将根文件系统挂载到/mnt/sysimage,如果我们需要对根文件系统中的文件进行操作,则要挂载为读写。 在紧急救援模式下没有设备文件。 #mknod 创建设备文件 说到这里多说一句,一定要了解一个版本控制工具(软件),svn、git su switch user切换用户 sudo CAMMOND切换用户后执行命令,即一个用户以另一个用户的身份执行命令,但是在命令执行的那一刻是以另一个用户的身份运行的,不切换用户。sudo可以实现某个用户能够以另一个用户的身份通过某主机执行某命令。 sudo还提供安全认证方式,在执行命令时需提供密码认证,防范其他人冒充执行相应的命令。 管理员和其他用户的所有命令都可以授权给其他用户执行,但一般来说,sudo命令是由管理员的身份执行一些管理类的命令。 谁可以以另一个身份执行什么样的命令的定义,通常保存在我们系统当中的sudo的配置文件当中。 /etc/sudoers 权限为400 只有root用户和root组中的用户才能查看其中的内容。 我们可以使用vim对/etc/sudoers文件进行编辑,但是我们不建议,因为直接编辑我无法检查其中的语法结构的正确与否,错误的语法会导致其他用户无法执行命令,严重的还会导致系统崩溃。 因此,sudo专门有一个visudo专门用于编辑/etc/sudoers,visudo这个命令本身能够检查/etc/sudoers文件本身的语法。 /etc/sudoers文件每一行为一个条目,定义了谁在哪个主机上执行什么命令(从远程连接到本机执行的命令)。 who which_host=(runas) command 定义别的主机可以远程在本机执行的命令: root ALL=(all) ALL 即管理员可以以任意身份执行任意命令。 为了方便管理sudo,提供别名的机制,类似定义了组,只不过sudo中应为别名。 sudo支持4类别用: 一是用户别名,一次定义一堆这样的用户拥有相同的权限。 #who user_alisa 主机别名,定义一个主机组,可以在一堆主机上执行。 #whitch_host host_alisa runas,表示以哪个用户的身份执行。 runas_alias 执行的命令:command cmmd_alias 别人定义遵循EBNF语法结构,EBNF是一种描述性的语言,这种描述性,这种描述性语言可以定义一个宏,它的取值可以是什么样的取值。 无论是哪一种别名,我们在定义别名的时候,别名的名字全部都需要使用大写英文字母的组合。 用户别名,一般来说可以包括当前系统上的用户。 user_alias(关键字) 除了可以定义用户,还可以定义组,在定义组的时候只需在组名前加百分号‘%’, %组名 用户别名中还可以包含已经定义好的用户别名,也就是别名可以嵌套。 主机别名:可以加‘!’进行取反 主机名 IP地址 网络地址 掩码可以是255.255.255.0或者24,数字。 其他的主机别名(嵌套)。 runas 别名,以那些用户的身份来执行命令。 可以是用户名 也可以是#uid %grup 其他的runas别名。 command别名 命令最后使用绝对路径 cmnd_alias 命令路径 目录(目录下的所有命令) 其他已定义的命令别名。 我们在执行sudo后的五分钟之内,不需要再次使用密码确认,所以其默认的时间为5分钟。 sudo –k(小写) 下一次使用sudo会重新要求输入密码,即sudo只生效一次。 sudo –l 列出当前用户所有可以使用的sudo类的命令。 -k 使认证信息仅当前有效。 作为管理员,我们也可以定义执行sudo命令,不需要输入密码确认,在命令前加上标签TAG: TAG: 使用冒号隔开 标签中最为著名的为NOPASSWD,标签之后的所有命令的执行都不需要再输入密码确认,如果某个命令需要定义密码,将命令拿出来使用passwd定义标签,PASSWD:COMMAND 如果我们有很多的命令,则完全可以进行别名的定义,将需要密码和不需要密码的命令进行区分,我们需要注意的是,PASSWD等标签不能再写入其中。 在命令前加‘!’感叹号,表示不执行此命令,取反的优先级最高。 我们要知道passwd命令很强大,如果passwd是以root身份运行,是可以修改root密码的,因此要将/usr/bin/passwd排除在外。 !/usr/bin/passwd 感叹号为不允许执行,取反的优先级是最高的。 sudo /usr/bin/passwd 不跟参数时默认为修改管理员的密码,sudo是以root的身份运行的,简单的取反是不能够完全阻止root密码的修改,因此/usr/bin/passwd后面必须要跟一个字符,格式如下: /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwdroot 即允许/usr/bin/passwd的执行,但是必须要有参数,且参数不能为root 任何用户使用sudo命令操作都会记录到日志当中。 给自己讲linux 2017-02-13 评论 2349 次浏览
第七十四讲——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 评论 2385 次浏览
第七十三讲——日志系统: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 评论 2439 次浏览
第七十二讲——使用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 评论 2446 次浏览
第七十一讲——计划任务 我们在写完脚本后期望这个脚本在将来的某一时刻执行,这种机制称为任务计划。 一是在未来的某个时间点执行一次某个任务 二是周期性的执行某一任务 任务计划的实现: 当任务只执行一次的时候,我们可以使用命令完成。 #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 评论 2516 次浏览