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 

 

©著作权归作者所有:来自51CTO博客作者ATaburiss的原创作品,如需转载,请注明出处,否则将追究法律责任