主OS==>宿主机 Host Os,虚拟机OS==>客户机 Guest Os
一些虚拟机:VMWare / KVM / VirtualPC / XEN / OpenVZ
虚拟机作用:开发,测试不同配置/环境
使用VMWare安装Linux虚拟机的过程:创建虚拟机,加载ISO,命名虚拟机,指定容量(指的是最大容量)。
1CPU/2Kernel 和 2CPU/1Kernel 的区别:同CPU的内核之间有核间总线相连,信息交换速度快,不同CPU之间信息交换要经过内存,导致速度降低。
网络:
LVM 逻辑卷管理。逻辑卷和物理卷。
根分区,交换分区(休眠用),挂载点(磁盘被挂载到文件系统的一个分支上)
口令和密码的区别:口令password即一般的登录“密码”,密码指明文和密文转换的密钥。
二进制包 rpm(redHat) deb(debian)
源码包 tar tar.gz zip rar
rpm包安装:
rpm -ivh xxx.rpm
-i 安装;-U 升级;-e 移除;-v 显示详细信息;-h 显示安装进度
查看已经安装的shell:
xxxxxxxxxx
cat /etc/shells
rpm包查询:
xxxxxxxxxx
rpm -q zsh
rpm -qa zsh 全局查找
which查询安装路径:
xxxxxxxxxx
which ifconfig ==> /usr/sbin/ifconfig
作业 CentOS7安装软件的方法
rpm -ivh xxx.rpm 安装。将会用到 wget
arch
rpm
。具体步骤如下:
1)找到网络上的 rpm 资源,用 wget 工具下载。下载前先确定机器架构,使用命令 arch 确定是 MIPS,X64还是 ARM 架构,从而确定应当下载的 rpm 文件。
xxxxxxxxxx
arch
x86_64
xxxxxxxxxx
wget -O xxx2.rpm https://xxx1.rpm
2)使用 rpm 安装。
xxxxxxxxxx
rpm -ivh xxx.rpm
3)也可以跳过wget步骤,用url作为目标进行安装。若发现缺失依赖,则需要逐个安装或改用yum安装。
xxxxxxxxxx
rpm -ivh https://xxx.rpm
yum install xxx 安装,使用的是软件源,安装相对来说比较便捷。配置方法如下:
假设现在要更换base repo:
1)yum 的配置分为 main 和 repo两部分,main部分由 /etc/yum.conf 决定。使用vim编辑配置。
2)软件源存放在 /etc/yum.repos.d 目录下,软件源命名时要加.repo。发现系统自带CentOSbase.repo和epel.repo。用vim打开repo,发现是类似ini配置文件的格式:
xxxxxxxxxx
[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7
3)先把repo重命名备份。然后使用wget从url下载对应软件源,将其下载到上文所述的目录下,并重新命名为 xxx.repo。
xxxxxxxxxx
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
4)yum 清除并重新生成缓存
xxxxxxxxxx
yum clean all
yum makecache
5)yum 的两种安装方式,分别安装单个软件及其依赖,软件包和它们的依赖。
xxxxxxxxxx
yum install xxx
yum groupinstall "xxx"
下载源码包,编译后安装。用到 wget
, tar
, make
。具体步骤如下:
1)切换到存放下载文件的目录下,用wget下载tar.gz包。
xxxxxxxxxx
cd /usr/local/src
wget -O xxx2.tar.gz https://xxx1.tar.gz
2)用 tar 解包,进入源码目录后,用 ./configure 检查配置和环境,生成 makefile 文件后,依次运行 make,make install 完成安装。这种方法安装同样可能出现依赖缺失的问题。
xxxxxxxxxx
tar -xzvf xxx2.tar.gz
cd xxx2
./configure
make
make install
七层OSI参考模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
Physical, DataLink, Network, Transport, Session, Representaion, Application
五层模型:物理层,数据链路层,网络层,传输层,应用层。
TCP三次握手:A--syn-->B,B--syn ack-->A,A--ack-->B
TCP四次挥手:A--fin-->B,B-->ack-->A,B--fin ack-->A,A--ack-->B
各种地址:MAC地址,IP地址,port,domain
IP编制的发展:
A,B,C,D,E类网络地址。分为 固定网络位 + 主机位。
类别 范围 0 8 16 24 32
A 0-127 0-----------|
B 128-191 10----------------------------|
C 192-223 110--------------------------------------------|
D 224-239 1110----------------------------------------------------------|
E 240-255 1111----------------------------------------------------------|
子网划分
无分类编制方法
系统操作
xxxxxxxxxx
reboot # 重启
poweroff # 断电
文件查看
xxxxxxxxxx
cat file1 # 查看file1所有内容,-n 打印行号
cat file1 file2 # file1和file2连在一起并查看
cat file1 file2 > file 3
# file1和file2连在一起并保存在file3,此时再查看file3,获得的是file1+file2的所有内容
more # 分页显示,回车下一行,空格下一页
less # 分页显示,同上,可以往回翻,按b上一页
zless # 分页显示压缩文本文件
nl # 比cat -n 更专业的打印行号命令,-b a全部行标号(和cat -n一样),-b t仅非空行标号
head -n 20 [file] # 查看头部20行,默认10行
tail -n 20 [file] # 查看尾部20行,默认10行,加 -f 可以不断读取文件,用于动态日志的查看
file [file] # 查看文件类型
cut [file] -d [str] -f [slice]
# 文件每一行都按分隔符(delimiter)str分割,打印分割后的每行的slice定义的字段
cut /etc/passwd -c [slice]
# slice:
# 1.-num表示前num个字符
# 2.num表示第num个字符
# 3.num-表示num个字符之后的字符
# 4.num-num 表示第num1到第num2之间的字符
# 5.num1, num2, num3 分别打印第xxx个字符
计数命令wc
xxxxxxxxxx
wc [file] # 显示所有统计信息
wc -l [file] # 行数
wc -w [file] # 单词数
wc -c [file] # 字节数
# 案例
ls -l | wc -l # 统计目录文件数
排序命令sort
xxxxxxxxxx
# 输出文件内容的排序结果,默认字典排序,-r反向排序,-t指定分隔符,-k表示分割后按第n个字段排序
sort [file]
# 案例
cat /etc/passwd | sort -t ':' -k 3 -r # 按照":"分割后的第三列进行字典反向排序
sort /etc/passwd -t ':' -k 3 -r # 按照":"分割后的第三列进行字典反向排序
比较命令
xxxxxxxxxx
diff [file1] [file2] # 逐行比较两个文件的不同
cmp [file1] [file2] # 遇到第一次不同就停止
comm [file1] [file2] # 比较两个排序的文件
帮助命令
xtype [command] # 查看命令是系统自带的还是外部命令
help [command] # 得到内建命令的帮助,例如help cd
[command] --help # 得到外部命令的帮助
man [command] # 在帮助手册中查找该指令,LS(n)表示当前查看的指令位于手册第几章节,一共9个章节
目录查看之ls
xxxxxxxxxx
-l 完整显示
-a 不忽略隐藏文件
-i 显示node结点
软硬连接的区别
xxxxxxxxxx
vim file1
# This is file1
# esc + : wq
ln file1 filePtr # 硬链接
ls -i file1
ls -i filePtr
# 两者结果是一致的,因为filePtr指向file1,两者node结点一致
rm file1
cat filePtr
# >> This is file 1
ln -s filePtr fileSoft # 软链接
ls -i filePtr
ls -i fileSoft
# 两者结果不一样,因为建立的是软链接
rm filePtr
cat fileSoft
# >>No such file or directory
文件操作
xxxxxxxxxx
cp [fromRegExp] [toRegExp] # 复制操作 -n 不要覆盖同名,-f 强制覆盖,-i 覆盖前询问,-r递归复制
rm [file] # 删除文件,提示yes/no
rm -rf [dir] # 强制删除且递归删除,不提示yes/no
mv [file1] [file2] # 移动文件1到位置2,可以作为重命名
pwd # 查看当前所在目录,print work directory
mkdir [dirPath] # 创建空文件夹,-p参数时,可以递归创建,不能创建与已有文件同名的文件夹
rmdir [emptyDir] # 删除空文件夹
touch [fileName] # 不加参数时创建新文件
查找操作
xxxxxxxxxx
##############################################
-atime 30 # 30天以上未访问
-size +512M # 大小大于 512MegaBytes
-ok command ; # 执行指令 冒号前必须有空格 执行前有y/n提示
find ~/Bill ~/Denis -size +1000B -atime +30 -ok rm {} \;
# 找到 ~/Bill ~/Denis两个文件夹中,大小大于1000B,30天以上没有访问的文件,经用户同意后执行删除
##############################################
grep [regExp] [file] # 查找file中的符合regExp的行,并显示
ls -l | grep [regExp] [file] # 查找列表中的信息,符合grep条件的输出
#例如:
grep "abc" file1 # 查找文件file1的包含abc的行
ls -l | grep "^-r.x" # 查找当前路径文件显示列表中,开头是-dr.x的行,即普通文件
正则表达式
xxxxxxxxxx
. 任意字符
* 表示多个
? 表示一个
[abc] 任意一个其中的字符
[a-z] 任意一个unicode在a到z的字符
命令执行顺序控制与管道
什么是管道:前一个命令的输出作为下一个命令的输入,用 | 搭建管道。
commandA;commandB;commandC,将ABC命令顺序执行。
commandA && commandB,逻辑与,短路性质,如果前面的命令返回0,后面的命令才执行。(0表示正常)
commandA || commandB,逻辑或,短路性质,如果前面的命令返回非0,后面的命令才执行。(!0表示异常)
commandA && commandB || commandC,可以理解为?:三目运算符。
$? 环境变量表示上一次执行命令的结果。
unix设计哲学:every thing is a file
Linux启动时首先挂载根文件系统,然后在挂载点上自动或挂载其他文件系统。
根文件系统rootfs的一些常用文件夹:
/proc 系统信息
/home 用户目录
/root root专用目录
/var 共享信息
文件权限:-rwx r-x r-x,分别是属主权限,属组权限,他人权限。r表示可以读,w表示可以写,x表示可以执行,-表示不具有某权限。
权限管理
xxxxxxxxxx
chmod u+rw file1 # 属主权限增加读写权限
chmod g-rx file2 # 属组权限减少读、执行权限
chmod og+w file3 # 属组和他人增加写权限
chmod 610 file4 # r=4/w=2/x=1,赋权结果: rw- --x ---
压缩和打包
xxxxxxxxxx
## 压缩
gzip file1 file2 file3 # 压缩三个文件,形成三个gzip文件
gzip -r hello # 目录下递归压缩,每个文件都被压缩成 gz,不是把目录整体压缩了!
gzip -d file1.gz file2.gz # 解压缩文件
## 打包 -v = verbose, -f = ARCHIEVE,
tar -zcvf dir1.tar dir1 # -c,创建压缩包
tar -zxvf dir1.tar # -x,解开压缩包
存储
xxxxxxxxxx
du #disk space
df #disk usage
进程
xxxxxxxxxx
ps #查看进程
ps aux #查看所有进程
ps aux | grep xx #查看xx所在的进程
kill pid #杀死进程pid
gedit & #启动gedit,后台运行,不阻塞命令行
xxxxxxxxxx
#############################################
跳转
#############################################
hjkl #方向键
iI/aA #插入模式(当前光标/行首/光标后/行末)
oO #在后/前插入新行
e #跳到行尾
3k #向上移动3行
wb #向后/前跳单词
nG/gg/G #移到第n行/第一行/最后一行
ctrl+o #跳转到前一次光标位置
0/^ $ #跳到行头/行尾
F/f<Alpha> #向前/后搜索第一个出现的字母Alpha并跳转到此位置
>> #缩进
<< #反向缩进
#############################################
删除操作
#############################################
xX #删光标字符/光标前一个字符
dd #剪切(删)行
d^/d$(D) #删除到行首/行尾
dw #删一个单词
dG/d1G #删除到EOF/到开头
d3w #delete 3 words
#############################################
复制粘贴操作
#############################################
yy #复制一行
y2w/y1G/y$/y^ #都是不同的复制
p/P #粘贴在光标后/前
#############################################
其他实用操作
#############################################
ctrl+r #redo
u3 #undo 3 times (default 1)
U #undo all
~ #光标处大小写反转
r<Alp> #光标字符替换为Alp
R #连续替换模式
cw/b #删除一个向后/前搜索到的单词并进入插入模式
cc #删除一行并进入插入模式
C #删除到行尾 进入插入模式
/<string> #快速查找string, ?<string>向上查找。查找状态按n/N找下一个/上一个
\* \# #查找游标处的单词,分别是向上向下查找
#############################################
底线命令模式
#############################################
:set shiftwidth=8 #设置缩进
:set number/nu #显示行号
:set nonumber/nu #取消行号
:set cursorline #设置行线
:set nocursorline #取消行线
:colorscheme [skin] #设置皮肤
:ce/ri/le #设置行center/right/left(居中/左/右)
:q #退出
:w [filename] #保存/另存为
:x/wq #保存退出
#############################################
高级技巧
#############################################
1.vim [file1] [file2] 同时编辑两个文件,命令行 :n /:N 向前/后切换
2.v 进入可视模式,用光标选取矩形区域执行操作(d/y等) V是行可视模式,只能一行一行全选
3.视窗操作
:sp/vsp 1.txt 打开一个水平/垂直视窗编辑1.txt
4.vim -x file1 创建加密文档
5.
How to execute a shell script?
xxxxxxxxxx
chmod u+x hello;
bash hello;
./hello
sh hello;
点命令/非点命令的区别:点命令同一进程运行,非点命令不同进程运行。
xxxxxxxxxx
# mycd
echo helloworld
a=$PATH
PATH=a:$PATH
mycd
helloworld
PATH=a
mycd
CommandNotFound
echo 参数传递与参数变量:
xxxxxxxxxx
#parameter
echo $1
echo $2
echo $3
...
echo $10
echo ${11}
# bash
echo 1 2 3 4 5 6 7 8 9 10 11 12
1
2
3
...
100($10)
10(${11})
xxxxxxxxxx
# 有空格
expr 1 + 2
expr 1 \* 2
expr 1 "*" 2
# 没空格
let a=$a+1
let c=$a*$b
# 双括号形式
((a=a+1))
b = $((a+1))
# bc
echo "5*6" | wc
echo "obase=2;1000" | bc
echo "ibase=2;1010" | bc
# Comparison
= > < >= <= n z # Compare String
eq ne lt le gt ge # Compare Integer
-f(file) -r -w -x -d(directory) # Test File/Directory
-a(and) -o(or) # Concat state expr
echo test 5 -eq 5
echo $? ==> 0
echo test 5 -eq 6
echo $? ==> 1
b = 01
test -z "$z"
echo $? ==> 0
xxxxxxxxxx
read
if test 5 -eq $variable
fi
case $variable in
1) echo hello;;
2) echo bye;;
esac
xxxxxxxxxx
$? # Status of the last command. 0 - succ, 1 - fail, 2 - error
$# # Parameter counts that is passed to the script
$* # Show all parameters: a b c d
$@ # Show all parameters with double quote: "a" "b" "c" "d"
$$ # PID of a script
xxxxxxxxxx
for i in 1 2 3 4 5
do
echo $i
done
for i in *
do
echo $i
done
xxxxxxxxxx
count=10
while [ $count -ge 0 ]
do
echo $count
count = `expr $count - 1`
done
xxxxxxxxxx
count=10
until [ $count -ge 0 ]
do
echo $count
count = `expr $count - 1`
done
xxxxxxxxxx
a=123;
( a=321; )
echo $a # 123
{ a=321; }
echo $a # 321
xxxxxxxxxx
# About redirect
echo 'a' > a.txt # Overwrite
echo 'a' >> a.txt # Append
echo 'a' &> a.txt # Error Stream to a.txt
xxxxxxxxxx
# About function
func1(){
echo 'Hello';
}
. ./func2 # Load functions from another file func2
func2 1 2 r # Use function and pass value
xxxxxxxxxx
myprog : foo.o bar.o # Target depends on foo.o and bar.o
gcc foo.o bar.o -o myprog # If foo.o and bar.o changed, execute this command
foo.o : foo.c foo.o bar.h
gcc -c foo.c -o foo.o
如何根据上图编写makefile?
xxxxxxxxxx
div.o : div.c
gcc -c div.c
mult.o : mutl.c
gcc -c mult.c
add.o : add.c href.h
gcc -c add.c
sub.o : sub.o href.h
gcc -c sub.c
prog : div.o mult.o add.o sub.o main.c
gcc -o prog div.o mult.o add.o sub.o main.c
默认规则:xxx.o 默认依赖 xxx.c ,因此改进:
xxxxxxxxxx
prog : div.o mult.o add.o sub.o main.c
gcc -o prog div.o mult.o add.o sub.o main.c
add.o sub.o : href.h # 2 --> 1
clean: # Execute when make clean
rm mult.o add.o sub.o add.o main.o
xxxxxxxxxx
# Enter GDB
gcc -g hello.c
gdb a.out
r [params] # Start program with params
show args # Show args passed to r
l 43 # Show code around line 43
# Set breakpoint
b 2 # Set breakpoint at line 2
b hello # Set breakpoint at function name hello
b * x80400800 # Set breakpoint at certain address
disable/enable # Enable/Disable one breakpont
watch
disp tmp # Show variable tmp when debugger pauses
undisplay # Discard all displ variable
p $eax # Show register $eax
p /x ($ebp + 8) # Show register address + 8 in hexadecimal
p * x80400800 # Show memory at certain address. Show one byte,
p *(int*)0xxx # Get value of a integer. Provide 1st address and get the rest.
s # Step over
n # Next
bt # Backtrace
set X = 12 # Modify variable when debugging
define marcoName # Define a macro
info b # Show all breakpoints
d 2 # Delete breakpoint 2
版本控制,分布式 git,集中式 svn。
xxxxxxxxxx
# Core command
git init # Init a git repo
git add # Add changes to tmp
git rm # Remove changes to tmp
git commit # Commit to repo
git push # Commit to remote repo
git clone # Clone from remote repo (To empty local repo)
git pull # Pull from remote repo (To already existing local repo)
# Revert/Info command
git status # Show git status
git reflog # Log ALL git history regardless of current version
git log --pretty=oneline # Log git history in one line, BEFORE current version.
git reset --hard [gitVersion] # Revert to previous version.
git reset --hard|mixed|soft
xxxxxxxxxx
+----------+----------+----------+----------+
| Method | Working | Modified | Commited |
+----------+----------+----------+----------+
| Soft | v1.1 | v1.1 | v1.0 |
+----------+----------+----------+----------+
| Mixed | v1.1 | v1.0 | v1.0 |
+----------+----------+----------+----------+
| Hard | v1.0 | v1.0 | v1.0 |
+----------+----------+----------+----------+
xxxxxxxxxx
# Branch Opr.
git branch -v # Check branch status
git branch [branchName] # Create a new branch
git checkout [branchName] # Go to certain branch
# Remote Command
git remote add [Alias] [Url] # Give url an alias
git remote -v # View remote info
git push [Alias|Url] [Branch] # Push local repo to [Branch] on [Alias|Url]
xxxxxxxxxx
systemctl start|restart|enable [Service]
作业 了解 /proc 中的内容并分析其中某个文件
进入 /proc 目录:
/proc 以文件系统的方式为访问系统内核数据的操作提供接口。
包含的内容:CPU信息、安装的加密方式、RAM信息、磁盘状况、网络信息、支持的文件系统、驱动设备信息、物理设备映射等,不一一列举了,可以参考文章:https://blog.csdn.net/zdwzzu2006/article/details/7747977,里面对每个文件的作用都有简略的介绍。
查看其中信息的方法:
以 cpuinfo 文件为例:
解读参考文章 https://blog.csdn.net/lgstudyvc/article/details/7889364
vendor_id :CPU制造商
cpu family :CPU产品系列代号
model :CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频,这里是2.5GHZ
stepping :CPU属于制作更新版本
cpu MHz :CPU的实际使用主频
cache size :CPU二级缓存大小
physical id :单个CPU的标号
siblings :单个CPU逻辑核数
core id :当前物理核在其所处CPU中的编号,这个编号不一定连续
cpu cores :该逻辑核所处CPU的物理核数
apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
fpu :是否具有浮点运算单元(Floating Point Unit)
fpu_exception :是否支持浮点计算异常
cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags :当前CPU支持的功能,例如fpu表示有浮点运算器,acc表示自动时钟控制等。
bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size :每次刷新缓存的大小单位
cache_alignment :缓存地址对齐单位
address sizes :可访问地址空间位数
power management :对能源管理的支持
作业 安装vim插件
以安装YouCompeleteMe为例。
首先安装 vim 插件管理器,这样安装插件会比较简单,选择 vim-plug
进行安装。
在home目录下,新建 .vim
文件夹,在里面新建 autoload
文件夹。然后执行以下命令:
xxxxxxxxxx
cd autoload
wget https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
即可安装好 plug.vim 插件。
配置 .vimrc 文件。新建.vimrc文件,并写入以下内容:
xxxxxxxxxx
call plug#begin('~/.vim/plugged')
Plug 'Valloric/YouCompleteMe'
call plug#end()
进入vim,输入 :PlugInstall
,安装过程自动进行。
安装完毕,输入:PlugStatus
,显示YouCompleteMe:OK。
退出重新进入vim,发现虽然vim版本足够高,但仍报错版本不能达标,YCM不能启动。根据网上的解决方案,卸载vim,并通过 make
的方式安装了8.0+的 vim。
再次进入vim,下方提示 ycmd server SHUT DOWN,经过搜索,发现是没有正确执行安装过程。进入 '~/.vim/plugged/YouCompeteMe'
,执行 ./install.py
。安装完毕后,打开一个c文件,此时问题已经消失。
最后顺利显示了提示。