一、准备工作:

       在安装和配置kvm虚拟机之前,首先确保kvm软件已经被正确安装,如果没有安装,请参考如下几步操作:  
       第一步:检查CPU是否支持vmx相关指令,如果执行结果中有vmx相关的关键字,则为支持;

    cat /proc/cpuinfo |grep vmx

       第二步:安装kvm配套软件

    yum install qemu-kvm libvirt virt-install bridge-utils -y

       第三步:检查kvm服务已经正常启动,如果执行结果有kvm_xxx(CPU系列)、kvm则说明kvm服务已经启动

    lsmod | grep kvm

           如果未启动,可通过如下命令启动:

    systemctl start libvirtd

          如果希望设置为开机自动启动,需通过如下命令添加到开机启动的服务列表中:

    systemctl enable libvirtd

          查看kvm服务状态,可通过如下命令:

    systemctl status libvirtd

          及如下命令查看是否开机启动

    systemctl is-enabled libvirtd

二、为虚拟机配置桥接网卡

         桥接网卡的配置参数的含义请参考链接

         本次配置的kvm虚拟机希望采用DHCP方式获取IP地址,为此先通过vi命令在/etc/sysconfig/network-scripts下创建桥接网卡的配置文件ifcfg-br0:

   vi /etc/sysconfig/network-scripts/ifcfg-br0

        然后在ifcfg-br0文件中录入如下内容并保存后退出

  TYPE=Bridge  PROXY_METHOD=none  BROWSER_ONLY=no  BOOTPROTO=dhcp  DEFROUTE=yes  NAME=br0  DEVICE=br0  ONBOOT=yes  IPV6INIT=no
 

       之后,对br0绑定的物理网卡需要修改配置,本次绑定的是eno1网卡(注:不同环境下绑定哪个网卡根据机器的需求,CentOS7之前的网卡名通常为eth0、eth1这样的命名,单网卡的情况下是eth0),则修改eno1的配置文件:

vi /etc/sysconfig/network-scripts/ifcfg-eno1

       在其中追加一句BRIDGE=br0:

  TYPE=Ethernet  PROXY_METHOD=none  BROWSER_ONLY=no  BOOTPROTO=dhcp  DEFROUTE=yes  NAME=eno1  UUID=abeaaa94-9abc-43b8-9a15-5267f5cb2f87  DEVICE=eno1  ONBOOT=yes  IPV6INIT=no  BRIDGE=br0

      以上配置完成后,为了保证配置生效,应当通过以下命令重启网络服务:

systemctl restart network

      通过以下命令查看桥接状态

brctl show

三、开始安装虚拟机      

       假定所有的操作都在/var目录下,CentOS安装源为文件为/var/iso/CentOS-7-x86_64-DVD-1708.iso,虚拟机文件创建为/var/vms/centos_vm0/vm0.qcow2,网桥使用br0,相应的操作命令如下:

virt-install --virt-type=kvm --name=centos_vm0 --vcpus=2 --memory=1024 --location=/var/iso/CentOS-7-x86_64-DVD-1708.iso --disk path=/var/vms/centos_vm0/vm0.qcow2,size=64,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --force

       注:上述命令是在一条命令行中执行的;执行了安装后,如果遇到配置错误之类的意外退出,希望重新安装,可通过如下步骤:

              第一步:查看当前运行的虚拟机:

         virsh list --all

             第二步:关闭当前运行的虚拟机,假定虚拟机名为centos_vm0,则操作命令为:

         virsh shutdown centos_vm0

                     注:类似的命令格式,启动虚拟机的命令如:

            virsh start centos_vm0

                            强制关闭虚拟机:

            virsh destroy centos_vm0

                            设置开机启动虚拟机

            virsh autostart centos_vm0

              第三步:删除虚拟机:

            virsh undefine centos_vm0

              第四步:清除虚拟机文件

            rm /var/vms/centos_vm0/vm0.qcow2

     

       执行了virt-install安装上述命令后,系统开始安装,并之后进入如下界面时设置语言、时区、网络、管理员密码等:

================================================================================Installation 1) [x] Language settings                 2) [!] Time settings        (English (United States))                (Timezone is not set.)  3) [!] Installation source                4) [!] Software selection        (Processing...)                          (Processing...)  5) [!] Installation Destination           6) [x] Kdump        (No disks selected)                      (Kdump is enabled)  7) [ ] Network configuration              8) [!] Root password        (Not connected)                          (Password is not set.)  9) [!] User creation        (No user will be created)  Please make your choice from above ['q' to quit | 'b' to begin installation |  'r' to refresh]: [anaconda] 1:main* 2:shell  3:log  4:storage-lo> Switch tab: Alt+Tab | Help: F1

1、进入菜单2)Time settings后设置时区的步骤:

Time settingsTimezone: not setNTP servers:not configured 1)  Set timezone 2)  Configure NTP servers  Please make your choice from above ['q' to quit | 'c' to continue |

输入1后回车,进入如下菜单:

Available regions 1)  Europe                 6)  Pacific               10)  Arctic 2)  Asia                   7)  Australia             11)  US 3)  America                8)  Atlantic              12)  Etc 4)  Africa                 9)  Indian 5)  Antarctica

输入2后回车(选择了Asia),进入如下菜单:

6)  Aqtobe                 34)  Jerusalem             61)  Sakhalin 7)  Ashgabat              35)  Kabul                 62)  Samarkand 8)  Atyrau                36)  Kamchatka             63)  Seoul 9)  Baghdad               37)  Karachi               64)  Shanghai10)  Bahrain               38)  Kathmandu             65)  Singapore11)  Baku                  39)  Khandyga              66)  Srednekolymsk

输入64(选择了Shanghai),完成时区设置

2、进入菜单3) Installation source选择安装源

Choose an installation source type. 1)  CD/DVD 2)  local ISO file 3)  Network

输入2后回车(选择了local ISO file),完成安装源的选择

3、进入菜单4) Software selection选择需要安装的软件集

 1)  [ ] Minimal Install                 7)  [ ] Server with GUI 2)  [x] Compute Node                    8)  [ ] GNOME Desktop 3)  [ ] Infrastructure Server           9)  [ ] KDE Plasma Workspaces 4)  [ ] File and Print Server          10)  [ ] Development and Creative 5)  [ ] Basic Web Server                        Workstation 6)  [ ] Virtualization Host

例如选择2后回车(选择了Compute Node),完成软件集的选择

4、进入菜单5) Installation destination选择目标磁盘

Installation Destination[x] 1) : 64 GiB (vda)

输入c后回车,进入磁盘分区选择:

Autopartitioning Options[ ] 1) Replace Existing Linux system(s)[x] 2) Use All Space[ ] 3) Use Free Space

输入c后回车(选择了默认的User All Space),之后进入分区schema选择:

Partition Scheme Options[ ] 1) Standard Partition[ ] 2) Btrfs[x] 3) LVM[ ] 4) LVM Thin Provisioning

输入c后回车(选择了默认的LVM),完成磁盘的选择

5、进入菜单7) Network Configuration配置网络连接

Host name: localhost.localdomainCurrent host name: localhost 1)  Set host name 2)  Configure device eth0

输入1回车(选择了Set host name),然后输入根据提示新的host name,例如centos.vm0

Enter new value for 'Host name' and press entercentos.vm0

输入2回车(选择了Configure device eth0)

Device configuration 1) IPv4 address or "dhcp" for DHCP    dhcp  2) IPv4 netmask 3) IPv4 gateway  4) IPv6 address[/prefix] or "auto" for automatic, "dhcp" for DHCP, "ignore" to    turn off    auto  5) IPv6 default gateway  6) Nameservers (comma separated)  7) [ ] Connect automatically after reboot  8) [ ] Apply configuration in installer

输入1回车(选择了IPv4 address or "dhcp" for DHCP),然后根据提示输入IPv4地址或dhcp,本次用的是dhcp:

Enter new value for 'IPv4 address or "dhcp" for DHCP' and press enter

dhcp

输入7回车(选择了Connect automatically after reboot)

输入8回车(选择了Apply configuration in installer)

输入c回车完成网络配置,继续输入c回车直到回到主菜单

6、进入菜单8) Root password设置管理员密码

按照提示两次输入同样的密码即可,如果密码过于简单,系统会提示是否确认,输入yes回车即可

================================================================================Please select new root password. You will have to type it twice.Password:Password (confirm):================================================================================================================================================================QuestionThe password you have provided is weak: The password fails the dictionary check- it is too simplistic/systematic.Would you like to use it anyway?Please respond 'yes' or 'no': yes

7、进入菜单9) User creation创建一个用户,该步骤为可选,如需要,按照提示菜单输入用户名、密码即可,不再赘述:

以上步骤完成后,输入b并回车,开始安装(如遇到不能开始,返回菜单进入未设置的菜单输入c回车,再返回机箱输入b回车进行尝试);

Please make your choice from above ['q' to quit | 'b' to begin installation |  'r' to refresh]: b================================================================================================================================================================ProgressSetting up the installation environment.Creating disklabel on /dev/vda.Creating xfs on /dev/vda1.Creating lvmpv on /dev/vda2. . .

四、验证虚拟机的安装

虚拟机安装完后虚拟机将被自动启动,启动后进入虚拟机CentOS7,通过命令ifconfig检查网络是否OK:

[root@centos ~]# ifconfigeth0: flags=4163
  mtu 1500        inet 192.168.0.8  netmask 255.255.255.0  broadcast 192.168.0.255        inet6 fe80::d72c:1539:12b3:c85c  prefixlen 64  scopeid 0x20
        ether 52:54:00:e7:96:71  txqueuelen 1000  (Ethernet)        RX packets 57  bytes 6069 (5.9 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 48  bytes 4500 (4.3 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73
  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到,虚拟机已经通过dhcp获得了IP地址(示例中为192.168.0.8);

查看虚拟机的主机名,输入命令hostname即可:

hostname centos_vm2

如需要修改主机名,需在root下执行命令:

hostnamectl set-hostname centos_vm2

注:上例中centos_vm2是更改后的主机名

此时再切换到物理机(宿主机),通过命令netconfig可以看到br0工作OK:

hnl@bogon ~> ifconfigbr0: flags=4163
  mtu 1500        inet 192.168.0.7  netmask 255.255.255.0  broadcast 192.168.0.255        ether d0:50:99:c9:5e:ab  txqueuelen 1000  (Ethernet)        RX packets 22194  bytes 1116345 (1.0 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 36730  bytes 6433244 (6.1 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0eno1: flags=4163
  mtu 1500        ether d0:50:99:c9:5e:ab  txqueuelen 1000  (Ethernet)        RX packets 3133559  bytes 4700490944 (4.3 GiB)        RX errors 0  dropped 9  overruns 0  frame 0        TX packets 1384528  bytes 85544872 (81.5 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0        device memory 0xdf200000-df27ffffeno2: flags=4099
  mtu 1500        ether d0:50:99:c9:5e:ac  txqueuelen 1000  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0        device memory 0xdf100000-df17fffflo: flags=73
  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        loop  txqueuelen 1  (Local Loopback)        RX packets 392  bytes 34080 (33.2 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 392  bytes 34080 (33.2 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0virbr0: flags=4099
  mtu 1500        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255        ether 52:54:00:53:29:61  txqueuelen 1000  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0vnet0: flags=4163
  mtu 1500        ether fe:54:00:e7:96:71  txqueuelen 1000  (Ethernet)        RX packets 69  bytes 6198 (6.0 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 83  bytes 8795 (8.5 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到物理机的网桥br0的IP地址(示例中是192.168.0.7);

五、管理虚拟机

除了上述(三)中描述的管理命令外,如下命令也常用到:

     配置虚拟机为开机启动,以开机启动虚拟机centos_vm0为例:

virsh autostart centos_vm0

    登陆虚拟机centos_vm0的控制台:

virsh console centos_vm0

    之后输入用户名、密码完成登陆

六、网络TCP/IP优化

进行网络优化之前,需要先查看网络的工作配置,可通过ifconfig命令查看网口列表,如果是最小化安装,可能ifconfig命令还执行不了,此时需要执行如下命令安装网络工具:

yum install net-tools

虚拟机中通常不需要IPv6的,为此进行如下第1~5步骤禁用IPv6,单纯执行第1步也可以,执行第6步可查看连接统计信息;

1、GRUB启动项中停止IPv6,需要修改/etc/default/grub文件,root用户下通过vi打开该文件:

vi /etc/default/grub

对其中的GRUN_CMDLINE_LINUX配置行,添加参数ipv6.disable=1,添加之前:

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap console=ttyS0"

添加之后:

GRUB_CMDLINE_LINUX="crashkernel=auto ipv6.disable=1 rd.lvm.lv=centos/root rd.lvm.lv=centos/swap console=ttyS0"

修改完毕后保存,运行grub2-mkconfig -o /boot/grub2/grub.cfg重新生成grub.cfg文件:

[root@centos root]# grub2-mkconfig -o /boot/grub2/grub.cfgGenerating grub configuration file ...Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.imgFound linux image: /boot/vmlinuz-0-rescue-7af5895574004bfba83dbf7be1525544Found initrd image: /boot/initramfs-0-rescue-7af5895574004bfba83dbf7be1525544.imgdone

2、修改配置文件/etc/sysctl.conf,root用户下通过vi打开该文件:

vi /etc/sysctl.conf

在其中添加net.ipv6.conf.all.disable_ipv6=1,添加之后的文件内容示例:

# sysctl settings are defined through files in# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.## Vendors settings live in /usr/lib/sysctl.d/.# To override a whole file, create a new file with the same in# /etc/sysctl.d/ and put new settings there. To override# only specific settings, add a file with a lexically later# name in /etc/sysctl.d/ and put new settings there.## For more information, see sysctl.conf(5) and sysctl.d(5).net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv4.tcp_syncookies = 1net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 10000 65000net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_max_tw_buckets = 50001

注:上述配置中的其他参数含义说明如下:

1) net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时 启用 Cookie 旋来处理,可防范少量的SYN ×××。该参数默认为0,表示关闭。

2) net.ipv4.tcp_tw_reuse = 1表示开启重用,即允许将TIME-WAIT 套接字重新用于的TCP连接。该参数默认为 0,表示关闭。
3) net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT 套接字的快速回收,该参数默认为0,表示关闭。
4) net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,那么这个参数将决定保持在FlN-WAIT-2 状态的时间。
5) net.ipv4.tcp_keepalive_time = 1200 表示当 Keepalived 启用时,TCP发送Keepalived 消息的频度改为20分钟,默认值是2小时。
6) net.ipv4.ip_local_port_range = 10000 65000 表示CentOS 系统向外连接的端口范围。其默认值很小,这里改为10000到65000。建议不要将这里的最低值设得太低,否则可能会占用正常的端口。
7) net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认值为1024,此处加大队列长度为8192,可以容纳更多等待连接的网络连接数。
8) net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT 套接字的最大数量,如果超过这个数字,TlME_WAIT 套接字将立刻被清除并打印警告信息,默认值为180000,此处改为5000。对于Apache、Nginx等服务器,前面介绍的几个参数已经可以很好地减少TIME_WAIT套接字的数量,但是对于Squid来说,效果却不大,有了此参数就可以控制TME_WAIT 套接字的最大数量,避免Squid 记服务器被大量的TIME_WAIT 套接字拖死。

执行以下命令使内核配置立马生效:

sysctl -p

3、添加禁用IPv6配置到/etc/sysconfig/network,通过vi打开该文件:

vi /etc/sysconfig/network

在其中添加NETWORKING_IPV6=no,添加之后的文件内容示例:

# Created by anacondaNETWORKING_IPV6=no

4、添加禁用IPv6配置到网络接口配置文件,对普通安装的CentOS7,通常是网络接口eno0、eno1之类的对应的文件如/etc/sysconfig/network-scripts/ifcfg-eno0、/etc/sysconfig/network-scripts/ifcfg-eno1,对最小化安装的CentOS7,通常是网络接口eth0对应的文件如/etc/sysconfig/network-scripts/ifcfg-eth0,以eth0为例,通过vi打开相应的配置文件:

/etc/sysconfig/network-scripts/ifcfg-eth0

在其中删除IPv6相关的配置项,只保留IPV6INIT=no,相应的文件内容示例:

TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="dhcp"DEFROUTE="yes"IPV4_FAILURE_FATAL="no"NAME="eth0"UUID="d71ca50f-e98c-449d-bd7e-11b961655a03"DEVICE="eth0"ONBOOT="yes"IPV6INIT="no"

注:如果配置为静态IP,则相应的文件内容示例:

TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="dhcp"DEFROUTE="yes"IPV4_FAILURE_FATAL="no"NAME="eth0"UUID="d71ca50f-e98c-449d-bd7e-11b961655a03"DEVICE="eth0"ONBOOT="yes"IPV6INIT="no"

并需在/etc/resolv.conf中添加DNS服务器,示例如下:

# Generated by NetworkManagersearch routernameserver 192.168.0.1

再执行systemctl restart network命令,通过ping外部网站(例如: www.sina.com.cn )检查可达情况;如果/etc/resolv.conf的数据因为上次是动态地址重启后被冲掉,在使用静态地址reboot后,重新编辑录入上述内容即可持久生效;

5、对某些服务需停止使用IPv6,例如VSFTP,需修改/etc/vsftpd/vsftpd.conf中的listen和listen_ipv6两个选项:

listen=YESlisten_ipv6=NO

对应nginx,需注释掉nginx.conf配置文件中IPv6相关的行,例如下面的例子中注释掉了“listen       [::]:80 default_server;”这一行

server {        listen       80 default_server;        #listen       [::]:80 default_server;        server_name  _;        root         /usr/share/nginx/html;

6、查看TCP统计相关信息

输入如下命令查看当前连接统计数:

netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S) print a, S[a]}'

例如命令显示结果如下所示:

ESTABISHED 2

命令中的含义分别如下。

1) CLOSED:无恬动的或正在进行的连接。
2) ISTEN:服务器正在等待进入呼叫。
3) SYN_RECV:一个连接请求已经到达,等待确认。
4) SYN_SENT:应用已经开始,打开一个连接。
5) ESTABLISHED;正常数据传输状态。
6) FIN_WAT1:应用说它已经完成。
7) FIN_WAT2:另一边己同意释放。
8) ITMED_WAIT:等待所有分组死掉。
9) CLOSING;两边尝试同时关闭。
10)TIME_WAIT:另一边已初始化一个释放。
11)LAST_ACK:等待所有分组死掉。

七、文件I/O优化

1、对小文件(例如Web服务器中的静态资源如图片等)不记录访问时间,修改/etc/fstab文件:

vi /etc/fstab

修改前:

## /etc/fstab# Created by anaconda on Tue Jun 26 14:03:37 2018## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/dev/mapper/centos-root /                       xfs     defaults        0 0UUID=5c27d60c-ad7a-46f6-bb46-50bbc3527579 /boot                   xfs     defaults        0 0/dev/mapper/centos-home /home                   xfs     defaults        0 0/dev/mapper/centos-swap swap                    swap    defaults        0 0

修改后(部分分区参数由defaults变为noatime):

## /etc/fstab# Created by anaconda on Tue Jun 26 14:03:37 2018## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/dev/mapper/centos-root /                       xfs     noatime        0 0UUID=5c27d60c-ad7a-46f6-bb46-50bbc3527579 /boot                   xfs     defaults        0 0/dev/mapper/centos-home /home                   xfs     noatime        0 0/dev/mapper/centos-swap swap                    swap    defaults        0 0

2、修改最大打开文件数

通过如下命令打开/etc/systemd/system.conf配置文件:

vi /etc/systemd/system.conf

修改其中的DefaultLimitNOFILE、DefaultLimitNPROC,例如:

DefaultLimitNOFILE=65535DefaultLimitNPROC=65535

修改之后,重启之前通过ulimit命令查看:

[root@centos root]# ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 3883max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 3883virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

重启之后通过unlimit命令查看(open files参数已经变为65536)

[root@centos root]# ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 3883max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 65536pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 65536virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

八、常用维护工具

1、Fish shell

Fish shell是一款开源的命令行工具,提供了语法高亮、常用命令及历史命令快速查找等功能,非常适合命令行方式维护Linux系统;通过yum从软件库中安装的命令:

yum install fish

也可以从相关网站直接下载并安装(

1) Fish常用快捷键:

右箭头->  直接使用自动提示文本完成命令行并将光标移动到结束;

左箭头<-  光标左移

Tab键       唯一匹配时直接完成文本输入,有多条匹配给出列表,然后支持通过上下左右箭头键选择其中的一条

2) 启动或退出fish shell环境

安装完成后输入fish即可启动fish shell环境,在fish shell环境下输入exit或者执行切换用户的su命令即可退出fish shell;

3) 修改系统默认的shell

不建议将系统的默认shell修改为fish shell,因为fish shell扩展了一些shell语法,用这些语法写的shell脚本在普通shell下可能跑不起来;

不过作为修改用户登录后的shell这项操作,下面简单介绍方法:

方法一:修改用户登录的shell配置

每个用户登录时的shell在/etc/passwd中有记录,root用户登录后,通过cat /etc/passwd 或者 more /etc/passwd在打印的信息中可看到各个用户的默认shell,例如:

[root@centos_vm3 bin]# cat  /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinzhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bashnginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin

每行的格式,为以冒号分隔的字段信息,说明如下:

注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序            

其中:

注册名-----用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的;

口令----字段使用一个“x”来代替,真实口令另外存储;

用户标识号----一个数值,唯一标识一个用户;

组标识号----一个数值,当前用户的缺省组的组标识号;

用户名----包含用户信息的一串文本,例如真实姓名、联系方式;

用户主目录----用户个人主目录,登录后该用户使用的shell以此为工作目录;

命令解释程序----即用户所用的shell的路径,以root登录后编辑该文件修改此信息即可修改用户的默认shell;

方法二:直接输入命令chsh修改当前用户的shell,过程示例如下:

[zhangsan@centos_vm3 bin]$ chsh -s /usr/bin/fishChanging shell for zhangsan.Password:*******

*