20210206-1 Linux基础与应用(上)
一、安装与配置
千万不要点击 “我已复制该虚拟机”,会引起MAC地址的冲突,因为每一台linux服务器都有一个MAC地址,如果复制,MAC地址也会被拷贝
可以通过Xshell 进行远程连接
node1 node2 node3 在以后做 大数据开发中可以作为三个hadoop节点
现在需要打开 node3 后续会安装 docker应用
为node3设置ip,选择网卡时,可以直接按 Tab 键,自动补全存在的网卡
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=dhcp 意思是计算机启动时,分配ip 是动态分配,dhcp指动态分配
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# BOOTPROTO=dhcp
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=7bfe3a1c-3e6c-476c-bf7e-4be727e6602c
DEVICE=ens33
ONBOOT=yes
DNS1=192.168.56.2
IPADDR=192.168.56.130
GATEWAY=192.168.56.2
Ip地址每台不同,DNS1和Gateway node1 node2 node3和CentOS 6这些台都是相同的
ip地址改完后,需要输入以下命令
[root@localhost ~]# service network restart
就会把修改的配置重新加载,才能成功
如果想修改主机名
[root@localhost ~]# vi /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=node3
[root@localhost ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
:1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.130 node3
这样以后就可以不用通过ip访问,而是可以直接通过主机名访问了
安装操作系统
● 设置IP:
● VM:编辑>虚拟网络编辑器
● vi/etc/sysconfig/network-scripts/ifcfg-eth0
● 删除UUID和MAC地址
● ONBOOT=yes
● BOOTPROTO=static
● IPADDR=172.16.233.131
● NETMASK-255.255.255.0
● GATEWAY=172.16.233.2
● DNS1=172.16.233.2
● rm-fr/etc/udev/rules.d/70-persistent-net.rules
拷贝虚拟机,MAC地址会改变,刚刚选择已移动,所以vmware自动解决了这个问题,如果是 老版本的vmware或者不小心选择我已复制,则 需要删除规则,使它失效,目前是没有必要用 rm-fr/etc/udev/rules.d/70-persistent-net.rules 处理的
● VM:
● 默认维护,每一台克隆,或新建的虚拟机,MAC地址不重复
● 如果虚拟机保留/etc/udev/rules.d/70-persistent-net.rrules这个文件,在通过该虚拟机克隆的时候:
● 1.文件被带到新的虚拟机中
● 2.vm变更了新的虚拟机的mac地址
● SO:新机器不能使用eth0接口
● 你配置的/etc/sysconfig/network-scripts/ifcfg-eth0就不能应用
● 关闭防火墙&Selinux
● service iptables stop
● chkconfig iptables off
● vi/etc/selinux/config
● SELINUX=disabled
● 关机
● 拍摄快照
● 注意:日后,虚拟机一定要用快照克隆
二、Linux介绍
Linux概况
Linux简介
什么是Linux
简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品
内核
库:.so共享对象,windows:dll动态链接库,应用程序
Unix是需要付费的
linux命令分为内部命令和外部命令 ,内部命令都在kernel内核中
Linux核心
● LINUX的内核:内核是系统的核心,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。
程序启动时,首先主板有一个Bios系统,上面有一小块内存,会把kernel加载进去,kernel在通过各种目录调用linux的功能,比如bash人机交互界面等;把操作系统需要的文件一个又一个的加载到内存里,成为我们的操作系统,操作系统也是一个程序,只是这些程序全都运行在内存里
Win10需要更多的内存运行,所以比win7更吃内存
● LINUX SHELL:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
● LINUX文件系统:Linux文件系统是文件存放在磁盘等存储设备上的组织方法。Linux能支持多种目前浒的文件系统,如EXT2、EXT3、FAT、VFAT、ISO9660、NFS、SMB等。
● LINUX应用系统:标准的Linux系统都有一整套称为应用程序的程序集,包括文本编辑器、编程语言、XWindow、办公套件、Internet工具、数据库等。
三、Linux简单命令
简单命令
● type:命令类型
● 外部命令 & 内部命令
[root@localhost ~]# type ifconfig
ifconfig 是 /usr/sbin/ifconfig
[root@localhost ~]# cd /sbin
[root@localhost sbin]# ll -l | grep ifconfig
-rwxr-xr-x. 1 root root 82000 8月 3 2017 ifconfig
-rwxr-xr-x. 1 root root 3104 6月 10 2014 pifconfig
type+命令 后,如果返回一个路径,那么这个命令就是外部命令,是通过调用文件系统中的命令启动的
内部命令都是在linux内核里的,比如
[root@localhost sbin]# type echo
echo 是 shell 内嵌
● help:内部命令帮助
● help:内部命令清单,附带语法格式,描述
● help 具体内部命令
通常用于内部命令
● man:帮助手册manual
● yum install man man-pages -y
通常用于外部命令,man也是一个操作文档软件,可以通过 yum install man的方式安装
用type 区分外部命令和内部命令
● whereis:定位命令位置,定位外包命令。
[root@localhost ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@localhost ~]# whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
bash是一个shell程序,一个bash文件可以读取标准输入流,或者从脚本文件进行读取
● file:文件类型
[root@localhost ~]# file /sbin/ifconfig
/sbin/ifconfig: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=dff548da1b4ad9ae2afe44c9ee33c2365a7c5f8f, stripped
ELF相当于windows中的可执行文件
bash可以理解为脚本解释器,相当于linux的脚本解释器,可以把命令写到文件里,通过bash执行
● echo:打印到标准输出
[root@localhost ~]# echo "hello"
hello
● $PATH:环境变量:路径
环境变量是系统中的整体变量,可以理解为全局变量,所有程序,包括shell程序
这里是linux的全局变量,所以程序只要进入linux系统,都能够定义它
[root@localhost ~]# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
sbin在全局变量中,所以即使不在当前文件夹,ifconfig也可以执行
就是通过环境变量找到文件夹的
linux系统以冒号进行隔离
[root@localhost ~]# echo $aaa
[root@localhost ~]# aaa=66
[root@localhost ~]# echo $aaa
66
这个叫shell变量,输入之后才可以有,但是环境变量相当于java中的全局变量
● $LANG
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
$LANG 也是一个环境变量,表示系统是英(中)文的,同时支持utf-8
linux内核通过shell程序(壳)调用bash解释器,bash相当于脚本解释器,会解释用户输入的命令,执行后会在path中给定的目录从左向右进行寻找
外部程序ifconfig能够执行起来就是通过bash解释器执行的程序
空白符用于切割不同的命令
[root@localhost ~]# type yum
yum 已被哈希 (/usr/bin/yum)
所以yum 也是一个外部命令,作用是安装
[root@localhost ~]# file /usr/bin/yum
/usr/bin/yum: Python script, ASCII text executable
可以看出这是一段python的脚本,进入目录查看一下
[root@localhost ~]# vi /usr/bin/yum
#!/usr/bin/python 注入了解释器,#!/,代表注入解释器,以下的程序都用解释器执行
import sys
try:
import yum
except ImportError:
print >> sys.stderr, """\
如果是bash解释器执行,同样的是 #!/
[root@localhost ~]# yum install man
实际上是调用python文件/usr/bin/yum脚本去指定做相应操作
● type yum
● file /usr/bin/yum
● /usr/bin/yum:a /usr/bin/python script text executable
● vi /usr/bin/yum
● #!/usr/bin/python
● ps -fe进程列表
● type ps
● man ps
ps就相当于任务管理器,PID就相当于windows中的进程
[root@localhost ~]# ps
PID TTY TIME CMD
57179 pts/2 00:00:00 bash
58836 pts/2 00:00:00 ps
如果想查看更多的信息
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:45 ? 00:00:08 /usr/lib/systemd/systemd --switch
root 2 0 0 08:45 ? 00:00:00 [kthreadd]
……
……
[root@localhost ~]# type ps
ps 已被哈希 (/usr/bin/ps)
ps也是一个外部命令,所以可以输入man ps查看
● echo
● type echo
● help echo
● echo hello
变量
● a=3
● echo $a
[root@localhost ~]# a=3
[root@localhost ~]# echo $a
3
[root@localhost ~]# echo $a=3
3=3
● b=(1,2,3)
● echo $b
[root@localhost ~]# b=(1,2,3)
[root@localhost ~]# echo $b
1,2,3
● b=(1 2 3)
● echo $b
● echo ${b[2]}
[root@localhost ~]# b=(1 2 3)
[root@localhost ~]# echo $b
1
[root@localhost ~]# echo $b[2]
1[2]
[root@localhost ~]# echo ${b[2]}
3
因为linux默认识别空格为分隔符,逗号是不行的。所以 b=(1 2 3)相当于输入了三个数,就是一个数组了,echo $b[2]的结果是1[2],相当于是把 1 和 [2]连接起来的,并不认为b[2]是一个数组,用大括号标注起来,相当于做一个转义,整个作为一个变量
linux是从左到右,一个一个解释的
● echo hello$agod
● echo hello${a}god
[root@localhost ~]# echo hello$agod
hello
[root@localhost ~]# echo $a
3
a有值,echo hello$agod 只打出了hello,因为把 agod整体当成了一个变量,但是agod是没有值得
[root@localhost ~]# echo hello${a}god
hello3god
${a}表示a是一个变量名传给$
● unset myurl
如果给一个变量赋值后,想要取消掉,unset系统中就没有这个变量了,可以通过这种方式取消变量
[root@localhost ~]# myurl=baidu
[root@localhost ~]# echo $myurl
baidu
[root@localhost ~]# unset myurl
[root@localhost ~]# echo $myurl
[root@localhost ~]#
● echo $$ 当前shell的PID
[root@localhost ~]# echo $$
57179 → 这是一个 PID,当前shell的PID
shell也是一个程序,shell连接kernel和应用程序
既然是程序,就有一个自己的PID
通过两个不同的shell,相当于 两个接入点访问,就会有两个PID
● ps -fe
● bash
● whereis bash
● /bin/bash
● shell脚本第一行的定义~!
shell脚本第一行,#和!的意义就相当于使用bin/bash去实现
● PATH:windows。linux:环境变量
● 记录查询执行命令所在的路径
● 分割:
● hash -r清除缓存
[root@localhost ~]# hash
命中 命令
3 /usr/bin/file
6 /usr/bin/ps
4 /usr/bin/whereis
2 /usr/bin/yum
1 /usr/bin/vi
2 /usr/bin/man
相当于把应用程序调到内存中
● shell:对于命令查找的方式,在PATH记录的目录中查找,缓存到内存hash中
这样下次不用从linux系统中查找,直接在hash缓存中查找
● man
● 1:用户命令(/bin,/usr/bin,/usr/local/bin)
● 2:系统调用
● 3:库用户
● 4:特殊文件(设备文件)
● 5:文件格式(配置文件的语法)
● 6:游戏
● 7:杂项(Miscellaneous)
● 8:管理命令(/sbin,/usr/sbin,//usr/local/sbin)
● shell,bash:程序
● /etc/profile是bash的配置文件
● source/etc/profile 相当于加载了配置文件,把更改的东西加载到上面
四、文件系统命令
文件系统命令
● 文件权限:9位,每3位一组,3组权限(U,G,0)每一组:rwx(读,写,执行),r--
U User G Group O Other
[root@localhost ~]
User是root 组也就是root组,Other是除了root以外的其他的任何用户
[root@localhost etc]# ls -l
总用量 1368
drwxr-xr-x. 3 root root 101 2月 4 06:01 abrt
-rw-r--r--. 1 root root 16 2月 4 06:12 adjtime
-rw-r--r--. 1 root root 1518 6月 7 2013 aliases
-rw-r--r--. 1 root root 12288 2月 4 06:27 aliases.db
drwxr-xr-x. 2 root root 51 2月 4 06:02 alsa
……
……
rw- 给当前用户 r-- 给group组 后面的r-- 是给其他用户的
-rw-r--r--. 1 root root 数字 1 1 1 2 代表被引用的次数,被软(硬)连接的次数
相当于一个文件建一个快捷方式
1 后面的两个root分别代表所属的用户和所属组
在往后是创建时间和文件名
● 文件硬链接的次数
● 文件的属主(owner)
● 文件的属组(group)
● 文件大小(size),单位是字节
● 时间戳(timestamp):最近一次被修改的时间
● 访问:access
● 修改:modify,文件内容发生了改变
● 改变:change,metadata,元数据
ls 查询,前面是d的为目录,前面是 -的为文件
● Filesystem Hierarchy Standard(文件系统层次化标准)
● /boot:系统启动相关的文件,如内核、initrd,以及grub(bootloader)
● /dev:设备文件
[root@node3 dev]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 7.5G 9.5G 45% /
……
/dev/sda1 1014M 157M 858M 16% /boot
/dev/sr0 4.2G 4.2G 0 100% /run/media/root/Cen
/dev/mapper/centos-root /dev/sda1 可以理解为分区的概念
设备文件就是指磁盘的设备文件
● /etc:配置文件
系统启动时会调用一些配置文件
● /home:用户的家目录,每一个用户的家目录通常默认为/home/USERNAME
除了root用户,root用户在root目录下;在home下可以创建多个用户
每个用户的文件夹都是隔离的,不同的用户之间不能访问
从root权限退到普通用户,不需要输入密码
[root@node3 ~]# su wm01
[wm01@node3 root]$ pwd
/root
[wm01@node3 root]$ cd ~
[wm01@node3 ~]$ pwd
/home/wm01
[wm01@node3 ~]$ cd ..
[wm01@node3 home]$ cd wm02
bash: cd: wm02: 权限不够
cd ~ 直接进入家目录,不同的用户是隔离开的
● /root:管理员的家目录;
● /lib:库文件
● /media:挂载点目录,移动设备
● /mnt:挂载点目录,额外的临时文件系统
● /opt:可选目录,第三方程序的安装目录
比如nginx可以安装在这里
● /proc:伪文件系统,内核映射文件
linux一切皆为文件,所以进程相关的文件都会在这里
[root@node3 ~]# cd /proc/$$ 进入当前进程
[root@node3 66448]# ls
attr cwd map_files oom_adj schedstat task
autogroup environ maps oom_score sessionid timers
cgroup fd mountinfo pagemap smaps wchan
……
[root@node3 66448]# cd fd
[root@node3 fd]# ls
0 1 2 255
0代表输入输出和错误
● /sys:伪文件系统,跟硬件设备相关的属性映射文件
● /tmp:临时文件,/var/tmp
● /var:可变化的文件 一般会把日志文件放在这里
● /bin:可执行文件,用户命令
● /sbin:管理命令
● df:显示磁盘使用情况
[root@node3 ~]# df -h 显示disk的分配情况
● du:显示文件系统使用情况
切换用户无需退出操作系统,可以用 su 进行切换,su代表switch user 切换用户
[root@node3 var]# du -h
h代表human,人类,就是human readable
s代表summary,总结
linux是多人共用的,磁盘越来越少的情况下,查看文件夹使用是否超量
就可以用 du -sh ./* 对当前目录所有文件进行总结查找
./代表当前目录,*代表所有的
[root@node3 var]# du -sh ./*
0 ./account
0 ./adm
3.3M ./cache
0 ./crash
8.0K ./db
0 ./empty
……
[root@node3 ~]# du -sh
4.2G .
[root@node3 ~]# cd /var
[root@node3 var]# du -sh
111M .
如果想查特定的文件夹,可以 du -sh /文件夹名
[root@node3 var]# du -sh /root
4.2G /root
[root@node3 var]# type du
du 已被哈希 (/usr/bin/du) 存在路径,所以 du 也是一个外部程序
● ls:显示目录
● cd:切换工作目录 Linux 的目录要加 / 直接跳是跳不过去的
[root@node3 ~]# cd /
[root@node3 /]# cd /etc/sysconfig/
[root@node3 sysconfig]# cd ..
[root@node3 etc]# cd - 如果不小心返回上层,可以用这种方式进入
/etc/sysconfig
[root@node3 sysconfig]# pwd
/etc/sysconfig
[root@node3 sysconfig]# cd ~ 回到家目录,root回到root,其余用户回到home
[root@node3 ~]# pwd
/root
[root@node3 ~]# cd /
[root@node3 /]# pwd
/
● pwd:显示当前工作目录
● mkdir:创建目录
在当前目录,深度创建目录;./代表当前目录
[root@node3 ~]# mkdir -p ./em/db/v8
也可以水平创建目录,可以用变量的方式实现
[root@node3 ~]# mkdir abc
[root@node3 ~]# mkdir ./abc/{x,y,z}dir
[root@node3 ~]# cd abc
[root@node3 abc]# ls
xdir ydir zdir
● rm:删除
● cp:拷贝
● mv:移动
● ln:链接
● stat:元数据
● touch
● mkdir:创建目录
● mkdir -p./a/b/c
● mkdir a/{1,2,3}dir
● rm:删除
● rm -f
● rm -rf /
-rf r recursive f force
-r 会出现交互式提示
-rf 强制删除,不会出现交互式提示
[root@localhost tmp]# rm profile
rm:是否删除普通文件 "profile"?y
● cp:拷贝
● cp/etc/{profile,inittab} ./
● cp -r./a./new
● cp -l cp-s
当前目录下的文件需要加 点. ./代表当前目录
[root@localhost etc]# cp ./profile /tmp
[root@localhost etc]# cd /tmp
[root@localhost tmp]# ls
profile
……
如果拷贝目录,需要加 -r,有一个循环的意思,目录下面还有目录;拷贝目录不需要加 ./
[root@localhost em]# cp -r nginx /tmp
[root@localhost em]# cd /tmp
[root@localhost tmp]# ls
nginx
……
● mv:移动
其实就是剪切的意思,移动经常有两个用途,改名或者移动到另一个文件夹
现在给nginx 改名
[root@localhost tmp]# mv nginx nginx1
[root@localhost tmp]# ls
nginx1
ssh-4Bij5yBn3SJl
……
把 nginx1 移动到别的目录
[root@localhost tmp]# mv nginx1 /opt/em
[root@localhost tmp]# cd /opt/em
[root@localhost em]# ls
em1 nginx nginx1
[root@localhost em]# rm -rf nginx1
[root@localhost em]# ls
em1 nginx
● ln:链接
● ln默认硬链接ln install.log wm.txt 就会生成 wm.txt文件
● ln -s 软链接 ln -s wm.txt bjwm.log
前面的数字 272678 等,叫做索引号,可以理解为在磁盘上的位置
数字相同可以 理解为两个引用变量指向同一个对象
-rw-r--r--. 2 后面的数字2 是同一个索引号被引用的次数
[root@localhost ~]# ll -li
总用量 8
33574978 -rw-------. 1 root root 1523 1月 25 15:15 anaconda-ks.cfg
33574987 -rw-r--r--. 1 root root 1571 1月 25 15:24 initial-setup-ks.cfg
……
[root@localhost ~]# ll -l
总用量 8
-rw-------. 1 root root 1523 1月 25 15:15 anaconda-ks.cfg
-rw-r--r--. 1 root root 1571 1月 25 15:24 initial-setup-ks.cfg
……
ll -li 可以把索引号显示出来
硬链接后,改变一个文件的内容,另一个文件的内容也会跟着改变,类似于快捷方式
不加参数项默认硬链接
加上 -s 是软链接,执行链接的文件就相当于执行很深层的文件;不需要在同一目录下操作
[root@localhost ~]# ln -s em.txt infmajem.log
[root@localhost ~]# ll -l
总用量 8
-rw-------. 1 root root 1523 1月 25 15:15 anaconda-ks.cfg
lrwxrwxrwx. 1 root root 6 2月 6 12:38 infmajem.log -> em.txt
-rw-r--r--. 1 root root 1571 1月 25 15:24 initial-setup-ks.cfg
……
硬链接各自是各自的,并没有谁指向谁,可以彼此理解为是一个变量,都指向统一的位置
软连接存在一种依赖关系,两个文件的索引号不同,相当于新生成了一个值,相当于创建一个快捷方式,如果把源删掉,快捷方式也会不好使
红色的意思是在报警找不到源,所以无法链接
• 元数据
元数据指描述文件或者数据的数据
• stat
stat用于描述 profile
[root@localhost ~]# cd /etc
[root@localhost etc]# stat profile
文件:"profile"
大小:1819 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:16787062 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:etc_t:s0
最近访问:2021-02-06 04:14:17.982017594 +0800
最近更改:2018-04-11 12:18:26.000000000 +0800
最近改动:2021-01-25 15:06:21.110000857 +0800
profile 是交互外壳启动时的配置文件,stat profile能够看到修改情况或者访问
开发的时候一般不会给root权限,只有系统管理员有系统root权限
|是管道相当于把文件通过管道传到另一个命令上,linux以空格切割命令
一个输入流通过管道输入到另一个命令上面
[root@localhost etc]# cat profile | more
• touch
可以创建文件
[root@localhost em]# ls
nginx
[root@localhost em]# touch test
[root@localhost em]# ls
nginx test
touch后面可以跟路径,能够指定路径创建
[root@localhost em]# touch /opt/shell/tst