基础学习

编程知识 更新时间:2023-05-03 03:20:45

Linux的基本原则:

1.  由目的单一的小程序组成;组合小程序完成复杂任务

2.  一切皆文件

3.  尽量避免捕捉用户接口,尽量少的与用户交互

4.  配置文件保存为纯文本格式

5.  命令提示符prompt,shell

      # root

      $ 普通用户

6. 命令格式

    命令  选项

7. 文件类型

   - 普通文件

   d 目录文件

   b 块设备文件

   c 字符设备文件

   l 符号链接文件

   p 命令管道文件

   s 套接字文件

8. 文件权限

   一共9位,每个都是三位一组,rwx(读写执行)

9. 文件硬链接的次数(文件连接数)

  

10. 文件大小(size),单位是字节

11.时间戳,每个文件都有三个时间戳,最近被修改,访问,改变,查看显示的是最近一次被修改的时间

12. ls 参数 –h 做单位转换 –a 显示以 . 开头的文件 (.表示当前目录 .. 表示上一级)

-d显示目录的自身属性,-i显示索引节点号,-r逆序显示文件,-R递归显示(相当的消耗内存如果小文件较多的话)

13. cd命令参数  后面使用 – (横线)在上一个目录和当前目录中跳转

命令的类型

     内置命令(shell的内置),内建

     外部命令 在文件系统的某个路径下有一个与命令名称相应的可执行文件

14. type命令:显示制定属于哪种类型

15. 环境变量:命令的内存空间 printenv查看当前的变量环境

 Hash显示命中数量

16. 在/usr/share/doc 下有很多文档几乎所有的命令介绍文档都在这个目录下面,但不是全部的,里面会有所有的历史,介绍修改等等资料。

17. cal 12 2012 查看2012年的12月的月历 也可以没有12这个参数直接查看2012年的年历

18. echo的转义符号,想使用下面的转义符号,首先要加上-e参数才可以

19.linux目录的功能:/boot 系统启动相关的文件,如内核,inittrb以及grub(bootloader),

  /dev 设备文件:块设备,随机访问,数据块

                  字符设备,线性访问,按照字符为单位

  /etc 配置文件

  /lib  库文件,/lib/modules : 内核模块文件

     静态库(.a)   动态库 (.so)

  /media : 挂载点目录,移动设备

  /mnt :  额外的临时文件

  /opt :可选目录,早期用来安装第三方软件 

  /proc :伪文件系统,系统启动后他就自动填充,里面的文件全部都是内核映射文件

  /sys :伪文件系统,和硬件设备相关的属性映射文件(很多调优工作和他有关)

  /tmp :临时文件系统,里面的文件如果一个月没有调用会自动删除,而且用户只能的添加不能删除,有T为的权限目录。

  /var : 可变化的文件

  /bin: 可执行文件,用户命令

 /sbin :管理命令

 /usr : shared,read-only 这里放的是只读文件

20. 文件管理

   使用 tree命令查看目录树

mkdir –pv /root/p/b/m 递归的建立多个目录 –v选项是查看这个过程

21. Stat命令,显示文件的时间戳(改变,访问,修改)

文件类命令

Cat命令,

-n显示行号

-E显示每一行的结束符号,Linux中的每一行都是使用$符号结束的

-T显示制表符

-A显示所有

Tail命令

-f参数可是实时的监控文件的增长一直的查看文件的尾部,不退出等待显示后续追加的新内容

Cut命令,剪切命令

-d:指定字段分隔符,默认是空格

-f:指定要显示的字段-f 1,3显示一和三行,-f 1-3显示一到三行

-c#:直接截取第#个字段

Join命令,合并命令

实现文本排序:

 Sort:并不影响源文件,只是输出的改变。

     排序方法:默认根据升序排列,-n数值排序,-r逆序,-t指定字段分隔符,-k截取所需要的字段

-u排序后不显示重复的字段

文本统计:wc,可以统计行数,字符数,字节数

        只显示行数–l

        只显示字符数–m

        只显示单词  -w

        最长的一行包含多少个字符  -L

字符处理命令 tr -----用于实现转换或删除字符

将/etc/passwd读入然后将所有的a-z转换成A-Z

    -d:删除出现在字符集中的所有字符

uniq是unique的简写。
一.介绍 
功能说明:检查及删除文本文件中重复出现的行列
二.语法
语  法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
补充说明:uniq可检查文本文件中重复出现的行列。 
三.常用参数:
-c 显示输出中,在每行行首加上本行在文件中出现的次数(count)。它可取代-u加-d。
-d 只显示重复行。
-u 只显示文件中不重复的各行。
-n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
-f n 与-n相同,这里n是字段数。
-s n 与+n相同,这里n是字符数。
四.实例详解
uniq.txt的原文如下: 
[root@umail39 tmp]#cat uniq.txt
this is a test 
this is a test
This is a test
i love you
i love you
we are good
this is a pen 
i do not know
this is a pen 
1.在每行前加上表示相应行目出现次数,但只会检查相邻重复的行。
[root@umail39 tmp]#uniq -c uniq.txt
      2 this is a test
      1 This is a tes 
      2 i love you
      1 we are good
      1 this is a pen
      1 i do not know
      1 this is a pen 
2.-f 1 忽略了第一列,检查重复从第二字段开始的,检查的时候,不区分大小写.
[root@umail39 tmp]#uniq -f 1 -c uniq.txt
      3 this is a tes 
      2 i love you
      1 we are good
      1 this is a pen
      1 i do not know 
      1 this is a pen
3.检查的时候,不考虑前4个字符
[root@umail39 tmp]#uniq -s 4 -c uniq.txt
      3 this is a tes 
      2 i love you
      1 we are good
      1 this is a pen
      1 i do not know
      1 this is a pe
4.去重复的项,然后全部显示出来
[root@umail39 tmp]#uniq  -u uniq.txt 
This is a test
we are good
this is a pen
i do not kno 
this is a pen
5.对每行第2个字符以后的内容不作检查
[root@umail39 tmp]#uniq -w 2 -c uniq.txt 
      2 this is a test
      1 This is a test
      2 i love you
      1 we are good
      1 this is a pen
      1 i do not know
      1 this is a pen

Bash及其特性

1.      命令历史

2.      管道重定向

3.      命令别名

4.      命令行编辑

5.      命令行展开

6.      文件名通配

7.      变量

8.      编程

命令行编辑:

  光标跳转:

           Ctrl+a,跳到命令行首

           Ctrl+e,跳到命令行尾

           Ctrl+u,删除光标至命令行首的内容

           Ctrl+k,删除光标到行尾的内容

           Ctrl+l,清屏

命令历史

      History

      -c,清空命令历史。

      -d,删除指定位置的命令

     -w,保存命令历史到文件中

命令历史的使用技巧:

       !n,执行命令历史中的第n行命令

        !-n,执行命令历史中的倒数第n个命令

        !!:执行上一条命令

        !字符串,执行命令历史中最近一个以指定字符串的命令

命令别名

      使用alias来定义别名,通过这个命令还可以查询系统的所有别名

      撤销别名使用unalias+命令别名就可以撤销别名

      注意:别名只在当前的shell环境下生效,要想永久生效需要写入shell的配置文件

命令替换

      把命令行中某个子命令替换成为其执行结果的过程

      要想实现一个文件的命名使用时间来命名,直接在命令行引用命令使用$(命令参数)或者使用`命令参数` 反引号

     

在shell中表示空白字符[[ :space:]]

            标点符号[[ :punct:]]

            小写字母[[ :lower: ]]

            大小写字母[[ :alpha: ]]

            数字[ [ :digit: ]]

            数字和大小写字母[[ :alnum: ]]

查看这些标准可以使用  # man 7 giob

Linux用户权限详解

加密方法

对称加密

公钥加密:每个密码都是成对出现的,一个私钥一个公钥

单项加密:散列加密,提取数据的特征码,常用于数据完整性校验

1.  雪崩效应

2.  定长输出

       MD5  128位定长输出

       SHA1  160位定长输出

/etc/default/useradd文件里面规定了新建用户的一些基本的属性

/etc/login.defs文件中规定了密码的期限,最短使用长度等,家目录的设定权限等等都在这个文件中配置。

id:查看用户的账户属性信息

   -u

   -g

   -G

   -n,显示用户名,而非ID号

Finger 用户名,查看用户的基本信息

修改账户属性:usermod

         -u,UID

         -g,GID

         -a  –G ,为用户在原有的组上添加附加组,如果没有-a的话新添加的附加组就会覆盖以前的附加组

         -c,附加信息

         -d,指定新的家目录,一起使用-m将以前家目录中的所有内容都移动到新的家目录中去

         -l,修改用户的用户名,改成新的名字

         -e,指定密码过期时间年、月,日

         -L,直接锁定用户账号

         -U,解锁账号

修改用户的shell:chsh,修改用户的默认shell,chsh  用户名

修改用户的finger信息:chfn  用户名 回车后依次填写

通过字符串的方式自动修改用户密码

给passwd命令输出一个密码使用。

为组设定密码:gpasswd

Bash的配置文件

全局配置文件

     /etc/profile,/etc/profile.d/*.sh,/etc/bashrc

个人配置文件

    ~/.bash_profile  ~/.bashrc

如果两个文件又冲突,以个人的配置文件为准

Profile类的文件:

设定环境变量

运行命令或脚本

Bashrc类的文件:

设定本地变量

定义命令别名

登陆式shell如何读取配置文件?

启动读取顺序/etc/profile-à/etc/profile.d-à~/.bash_profile-à~/.bashrcà/etc/bashrc

非登陆式shell

~/.bashrcà/etc/bashrcà/etc/profile.d/*.sh

Grep以及正则表达式

Gerp:根据模式搜索文本,并将符合的显示出来

Grep,egrp,fgrep

-i,忽略大小写

--colour,把选中的字符用高亮显示(如果想一直用,可以用别名使用)alias grep=‘grep --colour’

-v,没有被模式匹配的到的行

-o,只显示模式匹配到的字符串,与行就没关系了

正则表达式:REGEXP,默认情况工作在贪婪模式下,(尽可能长的匹配)

元子符:

       [ ] :匹配指定范围内的任意单个字符

       [ ^ ] :匹配指定范围外的任意单个字符

       . (点),表示任意单个字符。

       匹配次数:

       *:匹配其前面的字符任意次

       .*:任意长度的任意字符

       ?:匹配其前面字符1次或者0次

Grep本身的意义就是做部分匹配

        \{m,n\}:匹配其前面的字符至少m次,之多n次(\用来转义)

位置锚定:

^ :锚定行首,此字符后面的任意字符必须出现在行首

$ :锚定行尾,此字符前面的任意内容必须出现在行尾

^$ :空白行

如果像图中最后一行这样写,就会精确的匹配这一个单词,这个单词必须单独的出现才会匹配。

 

分组:

\(内容\),将内容分组,\(ab\)*这中表达式是将ab看做一个整体,这个整体出现任意次,这样*修饰的是这个整体

这样匹配的目的是为了为后面能够引用匹配的内容

在后面使用\1 :引用第一个左括号一级与之对用的右括号所包括的所有内容

          \2 :以此类推

          \3

直接引用前面的结果

上面的表达式的意思是字符串里有任意一个数字也可以使用[[ :digit:]]字符串的后面必须依然出现同样的数字

Grep使用-E参数的时候,使用拓展正则表达式。

        -A 数字:参数后面接数字,意识是除了显示匹配行以外将匹配行的后面几行也一同显示出来。

拓展正则表达式(egrep)

字符匹配:

.

[ ]

[ ^ ]

次数匹配:

*

?:不需要加转义符 \

+ :匹配其前面字符至少一次

{ m,n } :不再需要转义 表达的意义相同

位置锚定:

^

$

\<

\>

分组:

():分组

\1 \2 \3 引用分组

拓展的表达式还有或者的意义:

| :or

第一个例子没有使用分组,或的意思是:将竖线|两端的看成是两个整体来分别匹配。

第二个例子使用分组,分别的匹配大写C和小写c和后面的at组合,显示字符

使用egrep找出1到255之间的数字

  

Fgrep拓展正则表达式

1.  不支持正则表达式,速度最快因为他不想其他的两个耗费内存

2.  不支持元子符,速度快。

Sed流编辑器

基本用法:

1.      行编辑器(全屏编辑器:vi)

2.      处理机制,将文本中符合条件的行读进模式空间,然后进行编辑后输出到屏幕上,默认情况下不编辑源文件,仅对读入模式空间的副本进行编辑。

3.      使用格式:sed  optiona  ‘addresscommand(要操作的行和命令)’  file ……

4.       –n :静默模式,不在默认显示模式空间中的内容

5.       –i:直接修改源文件(谨慎使用)

6.       –eSCRIPT –e SCRIPT –e …..:可以同时执行多个操作,每一个-e后面都跟上要执行的脚本(sed的执行内容)

7.       –f  /PATH/TO/SED_SCRIPT :可以将每个要执行的sed脚本写入这个文件中,然后使用-f选项会逐个的对指定的文件执行这个脚本文件中的sed 命令

8.       –r :表示使用拓展的正则表达式

9.       查找空白然后替换成无

10.  Address :1 指定startline,endline 开始行到结束行

          2使用/^root/以root开头的行,使用模式匹配

          3   /模式1/,/模式2/ 第一次被模式1匹配到的行至第一次被模式2匹配到的行结束,中间所有。

11.  Linenumber 指定行号

12.  $ 最后一行 $-1 倒数第二行

Command:

          d:删除符合条件的行。

         

 p(小写):显示符合条件的行。

 选项 a \string: 在指定的行后面追加新行,内容为string

换行符 \n 加入了换行符同时加入和两行,以此方法可以加多行

 选项 i   \string : 在指定的行前面添加行

 选项 r file:将指定的文件内容添加至符合条件的行,这个命令可以合并文件,最好的是可以在中间插入其他文件的内容

下面的这个例子由于指定了第一行和第二行所以sed命令在第一行和第二行的后面都添加了新文件的内容。

选项w file:将制定范围内的内容另存至指定的文件中:

下例中将匹配到的 /oot/ 的内容存到了oot.txt中

选项 s/模式/string/ :查找并替换,默认只替换每一行中第一次被匹配到的字符串。

如果我们想改变这个默认需要加修饰符:  g:全局替换。 i:忽略字符大小写

&符号,在后面的string字符串汇总引用前面模式匹配的整个串

但是在只引用前面模式匹配中的一部分而不是整个串的时候不能使用&符号,必须使用后向引用

练习题:

字符串测试及for循环

Declare命令 (声明变量类型)

peset选项
-r 只读
      1 declare -r var1
    (declare -r var1与readonly var1是完全一样的)
    这和C语言中的const关键字一样, 都用来指定变量为只读. 如果你尝试修改一个只读变量的值, 那么会产生错误信息. 
-i 整型
      1 declare -i number
      2 # 脚本将会把变量"number"按照整型进行处理. 
      3 
      4 number=3
      5 echo "Number = $number"    # Number = 3
      6 
      7 number=three
      8 echo "Number = $number"    # Number = 0
      9 # 脚本尝试把字符串"three"作为整数来求值(译者注: 当然会失败, 所以出现值为0). 
    如果把一个变量指定为整型的话, 那么即使没有expr或者let命令, 也允许使用特定的算术运算.
      1 n=6/3
      2 echo "n = $n"       #n = 6/3
      3 
      4 declare -i n
      5 n=6/3
      6 echo "n = $n"       #n = 2
-a 数组
      1 declare -a indices
    变量indices将被视为数组.
-f 函数
      1 declare -f
    如果在脚本中使用declare -f, 而不加任何参数的话, 那么将会列出这个脚本之前定义的所有函数.
      1 declare -f function_name
    如果在脚本中使用declare -f function_name这种形式的话, 将只会列出这个函数的名字. 
-x export
      1 declare -x var3
    这句将会声明一个变量, 并作为这个脚本的环境变量被导出. 
-x var=$value
      1 declare -x var3=373
    declare命令允许在声明变量类型的同时给变量赋值.

批量添加用户脚本

 让用户自己指定的用户名来添加:

使用逗号隔开用户名,使用sed来去掉逗号读取参数。

如何分别计算100以内的奇数和偶数的和

让一个变量加上一个数值后再保存回自身:sum+=$I  let I+=1  let I++

以此类推: -=(减等) *=(乘等) /=(除等) %/(取模等)

将一个变量的数加上减去乘以除以一个数将这个结果仍然付给这个变量

VIM编辑器

全屏编辑器,模式化编辑器。更多的使用vim因为在脚本的编辑过程中语法都是有颜色的标注,这样能够让我们避免错误。

打开文件快速定位光标技巧:

打开文件:vim  filename(文件名)

打开文件后直接让光标出现在哪一行:例如我们想让光标在第12行,vim  +12  filename

打开后直接处在文件的尾部: vim  +  filename

打开文件定位至第一次被PATTERN匹配到的行的行首:vim  +/PATTERN  filename

关闭文件

末行模式关闭文件:

:q退出文件

:wq保存退出

:q!不保存退出

:w!强行保存

:x保存退出

编辑模式下关闭文件:

连敲两次大写的ZZ (保存退出)

移动光标

H向左j向下k向上l向右(这样避免了移动手去按方向键)

数字加上移动键:#h,向左移动#个字符。

按照单词为单位进行移动:

w(小写) 移至下一个单词的词首

e(小写) 跳至当前单词或者下个单词的词尾

b(小写) 跳至当前单词或前一个单词的词首,与e相反。

上面的命令都可以结合数字组合使用:#b 跳至第#个单词的词首

行内跳转:

0(零):调到绝对行首

^ :调到行首的第一个非空字符

$: 调到绝对行尾

行间跳转:

#G(大写):直接跳转到数字 # 行上

G(大写) :最后一行

末行模式下直接写出行号也可以

翻屏操作

Ctrl + f 向下翻一屏

Ctrl+b 向上翻一屏

Ctrl+d 向下翻半屏

Ctrl+u 向上翻半屏

删除命令

X :删除光标所在处的单个字符

#x :删除光标所在处向后的#个字符

d命令:

要和跳转命令组合使用:

#d 跳转符:删除跳转命令的#个,dw 按照字符删除,

#dd :删除包括当前光标所在行在内的#行

末行模式下:地址1,地址2d 删除地址1到地址2的所有行

+# :向下的#行

粘贴命令:

P(大写) :如果删除或复制的为整行内容则粘贴到光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面

P(小写) :如果删除或复制的为整行内容则粘贴到光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面

复制命令

yy(小写)用法同d命令,可以结合跳行符号来使用更方便。

先删除内容再转换成输入模式(替换,修改)

C(小写) :用法同d命令,结合跳行符号来使用。

替换:

R :替换光标处单个字符

撤销编辑

u(小写) 撤销前一次的操作,但是内存中只保存最近的50行操作所以只能恢复最近修改的50次操作

Ctrl+r 取消最近的一次撤销操作。

重复前一次的编辑操作

.  (点)

可视化模式

进入模式使用v 或者V ,键入命令后移动光标会选中移动过的内容,被选中的内容可以直接进行其他的操作。

V(小写) 按照字符选取

V(大写)按照矩形块选取,整行的

查找

/PATTERN

?PATTERN

  使用n和N来逐个跳转查找到的字符

查找并替换

在末行模式下使用s命令

1,$

% 都可以表示全文

如何打开多个编辑文件

Vim  file1file2 file3 。。。。

本来的再一个文件复制后就可以粘贴到另外一个其他的文件内

切换文件:在末行模式下输入netxt 切换至下一个文件,prev切换至最后一个文件

Last会切换至最后一个文件,first切换到第一个文件

退出文件:

末行模式下:qa退出全部文件

分屏显示一个文件

Ctrl + w 在按 s 就会将一个文件水平拆分窗口

Ctrl + w 在按 v 就会垂直的拆分窗口

在窗口之间切换光标使用 ctrl + w

分窗口打开多个文件

Vim  -ofile1 file2

Vim  -O  file1 file2

切换方式同上

将当前文件的部分内容另存为另外一个文件

末行模式:w

:ADDR1,ADDR2w /path/to/somewhere

将另外一个文件的内容附加在当前的文件中

:r

:r /path/to/somewhere

跟shell交互

:!Command

高级话题

1.      显示行号或取消行号

2.      :set  nu   :set  nonu

3.      忽略或区分字符大小写

4.      :set  ic :set noic

5.      设定自动缩进

6.      :Set autoindent  :set ai   :set  noai

7.      查找到的文本高亮显示或取消高亮

8.      :set hlsearch  :set  nohlsearch

9.      语法高亮

10.  :Syntax on  关闭:syntax  off

Vim的配置文件

全局配置文件 /etc/vimrc 个人的配置文件在家目录下.vimrc

修改配置文件会立即生效例如:添加set nu 在配置文件中就会永久的显示行号

Vim模式

编辑模式(命令模式)

编辑模式——〉输入模式:

     i(小写):在当前光标的前面输入

     a(小写):在当前光标所在的字符后面输入

     o(小写):在当前光标所在行的下方,新建一行输入

大写:

     I:在当前光标坐在行的行首输入

     A:当前光标所在行的行尾输入

     O:当前光标所在行的的上放新建一行输入

输入——〉编辑:

   使用esc键直接退出。

进入末行模式只需要键入冒号 : 就可以

Linux文件查找详解

文件查找命令

 locate:

    非实时的,模糊匹配,查找是根据全系统文件数据库进行的

 find:

     实时,精确,支持众多标准

 find  查找路径 查找目标 查找到后的处理动作

查找路径:默认为当前目录

查找目标:默认指定路径下的所有文件

处理动作:默认为显示

 

匹配标准:

      -name ‘filename’对文件名精确查找

            文件名通配:* ?

      -iname ‘filename’文件名匹配不区分大小写

-regex PATTERN 基于正则表达式的文件名查找

-user  USERNAME 基于属主的文件查找

-group GROUP 基于属组

-uid       基于uid 用户ID

-gid     基于gid 组ID

-nouser  查找目录下没有属主的文件,应该经常执行删除没有属主的文件

-nogroup  没有数组的

-type  根据文件类型来查找

     F:普通文件

     D:目录

     B:块设备

     S:套接字文件

     L:链接文件

-size  文件大小查找

    数字+单位

    [ +|- ] 加号和减号代表大于和小于

      +|- #K

      #M

      #G

完成组合条件来查找:(如果不指定就默认是和,于的关系)

  -a 和,与

  -o 或

 -not 非

根据时间来查找被修改或者访问的文件:

修改时间 -mtime

改变时间  –ctime

访问时间  -atime

后面都可以跟上数字表示多少天之前可以使用[+|- ] 减号表示过去几天内访问过的文件在这个数字的范围内任何一个时间访问都可以,加号表示离现在位置最近几天访问过会给出数字以前所有访问过的文件,如果没有加减号就表示正好在数字这天访问的,(必须是正好那一天)。

分钟 –mmin (与上面对应)

     -amin

     -cmin

find –perm 权限(644) 精确匹配权限644的文件

find –perm  /权限       只要有一位匹配就可以

find –perm  -mode(权限) 每一位都必须和指定的权限匹配才可以,或者文件的权限完全的包含权限,例如:指定mode为644,文件的权限为755,则文件会被打印出来。

在find结果后引用并且执行其他命令:

-print:显示

-ls:类似ls –l的形式显示每一个匹配到的文件

-ok  COMMAND {} \;  对匹配的文件执行COMMAND命令(固定格式不能少),每一次的操作都需要用户确认,

-exec  COMMAND {} \;  (固定格式)与OK不同的是这个命令不需要确认,{}花括号的意思是引用前面find匹配的结果

可以连续的使用花括号{}来引用前面的结果:

提示:find命令很强大,功能很多要熟悉使用并且注意将选项结合起来使用。

Xargs命令

效果和find命令中的ok和exec很相似,在命令后面引用前面命令的结果来继续对其进行操作。

需要使用管道将结果送给xargs

特殊权限

SUID:运行某个程序时,相应进程的属主是程序文件自身的属主,而不是启动者的

添加SUID:

chmod u+s  file(命令文件)

如果file本身原来就有执行权限,则SUID显示为小写s,否则显示为大写的S

添加SUID是十分危险的,因为等同于赋予了普通用户的root权限去执行命令。

SGID: 运行某个程序时,相应进程的属组是程序文件自身的属组,而不是启动者的属组

设置,去除SGID:

Chmod g+s  file

Chmod g-s  file

Sticky:在一个公共目录每个人都可以创建文件,删除自己的文件但是不能删除别人的文件

Chmod o+t  DIR 通常使用在目录上

Chmod o-t  DIR

查看用户命令

who –H 打印出第一行的说明报头

-r 显示用户的运行级别

w 命令:显示登陆的用户,并且显示用户正在干什么

last命令:显示所有曾经登陆的用户登陆的时间登陆进来后停留了多少时间,实际上打开了/var/log/wtmp文件,用户的登陆历史及系统重启历史

last –n #数字显示最近几次登陆的用户

lastb命令:打开/var/log/btmp文件,显示曾经没有登录成功的用户

     Lastb  -n # 最后几个

lastlog:每一个用户最近一次的成功登陆信息

      -u USERNAME 显示特定用户最近的登陆信息

basename:直接取出文件的文件名,无论前面有多少路径直接取出最后的文件名

       $0 直接取出命令的本身,在脚本中可以取出脚本名,作错误提示作用

mail:邮件命令。

     执行mail命令就打开自己的邮箱

     Mail –s写标题 

  su

随机数命令:

随机数生成器,都是在商池中取数,如果商池空了random就会停下来,而urandom就会继续生成其他的来使用

/dev/random  0-32768 

 /dev/urandm

随机生成了10个数字,比较出其中的最大数和最小数:

 

通过设定变量debug并且在脚本中时刻调整debug的变量,来实现打印详细信息或者其他的附加的功能:(使用case语句的多分支结构结合for循环)

 

#!/bin/bash

#

DEBUG=0

ADD=0

DEL=0

 

for I in `seq 0 $#`;do

if [ $# -gt 0 ]; then

case $1 in

-v|--verbose)

  DEBUG=1

  shift ;;

-h|--help)

  echo "Usage: `basename $0` --addUSER_LIST --del USER_LIST -v|--verbose -h|--help"

  exit 0

  ;;

--add)

  ADD=1

  ADDUSERS=$2

  shift 2

  ;;

--del)

  DEL=1

  DELUSERS=$2

  shift 2

  ;;

*)

  echo "Usage: `basename $0` --addUSER_LIST --del USER_LIST -v|--verbose -h|--help"

  exit 7

  ;;

esac

fi

done

 

if [ $ADD -eq 1 ];then

  for USER in `echo $ADDUSERS | sed 's@,@ @g'`;do

    if id $USER &> /dev/null; then

      [ $DEBUG -eq 1 ] && echo"$USER exists."

    else

      useradd $USER

      [ $DEBUG -eq 1 ] && echo"Add user $USER finished."

    fi

  done

fi

 

if [ $DEL -eq 1 ];then

  for USER in `echo $DELUSERS | sed 's@,@ @g'`;do

    if id $USER &> /dev/null; then

      userdel -r $USER

      [ $DEBUG -eq 1 ] && echo"Delete $USER finished."

    else

      [ $DEBUG -eq 1 ] && echo"$USER not exist."

    fi

  done

fi

终端类型:

Console:控制台,直接连到主机上的显示器和键盘。它不是终端,只是连接

Pty:物理终端(附加在VGA卡,简单讲显卡)

Tty:虚拟终端,(附加在VGA卡,简单讲显卡)附加在硬件上的

Ttys#:串行终端

Pts/#(数字):伪终端,伪文件系统

磁盘管理:

U盘、光盘、软盘、硬件、磁带

硬盘的MBR 独立于系统之外的硬盘系统,与电脑的系统无关:

  

du  –s:查看目录中每一个文件占用空间的大小

df  命令 :报告磁盘空间使用情况

     -P  -i不换行显示输出

   -i输出ionde 节点的使用情况

 

B:块设备,按照块为单位,随机访问的设备

C:字符设备为,线性设备

 

Linux至此众多的文件系统,但是众多的文件系统有好多的不同之处,linux通过自身的VFS文件系统来统一的调用众多的文件系统,让他们统一的为linux工作。

一个分区就是一个单独的文件系统。

物理磁盘上都是以物理块为单位组织组织起来的,每一个块的大小(2kb,4kb,8kb)都是有逻辑规定的,记录这块硬盘上有多少个物理块,用I节点来记录,但是这么多的i节点会占用很多的磁盘空间,而且想要找一个空闲的物理块来存储数据的话会很费劲因为要遍历整个磁盘来找那个空闲i节点,所以物理块并不是单个的存在的而是由一个一个的组来组成的每一个组有多少个物理块也是有逻辑规定的,这样每一个组对应一个i节点这样就节省了空间但是会有很多的这种组,记录这些组的情况和总数的块叫做超级块(super block),如果磁盘的超级块坏了,那么这个磁盘就整个坏掉了,因为磁盘无法得知到底有多少个组,所以超级快是可以备份多个的。

 

超级块包括:空闲的块组,已用的块组,块组的总数,一块硬盘中,在块组中会保存好几个备份。

boot block)磁盘启动块,一般在多系统共存的情况下使用它。

GDT:块组描述符表,每一个块的边界,组的边界,一个块组从哪个块还是到哪个快结束。

Inode table : i节点表

Inode bitmapi节点位图

Block bitmap:块位图

想要找到/var/log/message文件经历了怎么样的过程:

首先知道根目录是自检的,首先找到根目录对应的inode号,找到根对应的磁盘块,这个磁盘块上记录着var目录对应的inode号,然后检索inode表找到var对应的磁盘块,找到log对应的inode号,检索inode表并且找到磁盘块,这个磁盘块上记录着messsge对应的inode号,再次检索inode表找到message对应的磁盘块,从中读取数据,显示到终端

Linux下的目录是记录目录下,文件和目录对应inode号的关系的一个表格文件,这样才会从inode表中找到这个文件和磁盘块的对应关系。

Exit3 叫做日志文件系统

有了它以后磁盘分出了三个区域:源数据区,数据区和日志区域

文件写入的时候会先写入到日志区域没问题再拿出来放到源数据区域,然后存储到数据区域,这样如果在写的过程中突然非法关机了,只需要检索日志区域就能知道那个文件是在非法关机的时候损坏的,直接删除就可以开机了

非日志文件系统只有ext2

刚刚分区的磁盘分区,内核是不知道的,在红帽6中使用命令通知内核

格式化的过程中,默认将每个物理块格式化成4096大小,4kb

Mke2fs  -b 可以指定格式化后的物理块大小

        -L 可以指定卷标,挂载的时候可以直接引用

blkid  /dev/sd# 查看分区的UUID,唯一的ID

调整文件系统的相关属性:

tune2fs –j/dev/sd# 无损的修改分区的属性,可以直接将ext2改成ext3而不损坏其中的文件,可以升级但是不能降级

       -L 名称 /dev/sd# 给分区修改或加上卷标

      -m调整预留百分比,默认是5%,可以通过该命令修改

       -o设定默认挂载的选项,比如acl

       -c # 指定挂在次数达到#次后执行自检

       -l /dev/sd#显示分区的超级块(super block)中的内容,磁盘的所有详细内容都有。

dumpe2fs:显示文件属性信息,会显示空闲块

       -h只显示超级块中的信息

fsck 检查并修复linux文件系统

     -t 文件系统类型,可以不加它会自动检测文件系统类型。

     -a 自动修复,加上选项后不会询问你,自动修复

Swap交换分区

创建分区是选择82 swap交换分区,然后使用命令来将他加入交换分区,swapon /dev/sda#

Swapoff /dev/sda# 启用和卸载这个分区

回环设备

Loopback 使用软件来模拟实现硬件

创建一个镜像文件

使用dd命令来创建这个模拟的分区:

    If=指定数据的来源

     Of=指定数据的存储目标

     Bs=指定复制多少个字节

     Count=指定复制多少个bs

     例如:dd  if=/dev/sda of=/mnt/usb/mbr.backup bs=512count=1 这里复制了一个512字节的内容到了mbr.Backup 里面

   Ddif=/dev/zero of=/var/swapfile bs=1M count=1024 这样就是创建了一个指定的模拟磁盘块,它可以挂载使用

压缩,解压缩命令,归档工具:

压缩格式:gz bz2 xz zip z

压缩算法:算法不同,压缩比也会不同。

gzip: gzip /PATH/ TO/filename 压缩完成后会删除原文件

        -d 解压缩文件

        -# : 1-9 指定压缩比,默认是6

gunzip: gunzip filename.gz 解压缩文件,解压后删除源文件

zcat :查看压缩的文件,本身并不解压缩文件。这是临时查看。

 

bzip2 :

     比gzip有着更大的压缩比的压缩工具,但是只是针对大文件,小文件优势不明显

     bzip2/PATH/TO/filename  直接压缩文件 删除原文件

        -d 解压文件

-k 使用这个选项压缩后保留原文件

        -# 1-9 指定压缩比

bunzip2 : 解压缩文件

bzcat 查看bzip2 的压缩文件

Zip:这个压缩工具可以压缩目录这个是上面这些问价所不具备的功能

Zip filename.zip file1  file2 file3 …….

多个文件压缩成一个,或者一个目录压缩成一个(归档功能)

tar:归档工具,只归档不压缩。

-c 创建归档文件

-f  filename.tar 操作后的归档文件名

-x finename.tar 展开归档,展开后原归档文件不删除。

--xattrs : 归档时,保留原文件的拓展属性信息

-t : 不展开归档,直接查看了归档了那些文件

直接调用压缩工具来实现归档并压缩:

-zcf : 归档并调用gzip压缩

-zxf : 调用gzip解压缩并展开归档

-jcf : 调用bzip2 压缩

-jxf : 调用bzip2 解压缩

cpio : 归档工具

     使用命令压缩find . | cpio –H newc –o | gzip -9 > /mnt/boot/initrd.gz

     使用命令解压缩 Zcat  /boot/initrd | cpio –id 解压到当前目录下

read命令:

          -p:打印文字之后读取要输入的变量

          -t : 设定超时时间

RAID及mdadm命令之

级别:

0代表条带

  性能提升:读,写

  冗余能力:无

1代表镜像

  性能表现:写性能下降,读能力提升

  冗余能力:有

  空间利用率:50%

5轮流的作为校验盘,只能坏一块盘

  性能表现:读,写提升

  荣誉能力:有

  空间利用率:(n-1)/n

6两种校验方式,允许坏两块盘

10先镜像后条带

   性能表现:读,写提升

   冗余能力:有

   空间利用率:50%

jibod 将多个小盘组合成一个大盘,系统认为是一个盘,但如果坏盘是无法修复的,只是简单的组合

软件raid:

       系统会首先模拟一个虚拟的设备,在/dev/md0用md命名

       内核中的md模块,通过他来访问组合的硬盘就会显示成raid,由于是集成在CPU中的一个功能,所以raid模块的能力取决于CPU 的能力,要把硬盘创建成 fd 格式的磁盘才可以别md的模块扫描到,

mdadm : 将任何块设备做成raid

模式化的命令:

创建模式

   -C

      专用选项:

              -l:指定级别

              -n#:设备个数

              -a:自动为其创建设备文件  使用的时候要跟上yes回答为确定自动

              -c:指定数据块大小

              -x#:指定空闲热备盘的个数,如果有坏掉的磁盘热备空闲盘会自动的替换它,让raid保持功能。

             -E 指定条带的大小

创建完成后 cat/proc/mdstat 下面记载着raid的文件信息,创建完成后直接格式化后挂载使用就好。

管理模式

    --add  –del --fail

   mdadm /dev/md1  --fail /dev/sda7 将sda7模拟成损坏的

   mdadm /dev/md1  --remove /dev/sda7 删除掉已经坏掉的磁盘

   mdadm /dev/md1  --add  /dev/sda8 将好的硬盘加入进去并同步恢复raid

监控模式

     -F

增长模式

    -G

装配模式

    -A

查看raid阵列的详细信息:

   mdadm–D /dev/md# 查看具体的详细信息

停用阵列:

   mdadm  -s /dev/md#

每次开机自动装配需要生成配置文件:

   mdadm  -D –scan > /etc/mdadm.conf

监控命令: watch

周期性的执行指定命令,并以全屏方式显示结果

         -n#:指定周期长度,默认为秒钟,默认为2秒

命令格式: watch  –n #  ‘command(命令)’

LVM逻辑卷

pv

   pvcreate  pvremove pvscan加载新规划的PV pvdisplay  pvmove移动一个盘上的数据当需要去掉这个盘的时候先把数据移除然后再去除

vg 

   vgcreate创建  vgremove删除VG  vgextend增加Pv  vgreduce去除PV  vgs vgdisplay  vgscan

   vgcreateVG name /path/to/pv

         -s # :指定PE大小默认是4M

LV

  lvcreate  lvremove 

  lvcreate  -n LV_NAME -L #G指定大小VG_NAME(在哪个VG上创建)

一、扩展逻辑卷

lvextend  -L [+]#  /PATH/TO/LV

2G +3G

5G

完成上面的命令后需要使用 resize2fs 命令来拓展逻辑边界

       resize2fs  -p /PATH/TO/LV 命令会自动的推展到你添加的大小

二、缩小逻辑卷

注意:1、不能在线缩减,必须先卸载

      2、确保缩减后的空间大小依然能存储原有的数据

      3、在缩减之前应该先强行检查文件,确保文件的一直状态

resize2fs

    e2fsck  –f /dev/LV 强制进行检查

resize2fs  /PATH/TO/PV 3G 缩减到3G 大小

lvreduce  -L [-] # /PATH/TO/LV缩减LV

缩减后重新挂载就可以

三、快照卷

1生命周期为整个数据时长,在这段时间内数据的增长量不能超过快照卷的大小

2快照应该是只读的

3和原卷在同一个卷组中

Lvcreate

       -s

       -p  r|w

Lvcreate  -L # 指定快照的大小 –nSLV_NAME  –p r /PATH/TO/LV

编写让用户自己选择为硬盘创建分区,并同时格式化的脚本

#!/bin/bash

#

#

echo “Initial a disk….”

echo –e ‘’\033[31mWarning:\033[0m“

fdisk –l 2>/dev/null | grep –o “disk/dev/[sh]d[a-z]”

 

read –p “Your choice :” PARTDISK

if [ $PARTDISK == ‘quit’ ] ; then

  Echo“quit”

 Exit 7

fi

 

until fdisk –l 2>/dev/null | grep –o“^Disk /dev/[sh]d[a-z]” | grep “^Disk $PARTDISK” &>/dev/null

   read–p “Wrong option Your choice aging:” PARTDISK

done

 

read –p “Will destroy all data,continue:”CHOICE

 

until [ $CHOICE == ‘y’ –o $CHIOCE == ‘n’ ]; do

   read–p “will destroy all data continue:” CHOICE

done

 

if [ $CHOICE == ‘n’ ] ; then

   echo“quit”

   exit9

else

dd if=/dev/zero of=$PARTDISK bs=512 count=1&> /dev/null

sync

sleep 3

echo ’n

p

1

 

+20M

n

p

2

 

+512M

w’ | fdisk $PARTDISK & > /dev/null

sync (从内存中同步到硬盘里)

partprobe $PARTDISK

sleep 2

partprobe $PARTDISK

fi

编译安装软件:

进程管理

进程号:在/proc下这个目录其实没有文件,这个目录下的所有文件都是映射内核中的内容,很多内容有可能只是内核中的一个参数,只是映射到了这个目录下便于查看。

查看进程的PID:

进程分为两类:和终端相关的进程和无关的进程

进程状态:

         D 不可中断的睡眠

         R 运行就绪

         S 可中断的睡眠

         T 停止

         Z 僵尸进程

 

         < 高优先级进程

         N 低优先级进程

         + 前台进程组中的进程

        l 多线程进程

         s

进程的发起者  

平均的CPU占比

MEN 实际的物理内存占比

 VSZ 虚拟内存集

RSS常驻内存集(表示这个进程必须占用这些内存而且任何进程都不能侵入或占用这些内存)

TTY 终端类型

STAT 状态

START 运行的时间

TIME 真正在CPU上运行的时间

COMMAND 那个命令启动的进程,如果加了中括号表示这个进程是内核的线程

ps  进程状态 bsd风格的命令

   a显示所有和终端有关的进程

   u 显示进程的发起者

   x显示所有和终端无关的进程

ps –elF 和aux近似,但又优先级

pstree 显示进程树

pgrep 通过进程的名称,直接查找进程的PID

pidof 通过进程的名字来查找进程的所有PID

top 排序 M内存T累计时间 P使用CPU占比

    k 终止某个进程

当前的时间

系统运行的时间

Users 当前有多少个用户

Load average 平均负载 1分钟 5分钟 15分钟的平均值,值越小负载越低

Tasks 所有进程信息 running 处于运行的  sleeping 处于睡眠的 stopped停止的 zombie 僵死的

Cpu 负载情况 us 用户空间所占 ni nice值 id空闲的百分比 wa等待IO完成所占用的时间 si 软中断占用的时间 st 别偷走的时间(虚拟化)

Mem 内存

Swap 交换空间

 

vmstat

free

kill

pkill

bg

fg

进程间通信

共享内存

信号:s1gmal

旗语

重要信号

1  SIGHUP让一个进程不用重启,重读配置文件

2  SIGINT终止 ctrl + c

9 SIGKILL 杀死一个进程

15  SIGTREM终止一个进程

指定一个信号:

信号号码: kill -1

信号名称: kill –SIGKILL

信号名称的简写: kill –KILL

renice PID 调整进程优先级

 

Vmstat 1 5 显示系统的状态 后面1代表每1秒刷新一次,但是只显示五次,后面的数字可以省略

Uptime 显示时间,登陆用户等,和top的第一行一样

Cat /proc/meminfo 查看内存的信息

系统启动流程:

Post加电——》BIOS自检,按照顺序启动——》MBR(bootloader,446字节)此时BIOS退出bootloader来接管启动内核的任务——》gurb启动弹出选择内核菜单,将选好的内核加载进内存——》kernel解压缩启动,开始探测硬件并装载,——》initrd——》启动init进程所有的用户空间的父进程——》执行rc.sysinit脚本

Initrramfs 是内核和硬盘交互前,替代根去加载模块系统并且读取磁盘的内容的虚拟根,读取完磁盘后真正的根会替换掉这个虚拟根,真正的根开始运行,虚拟根读取的数据会直接放进真正的根中,包括三个目录/proc/sys /dev 分别是内核映射 虚拟系统 虚拟根读取的磁盘信息,直接搬过来到真正的根来使用

内核的设计风格:

        单内核 linux 对线程的支持不是很好(LWP)

                采用模块化的风格:

                                核心:ko(kernelobiect)

                                内核:/lib/modules/内核版本号命名的目录/

        微内核 windows solaris 支持线程

        

内核功能:

        文件系统

        进程管理

        内存管理

        网络管理

        安全功能

        驱动程序

ldd命令

       显示运行的程序或级别依赖于哪些库

      

Chroot命令:切换根目录

     切换的目录首先需要运行的shell,还需要这个shell所依赖的库文件。

启动服务的运行级别:

0:halt

1:直接以管理员身份切入

2:有网络的单用户模式

3:命令行模式

4:保留模式,未使用

5:图形界面模式

6:reboot

 

[root@localhost grub]# cat grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grubafter making changes to this file

# NOTICE: You have a /boot partition.  Thismeans that

#         all kernel and initrd paths are relative to /boot/, eg.

#         root (hd0,0)

#         kernel /vmlinuz-version ro root=/dev/mapper/JX-root

#         initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0 ##设置默认启动的title编号

timeout=5 ##等待用户选择title的超时时间,单位是秒钟

splashimage=(hd0,0)/grub/splash.xpm.gz  ##指定grub背景图片的

hiddenmenu ##隐藏菜单

title CentOS (2.6.32-504.1.3.el6.x86_64)   ##每一个tltle都代表一个操作系统,后面的字符串就是提示你要启动的内核的标题,纯字符串可以自由修改。

         root(hd0,0)  ##内核文件所在的设备,对于grub而言所有类型硬盘都识别成hd#,N #号表示第几个设备,最后的(N)0表示对应磁盘的分区。

         kernel/vmlinuz-2.6.32-504.1.3.el6.x86_64 ro root=/dev/mapper/JX-root rd_NO_LUKSLANG=zh_CN.UTF-8 rd_NO_MD rd_LVM_LV=JX/root crashkernel=autord_LVM_LV=JX/swap  KEYBOARDTYPE=pcKEYTABLE=us rd_NO_DM rhgb quiet   ## 内核文件路径及传递给内核         的参数 /proc/cmdline 下记录这内核文件路径

         initrd/initramfs-2.6.32-504.1.3.el6.x86_64.img ##ramdisk 启动过程中虚拟根的路径

 

linux上自带的一个制作图片的工具,但是这个工具需要使用yum安装而且需要在图形界面下运行:    gimp工具

修复grub

方式一:

如果磁盘的MBR中的bootloder被破坏了,在命令行中直接键入grub进入grub模式:

Grub> root(hd0,0)

也许这个启动的磁盘不是这个,每个系统不同,如果不是这个尝试其他的直到找到位置。

Grub> setup (hd1) 这里只需要指定硬盘就可以,自动修复grub

方式二:

直接指定grub的目录进行生成:

grub-install  --root-directory=/指定boot的父目录,一般是根

这样会在一个指定的目录下生成一个gurb文件,自己手动的编写一个grub.conf配置文件,就可以使用这个目录所在的硬盘单独启动一个虚拟机。

如果误删了grub配置文件,如何修复并启动:

开机后会直接进入gurb的修复提示符,想要启动现在的这个主机需要知道主机的内核文件在什么位置,这时使用root (hd0,0)去探测,不实用,使用find (hd0,0)/  find(hd1,0)/ 来探测那个磁盘上有内核文件,如果有会返回内核文件的信息。

具体步骤:

Grub> find (hd#,0)  首先发现内核文件在哪个硬盘上

Grub> root (hd#,0)  指定硬盘

    Kernel /PATH/TO/KERNEL_FILE  指定启动内核的具体路径,可以使用tab键补全

    Initrd /PATH/TO/INITRD_FILE    指定initrd的文件路径

     Boot    执行命令自动在目录下寻找配置文件,启动。

登陆至系统后手动编写一个grub.conf或者将备份恢复一下就可以

Kernel初始化过程

1 设备探测

2 驱动初始化(可能从initrd(initcamfs红帽6)文件中装载驱动模块)

3 以只读方式挂载根  (这里如果挂载成读写的会导致系统崩溃,这一步骤只需要读取文件即可后面的init进程会重新将根挂载成读写的)

4 装载第一个进程 init (PID为1)

/sbin/init: (/etc/inittab)

   Inittab是串行启动的模式,一个个的启动这样很慢

   红帽六以后使用upstartubuntu团队开发的可以并行的启动多个进程

   Systemd:更为强大的一个并行启动方式,一次性启动多个进程同时开启

/etc/init目录下是init.d的分片

系统初始化脚本:/etc/rc.d/rc.sysinit

1 激活udev和selinux 前200行

2 根据/etc/sysctl.conf 文件来设定内核参数

3 设定时间时钟

4 装载键盘映射

5 启用交换分区

6 设置主机名

7 根文件系统检测,并以读写方式重新挂载

8 激活RAID和LVM设备

9 启用磁盘配额 quota

10 清理过期的锁和PID文件

11 检查并挂载/etc/fstab文件中的其他文件系统

 

/etc/rc.d/rc.# 都是各个运行级别的脚本文件,先执行关闭K开头的脚本,然后执行开启S开头的脚本。

 

Linux内核编译及系统裁减之一

单内核模式:都采用了模块化的设计,需要的时候加载进入内核使用。

装载模块:

       Insmod

       Modprobe

www.kernel

 

用户空间访问,监控内核的方式:

    /proc  /sys

/proc/sys : 此目录中的文件很多是可读写的,都事内核映射的参数通过修改这些文件可以实现对内核的操作,但是操作只能使用echo > 重定向,不能用VIM

/sys/ 某些文件可写

 

设定内核参数值得方法:

echo VALUE >/proc/sys/TO/SOMEFILE

sysctl –wkernel.hostname=  修改主机名

        参数名.(点)要修改的参数=

能够立即生效无法永久有效,因为内核被加载在了内存中

永久有效的方法: 将更改写进/etc/sysctl.conf文件

修改文件之后执行如下命令:

       Sysctl –p 立即生效

       Sysctl –a 显示所有的内核参数

查看模块:

        Lsmod : 模块名称 大小 被调用的次数

管理命令:

       Modprobe MOD_NAME  装载模块

       Modprobe –r  MOD_NAME 只需要指定模块名就可以卸载

       Modinfo MOD_NAME 查看模块的具体信息

       Insmod /PATH/TO/路径

       Rmmod MOD_NAME 删除模块

       Depmode /PATH/TO/MODILES_DIR 指定目录生成依赖关系

内核中的功能除了核心功能之外,在编译时,大多数都有三种选择:

1 不使用此功能

2 编译成内核模块

3 编译进内核(不再需要使用insmod命令加载他)

 

如何手动编译内核

make gconfig  gnome 桌面环境

make kconfig  KDE桌面环境 都需要安装开发库才可以

make menuconfig 在命令行界面下,会打开一个文本的编辑框

在这个界面下,前面带*表示做进内核,显示M做成模块

使用空格键决定是否启用这个模块

make

make modules_install

make install

二次编译时清理:如果又需要要备份.config文件

make clean

make mrproper

安装工具 yum install screen ,远程后台执行工具

安装后直接执行 screen 就能打开连接窗口

Ctrl + a 之后 d键关闭窗口,关闭后命令依然在执行不会断开

可以使用screen –ls命令来查看关闭的窗口

如果想还原窗口直接使用 screen  -r 号码  来还原这个窗口即可,直接还原到原始的状态。

编译内核:

在执行这些命令的时候一定要经常地执行sync命令让内存中的操作同步到硬盘里

首先添加硬盘用来装载内核使用,将分区后的硬盘挂载到/mnt/boot目录下因为grub安装过程中过自动寻找父目录下的/boot目录,将另外一个分区挂载到/sysroot目录下。

创建grub:

        Grub-install --root-directory=/mnt  /dev/had

将当前系统的内核复制到挂载的磁盘的/boot目录下

        Cp  /boot/vmlinuz-2.6.#.el5  /mnt/boot/vmlinuz

为内核创建initrd,可以使用命令创建:

        Mkinitrd  /boot/initrd-`uname-r`.img `uname -r`  为后面这个版本号的内核创建initrd创建后的名字叫做前面的那个名字。

        Mkinitrd  创建initrd的文件路径  内核版本号

        Mkinitrd (红帽5,6)

但我们不能使用上面这个命令来生成我们的initrd因为这样生成的文件是当前的内核的关联的我们无法使用。

我们可以查看当前内核中所包含的文件来生成我们自己的initrd文件:

     首先将内核文件解压缩到我们指定的目录下:

       Zcat /boot/initrd-2.6.18#.el5.img | cpio –id

Init文件是一个脚本,vim编辑:

这一项标明了启动时候的根分区,我们需要将这里的最后改成我们自己指定那个sysroot目录下挂载的磁盘分区。

修改完成后使用 cpio 命令将他归档:

Find . | cpio –H newc –quiet –o | gzip –9  >  /mnt/boot/initrd.gz (我们自己指定的那个目录)

将系统需要的目录和文件:

将系统中的文件和复制进创建好的目录中

在我们自己的/etc/目录下创建inittab文件。

Vim  etc/inittab

Vim /etc/rc.d/rc.sysinit

Chmod +x /etc/rc.d/rc.sysinit

可以使用chroot  /mnt/sysroot 命令来测试我们自己创建的这个根目录

自动复制库文件的脚本:

如何在脚本判断并给变量赋值

(最常用)${parameter:-word} 如果parameter为空或未定义,则变量展开为“word”否则展开为parameter的值,这个式子并不给变量parameter赋值,如果这个变量为空他仍然为空。如果想展开为word的同时赋值的话,使用 parameter=${parmeter:-word}

 

${parmeter:+word} 如果变量为空或未定义,则不做任何操作否则展开为word的值,同样这个表达式也不修改变量的原参数

 

${parameter:=word}  如果变量为空或者未定义,则变量展开为word并将这个值直接赋值给parameter变量

 

${parameter:offset:length} 取子串,从offset处的后一个字符开始,去length长的子串

如何在脚本中使用配置文件

/etc/rc.d/init.d/服务脚本

服务脚本支持的配置文件一般在:

/etc/sysconfig/服务脚本同名的配置文件。

 

在脚本中首先加载配置文件就可以实现脚本中执行的变量和配置文件中相同:

. /etc/sysconfig/配置文件

可以在脚本中使用变量赋值的方法判断配置文件中是否给变量赋值,如果没有就在脚本中修正。

如何解决函数中变量和脚本中变量名冲突的问题

如果函数中的变量和脚本中变量名重复,调用函数后函数中的变量会影响脚本中的变量赋值,这时使用局部变量的限制就可以实现函数中的变量只在函数中有效,跳出函数后不再生效。

使用 local 局部变量将函数中的$a变量只在函数中生效,这时脚本执行后会打印1-10所有的数字,因为函数外的$a不再生效。

命令: mktemp

用于创建临时文件或目录:

Mktemp /tmp/file.xx   添加 –d 选项就会创建临时目录

我们在生成文件的时候,很有可能文件名冲突导致覆盖其他人的或者被覆盖,这时候在文件名后面加上 .xx 系统会自动的为文件分配 . 后面xx这两个随机数保证无论怎么创建都不会和已存在的文件名重复

任务计划

1 在未来的某个时间点执行一次某任务

   at   batch 两个命令

 

  at语法:

 at  时间

at>COMMAND

at>ctrl+d 终止命令输入

指定时间:

绝对时间:HH:MM  DD.MM.YY MM/DD/YY

相对时间: now+#

     单位: minutes hours daysweeks

模糊时间: noon midnight teatime

命令的执行结果:将以邮件的形式发送给安排任务的用户

at –l : 查看at的任务列表。

at –d 任务号码  :删除任务

batch 语法:

     用法相同,不过他会自动选择系统空闲的时间进行任务。

 

2 周期性的执行某任务

   Cron  自身是一个不间断运行的任务

   anacron:cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务再回复正常执行一次。

   Cron:

       系统cron任务

         记录文件:/etc/crontab

           格式:分钟 小时 天 月 周 用户 任务

      用户cron任务

          /var/spool/cron/USERNAME 用户的任务因为是用户自身创建的不需要用户这项

                   分钟 小时 天 月 周 任务

      时间的有效取值范围:

                  分钟: 0-59

                  小时: 0-23

                   天: 1-31

                   周:0-7  0和7都代表周日

                  月 : 1-12

      时间通配表示:

                  *代表所有有效取值,对应每个

                    3 * * * * 代表每个小时的第三分钟都执行

                    3 * * * 7 每周日的每小时的第三分钟都执行

                    13 12 * * * 每天的12点13分钟都执行

                  , 离散时间点。

                    10,40 * * * * 每小时的第10分和第40分都执行

                    10,40 * * * 2,5 每周二和周五的每小时的10分和40分都执行

-         (横线)表示连续的时间点

10 02 * * 1-5 每周的周一到周五的凌晨2点10分都会执行,

                  /# 对应取值范围内每多久一次

*/3 * * * * 每三分钟执行一次

                        01 */2 * * * 每小时的01分执行一次

                  提示:在写每天每小时或者每周的时候,一定要将比他小的时间点上定义一个准确的值这样才会准确的实行,否则就会变成每个小时不停的执行任务,因为小单位上是*

执行结果将以邮件的形式发送给管理员:

如果不停的执行不停的发邮件这些邮件就都是垃圾所以可以设定不需要返回值:

*/3 * * * *  /bin/cat /etc/fstab &>/dev/null

Cron环境变量:cron执行的所有命令都去PATH环境变量指定的路径下去找,有时候在执行任务的时间用户并没有登陆这时PATH环境变量并没有生效,cron任务会自动去下面的路径去找,所以为了避免错误在写任务的时候一定要将命令写成绝对路径:

              PATH/bin:/sbin:/usr/bin:/usr/sbin

如果自动执行任务是一个脚本的话在脚本最开始的时候我们就声明环境变量,这样就不会有错误:

          

用户任务的管理:

Contab

     -l 列出当前用户的所有cron任务

     -e 定义当前用户的cron任务,系统会自动的检查其中的语法错误,提示你更改

     -r 移除所有任务

     -u USERNAME 给用户添加cron任务

Anacrontab 语法 crontab的补充

      

启动两个服务:

     

日志系统:

信息详细程序:日志级别

子系统:facility,设施

Linux上的日志系统:

              Syslog(红帽5)

              Syslog-ng(红帽6):开源

Syslog系统:

这是个服务,为所有的进程记录日志,但未必所有的程序都使用它。

          两个进程:

                   Syslogd  系统  非内核产生的日志信息

                   Klogd  专门记录内核产生的日志信息

Kernel启动过程中屏幕会显示出很多的信息,由于系统启动过程中最后才启动我们最常使用的虚拟终端,所以内核的会将信息输出到现有的物理终端(/dev/console)上也就是我们的屏幕,这些日志信息会记录在/var/log/dmesg 文件中。

使用命令dmesg 来打开这个文件查看信息。

 

日志需要滚动(日志切割):

Messages 文件会根据设定的限制滚动改名,满足条件后会自动改名成 messages.# 数字越小代表记录的日志越老。

当内核将启动转交给/sbin/init进程后日志会记录到:

                /var/log/messages 系统标准错误日志信息,非内核产生的引导信息,各子系统产生的信息,他会自动滚动。

 

Logretate命令专门用来日志滚动

               /var/log/maillog  邮件系统产生的日志信息

                    /var/log/secure  记录用户所有用户登陆的日志信息,包括成功的失败的和通过什么终端登陆,登陆的用户等等

     Klogd服务:

               

日志级别:级别越低记录的就会越详细,级别低的会记录级别高的信息。

@HOST可以设定远程的日志服务器,这样将日志发给其他的日志服务器上,单独保存

邮件日志定义的前面有一个横线 代表异步写入磁盘,生成日志先写入到内存中然后再写入到磁盘中。

修改主机配置后变成远程日志服务器:

在/etc/sysconfig/syslog这个配置文件中修改一个选项:

修改完成后重启syslogd服务即可

成员服务器想要将日志发送到日志服务器只需要修改/etc/syslog.conf配置文件:

将路径修改成日志服务器的ip地址即可

Linux系统故障排除

快速定位故障:

1 确定问题的故障特征是什么

2 人为的推断,重现故障

3 使用工具收集进一步信息,确定故障的真正根源

4 排除不可能的原因

5 定位故障:

          从最简单的问题入手

          一次尝试一种方式,一次次的尝试

          修改前一定要备份源文件

          尽可能借助于工具

          

可能出现的故障:

1 管理员密码忘记

2 系统无法正常启动

       A  grub损坏(MBR损坏、grub配置文件丢失)

       B  系统初始化故障(某文件系统无法正常挂载、驱动不兼容)

       C  服务无法正常启动

       D  图形界面故障

       E  用户无法登录系统(bash程序故障)

3 命令无法运行

4 编译过程无法继续(开发环境缺少基本组件)

 

MBR损坏:

1 借助其他的主机修复

2 使用紧急救援模式:使用grub的安装命令

     A 使用boot.iso文件

     B 使用完整的系统安装光盘

     在boot下运行  linux rescue 进入紧急救援模式

          救援模式下,根是默认以只读的方式挂在到/mnt/sysimage目录下,需要手动挂载成读写的。

           Chroot  /mnt/sysroot

     MBR损坏解决办法:

          1 进入救援模式,挂载根文件系统为读写

          2 输入grub命令进入grub模式进行修复

          3 root(hd0,0) 

          4 setup 输入命令后系统自动修复grub的第一阶段既MBR

          5 sync 同步到磁盘

Grub文件丢失:

系统初始化故障:(kernel panic 内核恐慌)

         Grub:编辑模式

         Emergency模式,这个模式是不加载rc.sysinit脚本的

         进入模式后将不兼容的那一条配置注释掉,再次启动后下载驱动就可以

另外的故障:

     把默认级别设定成0或者6  ——》进入单用户模式,编辑inittab文件

     如果/etc/rc.d/rc3.d 这些目录被删除了  ——》进入单用户模式,编辑inittab文件

     某个服务出现故障导致启动停止,如sendmail配置文件时间戳检查无法通过——》通过进入开机时候的交互式模式:敲i键进入,系统和在启动每一个服务的时候都询问你到底要不要启动,这时候不启动哪个故障的服务即可。

Rc.local 脚本语法错误解决办法:

系统在启动的最后会加载/etc/rc.d/rc.local文件,如果这时候这个脚本中写入了任何无法执行的命令或者是reboot之类的命令将导致系统最后无法启动:

                进入单用户模式修改文件。

如果/bin/bash被删除

这时候无法进入系统无法进入单用户模式,只能进入紧急救援模式来重新安装bash

在救援模式的小系统中并没有cdrom这个设备让我们挂载,这时候的光盘被识别成了hd格式的硬盘我们只需要挂在/dev/目录下的hd开头的硬盘即可

进入 cd server/

     ls | grep bash

重装软件包  rpm –ivh –replscepkgs –root/mnt/sysimage bash-3.2###.rpm

安装完成后使用命令测试一下 chroot  /mnt/sysimage

执行 sync 同步到磁盘

命令无法执行

Export  PATH=  路径变量被修改了

此时退出当前登陆在登陆一下即可

可以在服务器上安装一个版本控制工具,如果改坏了配置文件还可以回复回去:

         Svn  git 非常著名的工具

Sudo详解

在其他用户使用root的权限执行部分命令的时候,他的所有行为动作都会被记录到日志中去:

/var/log/secure 日志中详细记载。

例如管理50台服务器:

       需要副管理员,这时使用sudo赋予他们部分的权限。

 某个用户能够以另外哪一个用户的身份通过那些主机执行哪些命令

 可以控制用户在执行命令的时候还需要输入他的密码才能执行

 

Sudo的配置文件  /etc/sudoers

为了避免其他用户查看权限很特殊  

Sudo有一个自己专门的命令来编辑这个文件,并且这个命令在编辑的过程中可以自动的检查文件中的语法是否正确避免改错:

Visudo

定义一个sudo条目

Who  which_hosts=(runas)command

 

3 root useradd,usermod,usermod,passwd

 

Sudo中支持定义命令组,别名:

         Who 对应 user_alias

         Runas  : runas_alias 

         Which_hosts : host_alias

         Commad : cmnd_alias

         别名必须全部而且只能使用大写英文字母的组合

用户别名定义:

           user_alias  USERADMIN=

                      用户的用户名

                     组名,必须使用%引导才可以

                      还可以包涵其他已经定义的用户别名

主机别名:

        Host_alias       

                 主机名

                 IP

                 网络地址

                 其他主机别名

以另外哪个用户执行命令:

                      Runas_alias :

                          用户名

                          %组名

                          其他的runas别名

命令别名:(这里最好使用绝对路径)

                       Cmnd_alias:

                               命令路径

                               目录(此目录内的所有命令)

                               其他命令别名

Sudo在其他用户第一次执行的时候会记住密码时间是5分钟。

Sudo 有一个 -k选项会让这5分钟的时间立即失效,下次执行命令的时候需要输入密码

Sudo -l 列出所有当前用户可以使用的所有命令

 

添加了NOPASSWD字样以后用户执行命令的时候就不需要在使用密码验证了

如果想这个NOPASSWD标签只对部分的命令生效,当用户使用其他命令的时候依然需要密码添加这样的标签:

定义一个用户的别名:

          最前面写上关键字: User_AliasUSERADMIN = Hadoop,%hadoop,%useradmin

定义一个命令的别名:

          同样最前面需要关键字:Cnmd_Alias USERADMINCMND =/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/usr/bin/passwd 一定使用绝对路径

最后一条定义的命令加上了!号,代表不允许执行这条命令也就是给管理员改密码

但是这样并不能完全的解决修改root密码的问题,因为修改root密码可以不加执行命令并且后面不加root字样,直接修改,sudoers为我们提供了禁止修改root密码的配置方法:

这样书写配置文件即可。

更多推荐

基础学习

本文发布于:2023-04-30 08:52:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/2e0fde7e5e02c0b6ba50159ab0fa8440.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基础

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 113689文章数
  • 28842阅读数
  • 0评论数