0%

Linux

Linux

参考资料

主机BIOS开启虚拟化+VM workstation+centos(GNOME Desktop+NAT)

网络连接

假设教室的主机都在同一个网段 192.168.0.0,

  • 桥接模式:张三的虚拟机的ip也是192.168.0.xxx,占用网络ip,相当于新来了个主机,可以与张三互相通信,也可以和教室的其他主机互相通信,可以访问外网,缺点是可能会造成ip冲突
  • NAT(常用):李四的主机此时会出现两个ip,原有ip 192.168.0.50 和新ip 192.168.100.4,两个不在同一个网段,而虚拟机的ip是 192.168.100.5,虚拟机可以和李四的主机通过局域网 192.168.100.0 互相通信,虚拟机也可以和李四的其他虚拟机互相通信,也可以借助李四的主机访问到其他主机,可以上外网,但是其他主机无法访问到李四的虚拟机。不过可以使用端口转发功能实现其他主机访问李四的虚拟机。
  • 仅主机:虚拟机是一个独立的主机,只能与主机相互通信,无法与其他主机通信,也无法上网。可以通过网卡共享实现上网。

网络连接测试:

因为主机是直接连接在255的网络上,所以无法测试虚拟机与局域网内的其他主机的通信情况(ping)。

VM安装之后宿主机自动配置网络 V1:192.168.176.1, V8:192.168.44.1

算了,还是没折腾明白,以后有机会再说吧。

分区

  • /boot: 200M,linux启动文件,ext4
  • /
  • swap:2048M,内存的1.5倍,ext4

win和虚拟机的复制粘贴命令,共享文件夹: vmtools, /mnt/

linux一切皆为文件

Xshell: 远程登录软件 XFTP5:远程上传下载文件

实操篇

vim

命令 操作
yy 复制当前行
5yy 复制当前行的向下5行
p 粘贴
dd 删除当前行
5dd 删除当前行的向下5行
/hhh 查找hhh
n 查找下一个
:set nu 设置行号
:set nonu 取消行号
gg 首行
5gg 第5行
G 末行
20+shift+g 第20行

关机

shutdown:

  • shutdown -h now: 立即关机
  • shutdown -h 1: 1分钟后关机
  • shutdown -r now: 立即重启

halt: 关机
reboot: 重启
sync: 内存数据同步到磁盘

应该先执行 sync,再关机

logout:注销用户,在运行级别3下有效,在用户界面无效

logout: 只能在非用户界面的登录的shell使用,
exit:可以用于脚本并返回信息,可以在套层shell中退出当前shell,可以在切换过用户的情况下使用

用户管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 用户管理
useradd [] 用户名
useradd tjj
useradd -d /home/tiger zf
passwd zf # 指定或者修改密码
userdel zf # 保留/HOME_NAME目录
userdel -r zf # 删除/HOME_NAME目录
usermod -d /usr/newfolder -u uid username # 修改用户目录

id root
su zf # 只是切换用户,shell环境还是之前用户的shell,只能用exit退出
su - zf # 用户和shell都一起切换,可以用logout, exit退出
# su, su - : echo $PATH, pwd 都不一样
whoami

# 组的管理
groupadd wudang
groupdel wudang
useradd -g wudang zwj
usermod -g shaolin zwj

# 相关文件
/etc/passwd # 用户信息
/etc/group # 组信息
/etc/shadow # 密码等信息

实用指令

运行级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 指定运行级别
# 常用3和5
0: 关机
1: 单用户,找回丢失密码
2: 多用户无网络服务
3: 多用户有网络服务
4: 系统未实用保留给用户
5: 图形界面
6: 系统重启
/etc/inittab # 运行级别配置文件
init 2 # 切换到运行级别
# centos7 使用systemctl代替init
systemctl get-default
systemctl set-default multi-user.target
systemctl isolate multi-user.target
systemctl isolate graphical.target
runlevel
# 找回/修改root密码
# 进入单用户模式, centos6 和 7 有点区别
# https://www.cnblogs.com/jsjrj01/p/10301603.html

帮助指令

1
2
3
man ls
help cd
ls --help

文件目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pwd
mkdir -p /home/tjj/animal/dog
rmdir # 删除空目录
rm -rf # 非空目录
touch test1.txt test2.txt # 创建空文件
cp aaa.txt ./bbb/ # bbb/aaa.txt
cp aaa.txt ./bbb/bbb.txt # bbb/bbb.txt
cp -r bbb/ ccc/ # ccc/bbb/bbb.txt
cp -r bbb/ ccc/ddd # ccc/ddd/bbb.txt
cp -r bbb/. ccc/ # 文件夹下的所有文件复制到另一个文件夹 ccc/aaa.txt ccc/bbb.txt
cp -r bbb/* ccc/ # 同上,文件夹下的所有文件复制到另一个文件夹
mv oldName newName # 重命名,需要oldName和newName在同一个文件夹
mv aaa.txt ./bbb/bbb.txt # 移动的同时重命名,./bbb 存在
mv aaa.txt ./bbb/ # bbb存在,移动
cat -n /etc/profile | more # 空格,enter
more /etc/profile # 空格,enter
less /etc/profile # 只加载需要显示的内容,对于大型文件有效率,空格,enter
less /etc/profile , /hhh # 查找

重定向

1
2
>  # 输出重定向,覆盖写,文件可不存在
>> # 输出重定向,追加

echo head tail

1
2
3
4
5
6
7
echo $PATH
echo "hello"
head /etc/profile # 查看文件的开头部分内容
head -n 5 /etc/profile
tail /etc/profile # 查看文件的尾部内容
tail -n 5 /etc/profile
tail -f log.txt # 实时追踪文件的更新

ln history

1
2
3
4
5
ln -s /root/ /home/tjj/linkToRoot # 软连接
rm -rf /home/tjj/linkToRoot # 不能写成 /home/tjj/linkToRoot/
history
history 10 # 最近的10条指令
!178 # 执行编号是178的指令

时间日期

1
2
3
4
5
6
date # 显示日期
date "+%Y %m %d %H:%M:%S" # 显示日期,+不能省略
date -s "2019-11-11 12:23:34" # 设置系统时间

cal # 日历
cal 2020 # 显示2020年的日历

搜索查找类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
find [搜索范围] [选项]
find /home -name hello.txt # 按名字搜索
find /home -user tjj # 按照拥有者查找
find / -size +20M # 查找大于20M的文件,20k, -20M(小于20M), 20M(等于20M)
find /home -name "*.txt" # \*.txt, m*.txt, "m*.txt"
find / -mtime n # n:(n+1)*24~n*24, -n:n*24~0, +n: ~(n+1)*24

updatedb # 第一次运行时需要建立 locate 数据库
locate hello.txt

grep [选项] 查找内容 源文件
grep -n yes hello.txt # 显示行号
grep -i yes hello.txt # 忽略大小写
cat hello.txt | grep -n yes

{ % assert_img find -mtime find.png % }

压缩和解压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gzip/gunzip
# gzip文件不能直接压缩目录,如果要压缩目录,需要先将目录打包成一个文件
gzip hello.txt # 压缩成.gz文件,并且压缩后不会保留原文件
gunzip hello.txt.gz # 解压
gzip hello1.txt hello2.txt # 压缩成 hello1.txt.gz hello2.txt.gz
gzip -c hello.txt > hhh.gz # 保留源文件,并对压缩后的文件重命名
ls -l | gzip > testgzip.gz # 对终端输出的内容压缩并重定向到文件中,不确定tar是否可以做到

zip/unzip
zip -r mypackage.zip /home/tjj/ # 递归压缩
unzip -d /opt/tmp/ mypackage.zip # 指定解压后的文件目录

tar # .tar.gz
tar -zcvf a.tar.gz a1.txt a2.txt # 将a1.txt和a2.txt压缩到一个压缩包,a.tar.gz
tar -zcvf a.tar.gz /home/tjj/ # 压缩文件夹
tar -zxvf a.tar.gz #
tar -zxvf a.tar.gz -C /opt/ # 解压到/opt下

组管理和权限管理

文件: 所有人,所有组,其他组
所有人的组和所有组可以不一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
ls -ahl ok.txt
groupadd police
useradd -g police tom
passwd tom
su tom
touch ok.txt
[tom@localhost ~]$ ls -hl
total 0
-rw-r--r--. 1 tom police 0 Dec 12 21:37 ok.txt

chown tjj ok.txt # 修改文件所有人
[root@localhost tom]# chown tjj ok.txt
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tjj police 0 Dec 12 21:37 ok.txt # 组没有发生变化

chown tom:police ok.txt # 同时修改文件的所有人和所有者
chown -R tom:police test1/ # 递归修改目录及其所有子目录的所有人和所有者

chgrp shaolin ok.txt # 只修改所在组
chgrp -R shaolin test2/ # 递归所有目录修改所在组
[root@localhost tom]# chgrp shaolin ok.txt
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tjj shaolin 0 Dec 12 21:37 ok.txt

usermod -g 组名 用户名 # 修改用户所在组

# 情况一:建立test1.txt,默认所有人和所有组,当所有人所在组发生改变时,文件的所有组也发生改变
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom police 0 Dec 12 21:47 test1.txt
[root@localhost tom]# usermod -g shaolin tom
[root@localhost tom]# id tom
uid=1006(tom) gid=1006(shaolin) groups=1006(shaolin)
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom shaolin 0 Dec 12 21:47 test1.txt

# 情况二:建立test1.txt,对文件所在组发生改变后,当所有人所在组发生改变时,文件的所在组不发生改变
[root@localhost tom]# chgrp shaolin test1.txt
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom shaolin 0 Dec 12 21:55 test1.txt
[root@localhost tom]# usermod -g test1 tom
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom shaolin 0 Dec 12 21:55 test1.txt
[root@localhost tom]# id tom
uid=1006(tom) gid=1001(test1) groups=1001(test1)

# 情况三:修改所有人的所在组和文件的所有组一致后,再修改所有人的所在组就会改变文件的所在组
[root@localhost tom]# usermod -g shaolin tom
[root@localhost tom]# id tom
uid=1006(tom) gid=1006(shaolin) groups=1006(shaolin)
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom shaolin 0 Dec 12 21:55 test1.txt
[root@localhost tom]# usermod -g test1 tom
[root@localhost tom]# id tom
uid=1006(tom) gid=1001(test1) groups=1001(test1)
[root@localhost tom]# ls -l
total 0
-rw-r--r--. 1 tom test1 0 Dec 12 21:55 test1.txt

权限

文件和目录的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@localhost tjj]# ls -l
total 64344
-rw-rw-r--. 1 tjj tjj 0 Dec 12 20:56 a1.txt
drwxrwxr-x. 4 tjj tjj 28 Dec 12 21:01 animal
drwxr-xr-x. 2 tjj tjj 6 Dec 9 16:04 Music
drwxr-xr-x. 2 tjj tjj 6 Dec 9 16:04 Pictures
drwxr-xr-x. 2 tjj tjj 6 Dec 9 16:04 Public
drwxr-xr-x. 2 tjj tjj 6 Dec 9 16:04 Templates
drwxr-xr-x. 2 tjj tjj 6 Dec 9 16:04 Videos

# 文件类型
- # 普通文件
d # 目录
l # 软连接
c # 字符设备,键盘,鼠标等
b # 块文件,硬盘等

1 # 文件:硬链接 或者 目录: 子目录的个数

7 # 文件内的字符个数+1 '\0'
4096 # 目录的大小:4096,这里与老师讲的不一致。一种解释是块的大小是4KB

Dec 12 21:55 # 最后修改时间

## rwx 详解
# 文件
# r=4, w=2, x=1
r # 读
w # 写,可以修改文件内的内容,对文件重命名
x # 可执行
# 目录
r # 读,ls
w # 写,可以在目录内创建、删除,对目录重命名
x # 可以进入,cd

权限管理

1
2
3
4
5
6
7
chmod # 修改文件或者目录权限
+ - = # 变更权限
u: 所有者 g: 所在组 o: 其他人 a: 所有人
chmod u=rwx,g=rx,o=x 文件目录名
chmod o+w 文件目录名
chmod a-x 文件目录名
chmod 751 文件目录名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 权限实践-警察土匪游戏
# police: jack, jerry; bandit: xh, xq
groupadd police
groupadd bandit
useradd -g police jack
passwd jack
useradd -g police jerry
passwd jerry
useradd -g bandit xh
passwd xh
useradd -g bandit xq
passwd xq
# jack 创建一个文件,自己可以读写,本组人可以读,其他人没有任何权限
touch test1.txt
chmod 641 test1.txt
# jack 修改文件权限,本组人可以读写,其他人可以读
chmod g=rw,o=r test1.txt
# xh 投靠警察,看看是否可以读写
usermod -g police xh
id xh
chmod g=x test1.txt # x 可以保证xh cd jack, 读写test1.txt,但是不能使用ls
logout # xh, 重新登录刷新权限

crond 任务调度

定时运行特定的命令或者脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 安装
yum -y install vixie-cron
yum -y install crontabs
# 启动
systemctl start crond.service
systemctl status crond.service
# 使用
crontab -e
*/1 * * * * ls -l /etc/ > /tmp/to.txt
# 五个*分别表示:
# 一小时中的第几分钟: 0-59
# 一天的第几个小时 : 0-23
# 一个月的第几天 : 1-31
# 一年的第几个月 : 1-12
# 一周的第几周 : 0-7 (0表示星期日)
* 23-7/1 1,3 * * # 每个月的第1,3天的晚上11点到早上7点之间,每隔一小时

crontab -l # 查看定时任务
crontab -r # 删除所有定时任务
systemctl crond restart # 重启任务调度

# 案例1:每隔1分钟,将当前日期信息追加到 /tmp/mydate 中
# 编写脚本
vim /home/mytask1.sh
data >> /tmp/mydate
chmod u+x mytask1.sh
# 定时运行
crontab -e
*/1 * * * * /home/mytask1.sh

# 多个调度任务
crontab -e
*/1 * * * * /home/mytask1.sh
0 2 * * * /home/mytask2.sh

磁盘分区、挂载、查询

磁盘分区、挂载

分区方式:mbr分区, gpt分区

linux 分区:一个分区与一个目录对应。

IDE硬盘:hdx~
SCSI硬盘:sdx~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看分区与挂载情况
lsblk
lsblk -f
fdisk -l

# 挂载硬盘
# 1.增加硬盘
# 2.分区
fdisk /dev/sdb
Command (m for help): m
Command (m for help): n
p
1
enter
enter
w

lsblk
# 3.格式化
mkfs -t ext4 /dev/sdb1
# 4.临时挂载,挂载点下原有文件在挂载完成后会被临时隐藏
mkdir /home/newdisk
mount /dev/sdb1/newdisk
umount /dev/sdb1 # 卸载
umount /home/newdisk
# 5.设置永久挂载, 临时挂载在重启后会失效
vi /etc/fstab

/dev/sdb1 /home/newdisk ext4 defaults 0 0

mount -a # 刷新

磁盘查询指令

1
2
3
4
5
6
7
8
9
10
11
df -lh # 系统整体磁盘使用情况
du -ach --max-depth=1 /opt # 目录磁盘使用情况

# 统计/home下的文件个数
ls -l /home | grep "^-" | wc -l
# 统计/home下的目录个数
ls -l /home | grep "^d" | wc -l
# 统计/home下的文件个数,包括子文件夹中的
ls -lR /home | grep "^-" | wc -l
# tree
tree /home

网络配置

宿主机:
真实网卡: 192.168.2.125
vmnet8 : 192.128.184.1
虚拟机 : 192.168.184.125
小王 : 192.168.2.111

虚拟机:
子网IP: 192.128.184.0
网关: 192.128.184.2

1
2
3
4
5
6
7
8
9
10
11
# 指定固定ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 网卡配置文件

BOOTPROTO="static"
IPADDR="192.168.44.128"
NETMASK="255.255.255.0"
GATEWAY="192.168.44.2"
DNS1="8.8.8.8"
ONBOOT="yes"

systemctl restart network

进程管理

linux中,每个执行的程序都称为一个进程,每个进程分配一个ID号
每个进程,都会对应一个父进程,每个父进程可以复制多个子进程
每个进程以两种方式存在:前台和后台
一般系统的服务都是以后台进程的形式存在,监听某个端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 查看进程
ps -aux
ps -aux | more
ps -aux | grep sshd

# 查看父进程
ps -ef
ps -ef | grep sshd

# 终止进程
kill 进程号
kill -9 进程号

killall 进程名(支持通配符)
killall gedit
killall 父进程名
ps -aux | grep bash # 终端进程 /bin/bash

# 查看进程
pstree
pstree -p # 显示 PID
pstree -u # 显示用户

# 服务管理
systemctl start stop restart reload status
systemctl enable disable # 开机启动、禁用
systemctl start firewalld

# firewalld 防火墙
firewall-cmd--zone=public --list-ports # 查看打开的端口
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开端口
firewall-cmd --reload # 更新

# 宿主机执行 telnet 查看端口是否可以访问
telnet 192.168.44.130 22

# 列出所有服务
setup
systemctl list-units --type=service

# 查看或者修改服务在不同运行级别的自启动情况
0: 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
1: 单用户工作状态,root权限,用于系统维护,禁止远程登录
2: 多用户无网络状态
3: 多用户有网络状态
4: 保留
5: 图形GUI
6: 系统正常关闭并重启,系统默认运行级别不能设为6,否则不能正常启动

sshd:
在运行级别为0时,是否自启动
在运行级别为1时,是否自启动
在运行级别为2时,是否自启动
......

systemctl list-units --type=service
systemctl list-unit-files --type=service sshd.service

# 动态监控进程
top # 每隔3s自动刷新
# 交互式操作
u # 回车 再输入要查询的 user tjj 回车
k # 回车 再输入要杀死的进程 111
P # 按照cpu排序
N # 按照PID排序
# 选项
top -d 1 # 1s刷新

# 监控网络端口状态
netstat
netstat -anp # an 按照一定顺序排列,p显示哪个进程在调用
netstat -anp | grep sshd
telnet ip port # 测试端口是否开启

rpm 与 yum

rpm 是软件包管理器。用于互联网下载包的打包及安装工具,包含在某些Linux分发版中。生成具有 .RPM 扩展名的文件。与dpkg类似。

yum 是软件包管理器的前端工具。基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,并且可以自动处理依赖性关系,一次安装所有依赖的软件包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rpm -qa | grep firefox
rpm -q firefox
firefox-52.7.0-1.el7.centos.x86_64
rpm -qi firefox # 信息更详细
rpm -ql firefox # 安装文件以及安装位置
rpm -qf /etc/passwd # 文件属于哪个包
setup-2.8.71-9.el7.noarch

rpm -e firefox # 卸载软件
rpm -e --nodeps firefox # 强制删除,不推荐
rpm -ivh firefoxxxx.rpm # 安装软件

# yum
yum list | grep xxx # 查询服务器上的包
yum install xxx

JavaEE定制篇

jdk+tomcat+eclipse+mysql

JDK安装与配置

jdk-8u191-linux-x64.tar.gz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
tar -zxvf jdk-8u191-linux-x64.tar.gz
# jdk1.8.0_191
# 配置环境变量
vim /etc/profile

JAVA_HOME=/opt/jdk1.8.0_191
PATH=/opt/jdk1.8.0_191/bin:$PATH
export JAVA_HOME PATH

# 环境变量生效
source /etc/profile # or
logout

java
javac

# 测试
vim Hello.javaf

public class Hello{
public static void main(String[] args){
System.out.println("hello");
}
}

javac Hello.java # 编译
# Hello.class
java Hello
# hello

tomcat

apache-tomcat-7.0.99.tar.gz

1
2
3
4
5
6
7
8
tar -zxvf apache-tomcat-7.0.99.tar.gz
cd apache-tomcat-7.0.99/bin/
./startup.sh # 使用linux本地的浏览器可以访问到
# 开放 8080 端口,使宿主机可以通过浏览器访问
telnet 192.168.44.130 8080
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
192.168.44.130:8080 # 宿主机也可以正常访问

Eclipse

eclipse-jee-2019-12-M3-linux-gtk-x86_64.tar.gz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tar -zxvf eclipse-jee-2019-12-M3-linux-gtk-x86_64.tar.gz
cd eclipse
./eclipse # or 创建快捷方式

new Dynamic Web Project
runtime: tomcat7.0 jdk1.8.0_191
Dynamic web module version: 2.5

在工程的 WebContent 中 new jsp 文件 hello.jsp
<body>
<h1> hello from Linux</h1>
</body>
run as on server

http://localhost:8080/demo/hello.jsp
192.168.44.130:8080/demo/hello.jsp

mysql

mysql-5.6.40.tar.gz

https://www.cnblogs.com/shijiaqi1066/p/4311061.html
从源码编译安装 mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 卸载旧软件
rpm -qa | grep mysql
rpm -e xxx
rpm -e --nodeps xxx # 强制删除

# 安装编译源码需要的包
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
tar -zxvf /opt/mysql-5.6.40.tar.gz
cd /opt/mysql-5.6.40/
# 编译
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENHINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \

make && make install

# 增加用户mysql和组mysql
cat /etc/passwd | grep mysql
cat /etc/group | grep mysql
groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql

# mysql 初始化配置,生成my.cnf
cd /usr/local/mysql
# tips: 启动mysql服务时,会按照一定顺序搜索my.cnf,先在/etc目录查找,找不到时会搜索 "$basedir/my.cnf",
# 即 "/usr/local/mysql/my.cnf",这是新版 MySQL 的配置文件默认路径。因此,需要将 /etc 下的my.cnf重命名为my.cnf.bak,
# 避免该文件对MySQL的干扰。
scripts/mysql_install_db --basedir=/usr/local/mysql --user=mysql --datadir=/usr/local/mysql/data
# 但是打开 my.cnf, 这几项都是空的,启动服务之后,这几项又是有的,不太懂
mv /etc/my.cnf /etc/my.cnf.bak

# 启动 MySQL
cd /usr/local/mysql
# 将MySQL设置为系统服务并启动服务
cp support-files/mysql.server /etc/init.d/mysql
mkdir /var/lib/
systemctl enable mysql # 自启没有成功
systemctl start mysql
netstat -anp | grep mysql # 3306
cd /usr/local/mysql/bin
# 使用
./mysql -u root
mysql>set password = password('root');
mysql>quit
./mysql -u root -p
mysql>show databases;
mysql> create database atguigu;
mysql> use atguigu;
mysql> create table user(id int, name varchar(32));
mysql> insert into user value(100, 'tom');
mysql> select * from user;

tips: service == /etc/init.d/xxx == systemctl

大数据定制篇

Shell

shell入门

应用程序—>shell—>Linux 内核—>硬件

脚本格式:

  1. “#!/bin/bash” 开头
  2. 脚本有可执行权限
  3. shell 没有严格的缩进,缩进只是为了更好的可读性
1
2
3
4
5
6
7
8
9
10
11
12
vim myShell.sh

#!/bin/bash
echo "hello, world!"

# 执行方式1:赋予可执行权限,用相对路径或者绝对路径执行,. 执行
chmod a+x myShell.sh
./myShell.sh
/root/shell/myShell.sh
# 执行方式2:不需要可执行权限,用bash执行
sh ./myShell.sh
bash ./myShell.sh

tips: ./xx.sh == sh xx.sh

shell变量

shell变量分为系统变量($HOME, $PWD, $USER等等)和用户变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
vim myShell.sh

#!/bin/bash
echo "PATH=$PATH"
echo "USER=$USER"

chmod a+x myShell.sh
./myShell.sh

# 显示环境变量
set

# 变量定义
a=100 # 定义
$a # 引用
${PATH} # 花括号引用,适用于变量名比较长的变量
unset a # 删除变量
readonly a=99 # 只读变量,不能被删除,不能被修改
export a # 变量提升为全局变量,可供其他shell使用

vim myShell.sh

#!/bin/bash
a=100 # a=b
echo "$a"
unset a
echo "$a"
readonly b=99
echo "$b"
b=98
echo "$b"
unset b
echo "$b"

变量定义的规则:

  1. 等号两侧不能有空格
  2. 变量名称习惯大写
1
2
3
4
5
6
7
8
9
# 命令返回值赋值给变量
A=`ls -l` # 反引号
A=$(ls -l)

# 单引号,变量不解析
echo '$PATH'
$PATH
echo "$PATH"
/usr/local...

shell 环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
export 变量名=变量值
source
echo $变量名

TOMCAT_HOME=/usr/local/tomcat
export TOMCAT_HOME
# or
export TOMCAT_HOME=/usr/local/tomcat

# 多行注释
:<<!
echo "hello"
!

shell 位置参数变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$n # n 为数字,$0表示命令本身,1-9表示第一到第九的九个参数,大于十的参数需要大括号引用,${10}
$* # 获取当前shell脚本所有传参的参数,不加引号和$@相同,视为独立字符串;如果给$*加上双引号,例如:“$*”,则表示将所有的参数视为单个字符串,相当于“$1 $2 $3”
$@ # 获取当前shell脚本所有传参的参数,不加引号和$*相同,视为独立字符串;如果给$@加上双引号,例如:“$@”,则表示将所有的参数视为独立字符串,相当于“$1“,”$2“,"$3"
$# # 统计参数个数

vi positionPara.sh

#!/bin/bash

echo "$0 $1 $2"
echo "$*"s
echo "$@"
echo "$#"

chmod a+x positionPara.sh
[root@localhost shell]# ./positionPara.sh 30 60
./positionPara.sh 30 60
30 60
30 60
2

#!/bin/bash

echo "$0 $1 $2"
for N in $*
do
echo $N
done
for N in $@
do
echo $N
done
for N in "$*"
do
echo $N
done
for N in "$@"
do
echo $N
done
echo "$*"
echo "$@"
echo "$#"

./positionPara.sh 30 60
# 不加双引号,视为单个字符
30
60
30
60
# 加双引号,$* 视为整体, $@视为单个字符
30 60
30
60
30 60
30 60
2

Shell 预定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$$ # 当前进程号 PID
$! # 后台运行的最后一个进程的进程号 PID
$? # 最后一次执行的命令的返回状态,0 表示正确执行,非 0 表示不正确执行

vim preVar.sh

#!/bin/bash
echo $$
./myShell.sh & # 后台执行
echo $!
echo $?

[root@localhost shell]# ./preVar.sh
122809
122810
0

Shell 运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$((表达式)) # 两个小括号
$[表达式] # 一个中括号,推荐使用
expr # 运算符两边有空格,反引号引用,\*

vim demo.sh

#!/bin/bash
echo $(((2+3)*4))
echo $[(2+3)*4]
TMP=`expr 2 + 3`
RES=`expr $TMP \* 4`
echo $RES
RES=`expr \( 2 + 3 \) \* 4`
echo $RES

20
20
20
20

Shell 判断语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[ condition ] # condition 前后都有空格,非空或者0返回true,空或者>1 返回false

[ guigu ] # 返回 true
[] # 返回false
[ condition ] && echo OK || echo notOK

# 主要判断条件
# 1. 整数比较
== # 字符串相等
-lt # 小于 less than
-le # less equal
-eq
-gt
-ge
-ne
# 2. 文件权限
-r # 可读 [ -r file ]
-w # 可写
-x # 可执行
# 3. 文件类型
-f # 文件存在并且是一个常规文件 [ -f file ]
-e # 文件存在
-d # 文件存在且是一个目录


[ 'ab'=='ab' ] && echo OK || echo notOK
[ 12 -lt 12 ] && echo OK || echo notOK

Shell 流程控制 if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# if
# 中括号和command之间需要有空格
# 第一种,注意分号
if [ command ];then
程序
elif [ command ];then
程序
else
程序
fi
# 第二种
if [ 条件判断句 ]
then
程序
elif [ 条件判断句 ]
程序
else
程序
fi
# testif.sh
vim testif.sh

#!/bin/bash

if [ $1 -ge 60 ]
then
echo "you are OK"
else
echo "you are not OK"
fi

chmod a+x testif.sh
./testif.sh 66

Shell 流程控制 case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
程序3
;;
esac

# testcase.sh
vim testcase.sh

#!/bin/bash

case $1 in
"1")
echo "1"
;;
"2")
echo "2"
;;
*)
echo "*"
;;
esac

bash testcase.sh 1

Shell 流程控制 for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 方式一
for var in 值1 值2 ...
do
程序
done
# 方式二:初始值;循环控制条件;变量变化 与C类似
for ((初始值;循环控制条件;变量变化))
do
程序
done

# 方式一:testfor1.sh
#!/bin/bash

for var in $@
do
echo $var
done

[root@localhost shell]# bash testfor1.sh 1 2 3
1
2
3

#!/bin/bash

for var in 1 2 3
do
echo $var
done

1
2
3

# 方式二:testfor2.sh
#!/bin/bash

SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM

5050

Shell 循环控制 while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while [ 条件判断句 ]
do
程序
done

# testwhile.sh
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM

bash testwhile.sh 10

Shell 读取控制台输入

1
2
3
4
5
6
7
8
9
10
11
12
13
read [选项](参数)
-p: 指定读取数值时的提示符
-t: 指定读取数值时等待的时间
参数: 指定读取数值的变量名

# testread.sh
#!/bin/bash

read -p "num1:" NUM1
echo $NUM1

read -p "num2:" -t 10 NUM2
echo $NUM2

Shell 系统函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. basename:用于返回完整路径,常用于获取文件名
basename [pathname] [suffix]

[root@localhost shell]# basename /home/tjj/bbb.txt
bbb.txt
[root@localhost shell]# basename /home/tjj/bbb.txt .txt
bbb
[root@localhost shell]# basename /home/tjj/bbb.txt .sh
bbb.txt

# 2. dirname: 返回路径部分

[root@localhost shell]# dirname /home/tjj/bbb.txt
/home/tjj

Shell 自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# [] 表示可选,function和()保留一个或者两个都行
[function] funname [()]
{
# 函数内部的参数获取和shell的位置参数一致
# return 0-255
Action
[return int]
}

funname 参数值

# testfun1.sh
#!/bin/bash

function getSum()
{
SUM=$[$n1+$n2]
echo $SUM
}

read -p "n1" n1
read -p "n2" n2
getSum $n1 $n2

# testfun2.sh
#!/bin/bash

function getSum()
{
SUM=$[$n1+$n2]
echo $SUM
}

read -p "n1" n1
read -p "n2" n2
getSum

# testfun3.sh
#!/bin/bash

function getSum()
{
SUM=$[$1+$2]
echo $SUM
}

read -p "n1" n1
read -p "n2" n2
getSum $n1 $n2

Shell 定时维护数据库

任务要求:

  1. 每天凌晨2:10备份数据库atguigu到/data/backup/db
  2. 备份开始和结束给出提示信息
  3. 备份后的文件以备份时间为文件名,打包成 .tar.gz 格式
  4. 备份的同时检查是否有10天前的数据库文件,如果有,将其删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd /usr/sbin
vim mysql_db_backup.sh

#!/bin/bash

BACKUP=/data/backup/db
DATETIME=$(date "+%Y_%m_%d_%H%M%S")
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p $BACKUP/$DATETIME
echo "===========backup begin========="
echo "the filepath is $BACKUP/$DATETIME.tar.gz"

HOST=localhost
DB_USER=root
DB_PWD=root
DATABASE=atguigu
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
rm -rf $BACKUP/$DATETIME

find -mtime +10 -name ".tar.gz" -exec rm -rf '{}' \;
echo "=============backup end============"

# 定时调度
crontab -e
10 2 * * * /usr/sbin/mysql_db_backup.sh

ubuntu

1
2
3
4
5
6
7
8
9
https://mirrors.tuna.tsinghua.edu.cn/
/etc/apt/sources.list
apt-get update # 更新源 /etc/apt/sources.list
apt-get upgrade # 更新软件
apt-get install\remove
apt-cache show package # 获取包的信息
apt-get source package # 获取包的源代码
# sudo 重定向
sudo sh -c "echo '' > sources.list"