linux 学它就够了 包含make的实验,带你理解linux下源码安装是在干什么

第一章

  1. 文件系统的构成

文件系统是磁盘以及逻辑分区的目录结构,一个磁盘设备包含一个或多个文件系统,但每个文件系统必须占据一个单独的分区。

Linux 文件系统采用带链接的树形目录结构,即只有一个根目录。根目录可含有下级子目录或文件,子目录中又可有更下级的子目录或者文件。这样一层一层延伸下去,构成一颗倒置的树。

 

Linux 根目录下各文件的作用

/dev 设备的特殊文件

/home 用户主目录

/etc 系统管理和配置文件

/proc 系统内存的映射,存放系统信息

/opt 第三方安装文件

/kernel 系统代码

  1. 工作目录

控制台或者终端在某个时刻总是对应着一个目录,该目录即工作目录。用“.”表示,工作目录上层目录父目录用“..”表示。

cd /   返回该文件系统的跟目录

cd ..    返回父目录

cd ~ 控制台或终端会将“~”符号替换成用户起始目录的绝对路径

文件描述符 0,1,2 分别表示 标准输入,标准输出,标准错误。

  1. Linux 黑洞

使用 /dev/null 语句,它是空/设备,看作“黑洞”,他非常等价于一个只写件,所有写入他的文件都会消失,而尝试从他那里读则什么内容也读不到,然而这条语句对命令行和脚本都非常有用。

/dev/null 通常用来处理进程中那些不想要的输出流,或者作为一个方便的空文件给输出流去做重定向。

如快速清空一个文件的内容     cat /dev/null > 文件名字

  1. 用户管理

useradd 名字

passwd 名字

userdel 名字

groupadd 名字

groupdel 名字

whoami

查看登录用户:who –a 显示所有用户的所有信息

              who –H 显示列标题

某一时刻用户的行为     w

用户之间的切换   

sudo su 切到root ,  su zhangxinghe 切到zhangxinghe用户

创建一个用户 jc 这个用户只能在/home/jc上面增加删除文件,jc不能在其他目录加减文件

useradd –d /home/jc/ -m jc

passwd jc

chown jc –R /home/jc

su jc

  1. 文件目录管理

mkdir 名字

mkdir -p c/usa/uk      递归创建多个目录  

mkdir c/test c/china     创建多个目录

rmdir 名字        删除空目录

rm –r 目录名字    删除非空目录

pwd              显示当前工作目录

ls a

ls –l

mv 原目录名字 现在目录名字         目录重命名/目录移动

cp r 原目录名字 现在目录名字                   

  拷贝原目录下所有的文件、  目录到现在目录下

  1. 文件管理

vim 名字

rm -i 名字          系统提示 是否删除

rm -f 名字          删除之前不提示任何结果             

ln –s 原文件名字 现在文件名字   文件链接       

用ls –li 查看会显示      现在文件名字 -> 原文件名字

more 文件名字       一次一屏显示文件内容,空格或回车显示下一屏

less 文件名字        同样效果

cat 文件名字         一次全部显示

cat 文件1名字 文件2名字>文件3名字  将1,2的内容写到3,覆盖3的原内容

cat 文件1名字>>文件2名字    将文件1的内容追加到文件2中

head –n 文件名字     显示文件的前n行

tail –n 文件名字       显示文件的后n行

nl 文件名字         以编号的形式一次全部显示文件的内容,不计算回车换行

mv 原文件名字 现在文件名字   文件重命名/文件移动

cp –p clock.c /home/zhangixnghe/cynhard     复制当前目录下的文件并保留文件属性

cp –p clock.c /home/zhangixnghe/cynhard     复制当前目录下的文件,但是操作时间等属性发生改变                    

find . -name “Linux” print  

find –atime -2            2天内修改过的文件

find . name “*.c”        查看当前目录下后缀为.c的文件

find . name “c*”         查看当前目录下c开头的文件

find –perm 755           查看当前文件夹下权限为755的文件

 

反常规的find命令(假设当前目录下有sh为后缀的文件)

find . –name ?.sh

 

题目一

 

 

 

 

 

答案:

 

题目二

 

grep  强大的文本搜索工具(第二章还有)                    

grep “main” clock.c       查找文件含main的文本行

grep “printf” –n clock.c (引号可以没有)   

查看文件含printf的文本行及编号

ls | grep ‘^b’      查看当前目录下,以b开头的文件(重要

  1. 重定向

   符号

>      输出重定向到一个文件或设备 覆盖原来的文件

>!     输出重定向到一个文件或设备 强制覆盖原来的文件

>>     输出重定向到一个文件或设备 追加原来的文件

<      输入重定向到一个程序

例子:

[test @test test]# ls -al > list.txt
将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代!


[test @test test]# ls -al >> list.txt
将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!


[test @test test]# ls -al  1> list.txt   2> list.err
将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err


[test @test test]# ls -al 1> list.txt 2> &1
将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!

 

[test @test test]# ls -al 1> list.txt 2> /dev/null
将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。

 

  1. 权限管理

 

ls –l 查出的首字母代表的意思

  • 普通文件

b  块设备文件

c  字符设备文件

d  目录

l   链接文件

p  命令管道文件

s  本地套接口

   chmod u/g/o/a+/-/= 文件名字

   其中:+:增加指定的权限

         -:去掉指定的权限

         =:清除所选的权限并将其设置为制定的权限

   chmod允许使用八进制符号作为模式,改变权限。

假定clock.c最初具有这样的权限rwxrwxrwx,连续操作如下

 

 

改变文件/目录的属主(change owner)

     chown Owner FileName/DirecName

     如:chown Dave haison.c

改变文件/目录的属组(change group)

    chgrp Group FileName/DirecName

     如:chgrp Dave haison.c

改变文件/目录的属主和属组

    chown owner:group FileName/DirecName

     如:chown Dave:Dave haison.c 

第二章

  1. shell

用于linux系统管理和软件开发的脚本语言

Shell 脚本是一个写入系列命令文本文件里,可以一次性执行的可执行文件

Linux 大量采用Shell 脚本来完成重复性或系统维护工作

我们常说有几种shell,其实说的是shell脚本解释器

有 bash(linux 默认)    sh(unix默认)    csh    ash    ksh

sh 下工作的命令,可以在bash中工作,反之不行

cat /etc/shells           系统安装shell的版本

  1. shell程序编写

注意点:1第一行写#!/bin/bash  2变量赋值不加空格,且在双引号内给变量赋值  3使用echo 命令显示  4使用$符号来引用  5shell变量不需要定义

简单shell程序

#!/bin/bash

A=”zhangxinghe”

echo $A

{}保护引用的变量

var1=hello

echo ${var}world

空值置换

echo var1

echo ${var1:-12}

echo $var1

空值赋值

echo var2

echo ${var2:=13}

echo $var2

空值出错

echo var3

echo ${var3:?”zhangxinghe”}

echo $var3  

num1-eq num2 

等于

[ 3 -eq $mynum ]

num1-ne num2 

不等于

[ 3 -ne $mynum ]

num1-lt num2 

小于

[ 3 -lt $mynum ]

num1-le num2 

小于或等于

[ 3 -le $mynum ]

num1-gt num2 

大于

[ 3 -gt $mynum ]

num1-ge num2 

大于或等于

[ 3 -ge $mynum ]

 

  1. 系统变量 和 环境变量

查看单个环境变量     echo $PATH

查看所有环境变量    (全局) env  或者  (所有)set

常用系统变量

$n     $1 表示第一个参数,$2 表示第二个参数 ...

$#     命令行参数的个数

$0     当前程序的名称

$?     前一个命令或函数的返回码      是返回0,不是返回1

例子见下图

例一

 

 

例二

 

 

$*     以“参数1 参数2() ... ” 形式保存所有参数

$@     以“参数1” “参数2” ... 形式保存所有参数

$$     本程序的(进程ID号)PID  

$!     上一个命令的PID

  1. Shell 表达式运算

1echo $((1+3))

2expr 2 + 4     expr 3 \* 5        注意空格

3let x=1+3;echo $x

4var=`expr 2 + 4`;echo $var       这里是`, 即ESC下面键,不是’

  1. Shell 程序

if语句

test 3 –gt 4 && echo Ture || echo False

[ 3 –gt 4 ] && echo Ture || echo False

if [ -a clock.c ];then echo ture;else echo flase;fi

[ -a clock.c ] && echo ture || echo false

[ "$(whoami)" != 'root' ] &&  echo “you are using a non-privileged account”

 

 

case实例

#!/bin/bash   

echo "1 Restore"                              

echo "2 Backup"                               

echo "3 Unload"                    

echo "Enter Choice:"                       

read CHOICE                                   

case "$CHOICE" in                             

1) echo "Restore";;                           

2) echo "Backup";;                            

3) echo "Unload";;                            

*) echo "Sorry $CHOICE is not a valid choice “

Esac

for 循环

  1#!/bin/bash

   for time in moring noon afternoon evening

   do

   echo “this time in $time”

done

2#!/bin/bash

#从1加到100

s=0

for((i=0;i<100;i++))

do

    s=$(($s+$i))

done

echo “the sum is $s”

while循环

1#!/bin/bash

#从1加到100

s=0

i=0

while [ $i –lt 100 ]

do

s=$(($s+$i))

i=$(($i+1))

done

echo “this sum is $s”

2#!/bin/bash

x=1

while ((x<=10))

do

echo “hello is $x”

x=$(($x+1))       #let x=x+1

done

3#!/bin/bash

x=1

until ((x>10))

do

echo “循环输出$x”

x=$(($x+1))

done

select 语句

#!/bin/bash

echo “what is your favorite os ”

select var in “linux” “free bas” “other”

do

break

done

echo “you have select $var”

函数shell

#!/bin/bash

myvar=”hello he h”

myfunc(){

local x

loca myvar=”one two three”

 

for x in $myvar

do

echo $x

done

}

myfunc

echo $myvar

  1. Shell程序调试

bash –x for1.sh    执行该脚本并显示所有值

  1. grep命令     强大的文本抓取命令,打印含有特殊内容的文件

grep NW file      # 打印出file中所有包含NW的行

grep '^n' file    # 打印出以n开头的行

grep '4$' file    # 打印出以4结尾的行

grep '5\..' file # 打印出第一个字符是5,后面跟着一个.字符,再后面是任意字符的行

grep '\.5' file   # 打印出所有包含.5的行

grep '^[we]' file  # 打印出所有以w或e开头的行

grep ‘^[0-9] file  # 打印出所有不是以0-9开头的行

grep '[A-Z] [A-Z]' file  # 打印出所有前一个字符是大写,后跟一个空格及一个大写字母的行

grep '[a-z]\{9\}' file  # 打印所有包含至少有9个连续小写字符的字符串的行

grep '\<north' file     # 打印所有以north开头的单词的行

grep '\<north\>' file   # 打印所有包含单词north的行

grep '^n\w*' file       # 第一个字符是n,后面是任意字母或者数字

egrep 'NW|EA' file   # 打印所有包含NW或EA的行。或grep -E

grep 'NW\|EA' file      # 对于标准grep,若在扩展元字符前面加\,grep会自动启用-E 

  1. awk       强大的文本分析工具

内置变量:

ARGC:   命令行参数个数

ARGV:   命令行参数数组

ARGIND: 当前文件索引(从1开始)

FILENAME:当前输入文件名

FS:       输入字段分隔符(默认空格)

NR:      当前记录数

NF:      当前记录字段数

OFS:     输出字段分隔符(默认空格)

ORS:     输出记录分隔符(新行)

RS:       输入记录分隔符(新行)

RSTART:  被匹配函数匹配的字符串首

RLENGTH: 被匹配函数匹配的字符串长度

OFMT:   数字的输出格式(%.6g)

IGNORECASE:控制大小写敏感(0:敏感)

 

 

 

内置函数

 

   vim emp  录入内容

tom jones 4424 5/12/66 543354

mary adams 5346 11/4/63 28765

aslly chang 1654 7/22/54 650000

billy black 1683 9/23/44 336500

 

awk ‘/mary/’ emp          打印包含mary的行

awk ‘{print $1}’ emp        打印每行的第一个域

awk ‘/sally/{print $1,$2}’ emp 打印包含sally这行的第一第二各区域

   awk ‘/sally/{print “\t\t have a nice time,” $1,$2”!”}’ emp

 

  1. sed 对文本进行过滤和替换,一次读取一行内容

sed把当前行存储在临时缓冲区中(称为“模式空间”),用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

 

删除命令:d命令

$ sed '2d' file # 删除file文件的第二行

$ sed '2,$d' file # 删除file文件的第二行到末尾所有行

$ sed '$d' file # 删除file文件的最后一行

$ sed '/test/d' file # 删除file文件所有包含test的行

 

选定行的范围:逗号

$ sed -n '/test/,/check/p' file # 打印所有在模板test和check所确定的范围内的行

$ sed -n '5,/^test/p' file # 打印从第五行到第一个包含以test开始的行之间的所有行

$ sed '/test/,/love/s/$/xxx/' file # 对于模板test和love之间的行,每行的末尾用xxx替换

 

替换:s命令

$ sed 's/test/xxx/g' file # 把行中所有的test替换为xxx;若无g,则只替换第一个

$ sed -n -r 's/(love)ab/1rs/' file # love被标记为1,所有loveab会被替换成lovers

$ sed 's#10#100#g' file # “#”紧跟s后,是分隔符,代替了默认的“/”分隔符

 

追加命令:a命令

$ sed '/^test/axxxx' file   # 在以test开头的行后插入新行xxxx

 

插入命令:i命令

$ sed '/^test/ixxxx' file   # 在以test开头的行前插入新行xxxx

  1. 管道

使用管道可以将一个命令的输出传入到一个命令的输入中。

ls –l | grep for        查看该目录下名字中有for的目录和文件

ls | grep ‘^b’          查看当前目录下以b开头的文件

第三章

  1. gcc 预处理,产生汇编语言,产生目标语言,产生二进制语言

gcc -E hello.c -o hello.i  #预处理    hello.c  hello.i

gcc -S hello.i    

#编译为汇编文件             hello.c  hello.i  hello.s

gcc -c hello.s   

#转换成目标文件             hello.c  hello.i  hello.o  hello.s

gcc hello.o -o hello  #链接成一个名为hello的二进制可执行文件 hello  hello.c  hello.i  hello.o  hello.s

-c只编译,即只产生.o文件,  -o 产生目标文件

-E 预处理      -S 汇编

本来,每一个c文件都可以直接 gcc **.c编译,结果如下图

 

 

注意

当遇到 gcc max.o min.o hello.c 时,表示编译并链接

 

 

 

 

 

 

 

 

 

  1. 静态库

 

 

 

执行make lib

执行make

另一个例子:

 

  1. make文件编写

实际上,make工程管理器是一个自动编译管理器,这里的自动是指他能够根据文件的时间戳自动发现更新过的文件,从而减少编译的工作量。同时他能够通过读入makefile文件的内容执行大量的编译工作。

makefile 是make读入的唯一配置文件,makefile文件一旦写好,仅仅需要一个make命令,整个工程即可自己主动编译。在其他ide中也有make命令,如delphi 下的make,visual c++ 下的nmake ,linux 下的make。

make命令运行时,须要一个makefile 文件,来告诉make命令怎样去编译和链接一个程序。

 

执行的顺序:

***.c ->编译->***.o->链接->可执行文件

 

 

实例 简单的helloworld

先编写一个hello.c

#include <stdio.h>

int main()

{

printf(“zhagnxngieh”); //故意写错的

return 0;

}

编写makefile文件

hello: hello.o

gcc –o hello hello.o

hello.o: hello.c

gcc –c hello.c

clean:

rm hello hello.o

执行make 完成编译

./hello

输出 zhagnxngieh

修改hello.c

printf(“zhangxinghe”);

./hello

依然输出 zhahnxnhieh

然后make一下

./hello

结果正确输出 zhangxinghe 

make clean

自定义变量的用法

 

预定义变量和自动变量

 

 

 

预定义变量

 

 

 

 

 

 

 

自动变量

 

  1. gdb 调试

可以调试c , java, c++    调试的对象是可执行文件

 gcc –g add.c –o add 确保被调试程序的可执行文件内添加了调试信息

l

info b

r

n

p i    打印变量i的值  (只有next后才会打印)

bt     查看函数堆栈

finish   推出函数

q   退出gdb

第四部分:(实训的增加知识)

对操作系统的理解,硬件都有接口,编写一个操作系统,对接口操作上就行了。

  1. ps –ef | grep bash

抓取出当前所有的与bash相关的进程

  1. alias h = ‘history’

把history 命令简化写成 h

  1. 在linux 里所有东西的都是文件
  2. 路径   注意区分

windows操作系统     \

linux 操作系统        /

  1. 设置管理员密码

sudo passwd

输入当前用户密码  briup

然后会要求输入 unix密码(即管理员用户的密码)

重新输入一遍即可ubantu

su               操作即可

进入用户后可以改密码        passwd 即可

所有用户的密码 全是 zhangxinghe

  1. linux的软链接相当于windows的快捷方式

ls  开头是  c

  1. file 名字              查看

 

  1. redhat 关机,重启命令

关机

halt     poweroff      shutdown –h now     shutdown –h 10(10分钟后自动关机, shutdown –c 取消)    init 0

重启

Reboot       shutdown –r 10(10分钟后重启)     shutdown –r 20:35(20:35 重启)      shutdown –c(取消重启)   init 1\

  1. Redhat 6忘记密码  进单用户模式 passwd

重启系统

1、在出现第一个红色界面右上角五秒倒计时开始时输入e后出现下图

 

 

2、再次输入e,选择kernel开头的那一行

 

3、再次输入e,在行末尾增加一个空格和single,然后回车

注意:也可以增加一个空格和1(代替single)

 

4、在下图输入b,开始启动系统进入单用户模式

 

5、成功进入单用户模式后的界面,这一步直接进入,没有输入密码什么的,之后就可以修改root密码,修改文件什么的。

  1. Redhat 7

Linux – RedHat7 / CentOS 7 忘记root密码修改

1.(a) 开机出现grub boot loader 开机选项菜单时,立即点击键盘任意鍵,boot loader 会暂停。

(b) 按下’e’,编辑选项菜单
(c) 移动上下鍵至linux16 核心命令行

linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=449d53d1-84c2-40c0-b05e-d1900591d71b ro rd.lvm.lv=vg_kvm7usb/swap crashkernel=auto 

vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_kvm7usb/root rhgb quiet LANG=en_US.UTF-8 rd.break

(d) 在核心命令行最后加入rd.break 。
(e) 再按下Ctrl+x 重新以这个设定开机。
●开机后的互动式命令环境,並不是正常开机的系統,正常开机系統挂载在 /sysboo 且挂载成只读,必須重新挂载成可写入,才能修改密碼,步骤如下:
(a) 重新挂载/sysroot 成可读可写。
switch_root:/# mount –o remount,rw /sysroot
(b) chroot 工作目录到/sysroot。

switch_root:/# chroot /sysroot
(c) 设定新的root 密码。

sh-4.2# passwd root

(d) 因为在此情況下,SELinux 並沒有启动,对所有文件的更改,可能会造成文档的context 不正确,为确保开机时重新设定SELinux context,必

須在根目录下添加隐藏文件.autorelabel。

sh-4.2# touch /.autorelabel

(e) 退出chroot

sh-4.2# exit

switch_root:/#
(f) 退出系統,系統会自动重新开机。

switch_root:/# exit
重启后,使用修改后root密码登入即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值