Linux Grub引导界面美化

最近一直在整理Debian+Windows双系统的问题,个人觉得grub启动菜单不是特别养眼,所以搜索了一下,试用了rEFind。但是个人觉得rEFind,grub,Windows三重引导让人很不舒服,所以还是对grub主题进行了一下修改。

下面是修改过程

一. 挑选喜欢的主题并下载

进到GNOME-LOOKING.org

然后选择GRUB Themes,选一个自己最喜欢的下载即可,我选的是评分第一的这个,vimix,确实看着很养眼,简约舒服

点进去下载自己的版本即可

我下了一个,顺带放在这里,有兴趣的话可以点击自取

注意我把3种格式打包了一下,所以要解压两次,选择适合自己的版本


二.安装主题

主题下载之后,根据自己的情况去找到该文件

  1. 解压主题

首先需要对该文件进行解压。

tar -Jxf Vimix-1080p.tar.xz

解压之后可以看到文件夹Vimix-1080P,里面有一个安装脚本,名为install.sh,大家可以直接使用脚本安装

bash install.sh

参考文章:https://zhuanlan.zhihu.com/p/94331255

解决Linux下挂载的NTFS分区(Windows分区)只读问题。

解决方案

关闭Windows下的快速启动,我用的机器是Windows11+Debian11

方法:

win+r呼出运行框,输入control打开控制面板

然后选择硬件和声音->电源设置->选择电源按钮的功能。打开如上图对话框。

将“关机设置”下面的“启用快速启动(推荐)”前的勾取消掉(单击复选框),如上图红框所示。然后点击下方“保存修改”按钮。如果复选框是灰色不可用状态,单击上方的“更改当前不可用的设置”(上图红线所示)即可。

我的是英文版,仅供参考

参考文章:https://zhuanlan.zhihu.com/p/161505413

Linux内存回收之drop cache

Linux有自己完备的一套内存回收机制,并不需要人为的干预,但它同时也提供了一种手动释放的手段,可以让我们在调试的时候使用,方法是通过设置”/proc/sys/vm/drop_cache”参数。

这个参数可接收3个数字的输入,分别是1, 2和3,写入1代表只释放page cache的可回收部分,写入2代表只释放slab cache中的可回收部分。可回收的slab cache是指在调用”kmem_cache_create”函数向slab分配器申请内存时,使用了”SLAB_RECLAIM_ACCOUNT”标志位,主要就是dentry cache和inode cache。

写入3代表同时释放page cache和reclaimable slab cache。很好记,1+2=3嘛,事实上,1就是二级制的01,2就是二进制的10,运行drop cache就是靠这两个置1的bit判断的。具体的实现函数是”drop_caches_sysctl_handler”(代码位于/fs/drop_caches.c):

int drop_caches_sysctl_handler(...)
{
    if (sysctl_drop_caches & 1) {
	iterate_supers(drop_pagecache_sb, NULL);
	count_vm_event(DROP_PAGECACHE);
    }
    if (sysctl_drop_caches & 2) {
        drop_slab();
	count_vm_event(DROP_SLAB);
    }
    ...
}

写入后只会执行一次,后续不用再去管它,不需要写入0去清除什么的(其实你写入0也是不会成功的),如果非强迫症犯了想把它清掉,那就写入4好了,4是”100″,末尾两位是0就行。

【page cache的释放

在执行”echo 1 > /proc/sys/vm/drop_caches”命令之前和之后,分别查看”meminfo”中page cache的数量:

可见,page cache所占用的内存明显减少,但并没有完全清空。因为这种方式只能清空page cache中”clean“的部分,也就是已经和外部磁盘同步过的部分。

因为”clean”的部分回收起来最简单,既然已经同步过了,直接丢弃即可,下次要用再从磁盘上拷贝回来就可以了,而”dirty”的部分需要先writeback到磁盘,才能释放。所以,”drop cache”准确地应该叫drop clean cache(如果想释放”dirty”的page cache,可以先使用”sync”命令强制同步一下)。

具体实现

以下是向”drop_cache”写入1后的函数调用过程:

与实现自动回收的kswapd线程通过扫描LRU链表不同,手动回收page cache是遍历各个文件系统的各个文件,来寻找可供回收的clean pages。

【slab cache的释放

page cache对应的是文件系统中的文件数据(userdata),而inode cache对应的是文件系统中文件的控制结构(metadata)。对于磁盘文件系统,内存inode存在后备存储,因此同page cache一样,较易在内存中重建,释放的代价较低。dentry虽然在磁盘上没有直接对应的结构,但也可根据文件系统中目录inode的信息进行重建。

还是和之前page cache的实验一样,在执行”echo 2 > /proc/sys/vm/drop_caches”命令之前和之后,分别查看”meminfo”中slab cache的大小。

代表slab cache中可回收部分的”SReclaimable”明显减少,而代表不可回收部分的”SUnreclaim”的值基本没有变化。

再来看下回收前后dentry cache的数量变化,可见,处于”unused“状态的dcache都被回收了,共49721个:

而inode cache的数量,减少了44407个:

一个内存inode被一个或多个dentry指向,如果指向一个inode的dentry都被释放,那么该inode也就没有继续存在于内存的意义,也会被同步释放,且由于这种指向关系,释放的inode object总数应略小于释放的dentry object的总数。

借助crash工具的”struct”命令,可以快速得知一个结构体的大小,以笔者使用的”4.18.0-80.el8.x86_64″内核版本为例,dentry和inode的结构体大小分别是208字节和648字节,计算一下,差不多就等于”SReclaimable”中减少的部分。

具体实现

上述操作对应的函数调用过程大致是这样的:

从dcache和icache的LRU链表获取可回收的数量后,还可以通过”/proc/sys/vm/vfs_cache_pressure“参数来调节slab cache的「回收倾向」。

shrinker -> count_objects (super_cache_count)
total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc);
total_objects += list_lru_shrink_count(&sb->s_inode_lru, sc);
total_objects = vfs_pressure_ratio(total_objects); // 按百分比调整

该参数的值越小,则回收slab cache的比例也就越低,当值为0时,即使内存资源紧张也不回收slab cache(非常类似于调节anonymous page和page cache回收比例的“swappiness”参数)。笔者的系统采用的是默认值100,所以是全部回收。

如果不是全部回收,那么在确定了回收的slab object总数后,需根据dcache和icache各自所占的比例进行分摊(”sc->nr_to_scan“是通过上一个函数返回的”total_objects”经过进一步的调整获得):

shrinker -> scan_objects (super_cache_scan)
dentries = mult_frac(sc->nr_to_scan, dentries, total_objects);
inodes = mult_frac(sc->nr_to_scan, inodes, total_objects);

获得”sc->nr_scanned“的扫描结果之后,就是对dcache和icache实际的清除操作了(由于dentry和inode的指向关系,应先释放dcache),可通过perf工具查看此过程的时间百分比,笔者的一次实验结果如下:

69.43%  prune_dcache_sb
27.41%  prune_icache_sb

【小结

清除page cache和slab cache可以快速释放内存,cache虽然占据了内存空间,但其本来就是为了提高性能而存在的,在手动清除后的一段时间里,系统的整体运行效率将受到影响。如果发现即便负责自动回收的kswapd频繁启动,系统的内存资源依然吃紧,应尝试去寻找部分内存始终不能有效释放的原因,手动清除并不能解决根本问题。

笔者在工作中就曾经遇到过这样的案例:kswapd由于持续运行,导致占据了大量的CPU资源,后来发现root cause是有进程一直再往tmpfs里面打印log,而tmpfs属于shmem,在性质上是anonymous pages,内存回收时应该被swap out到外部的swap space。

但系统没有在外部flash设置swap分区,手动drop cache只能回收page cache和slab cache,对anony page是没有用的。tmpfs里的内容不断增加,导致空闲内存低于low watermark,触发kswapd,但没有swap分区,kswapd怎么使劲也是无能为力的,最终的结果就是内存占用率和CPU占用率都很高,系统可能就挂掉了。

参考内存清理脚本(可根据自己的需求进行调整)

#!/bin/bashecho “开始清除缓存”

sync;sync;sync #写入硬盘,防止数据丢失

sleep 10 #延迟10秒

echo 1 > /proc/sys/vm/drop_caches

echo 2 > /proc/sys/vm/drop_caches

echo 3 > /proc/sys/vm/drop_caches

echo “清理结束”

参考文章:https://zhuanlan.zhihu.com/p/93962657

ORA-03113: end-of-file on communication channel解决步骤

通常这个异常都是空间满导致,查询alter_orcl.log 这个文件一般都能看到错误信息,其中orcl为数据库的sid。
一般都会有类似的日志:
ORA-19815: WARNING: db_recovery_file_dest_size of 5218762752 bytes is 100.00% used, and has 0 remaining bytes available.


You have following choices to free up space from recovery area:

  1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
    then consider changing RMAN ARCHIVELOG DELETION POLICY.
  2. Back up files to tertiary device such as tape using RMAN
    BACKUP RECOVERY AREA command.
  3. Add disk space and increase db_recovery_file_dest_size parameter to
    reflect the new space.
  4. Delete unnecessary files using RMAN DELETE command. If an operating
    system command was used to delete files, then use RMAN CROSSCHECK and
    DELETE EXPIRED commands.

解决方案一、清理文件(如果不想清理文件可以查看解决方案二)

切换到oracle用户执行:

su – oracle

[oracle@db~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jun 23 17:44:00 2016

Copyright (c) 1982, 2009, Oracle. All rights reserved.
sql> conn / as sysdba

Connected to an idle instance.

sql> startup nomount

ORACLE instance started.
再执行
sql> alter database mount;

Database altered.

接下来就要清理空间了
另外起一个终端,找到文件存放路径:
[oracle@db~]$ cd /data2/oracle/flash_recovery_area/ORCL/archivelog/
[oracle@db archivelog]$ pwd
/data2/oracle/flash_recovery_area/ORCL/archivelog
[oracle@db archivelog]$ ls
2016_06_01 2016_06_02 2016_06_03 2016_06_04 2016_06_05 2016_06_06 2016_06_07 2016_06_08 2016_06_21 2016_06_22 2016_06_23
[oracle@db archivelog]$ rm -rf 2016_05*
删除掉不要的文件。

接下来需要启动rman了
[oracle@db archivelog]$ rman target /

Recovery Manager: Release 11.2.0.1.0 – Production on Thu Jun 23 17:49:55 2016

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to target database: ORCL (DBID=1412518558)

RMAN> crosscheck archivelog all;

一堆的提示不管它,再执行:
RMAN> delete expired archivelog all;
删除掉过期的归档文件。

接下来回到刚才的sqlplus终端,执行如下:
SQL> alter database open;

Database altered.

SQL>

好了,数据库起来了。
然后启动监听端口就万事大吉了。

解决方案二、增加数据库空间

如果磁盘空间没有满,想增加闪回恢复区。
在mount数据库后,执行:
alter system set db_recovery_file_dest_size=8G;
修改的过程如下:
<pre>
[oracle@db~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Fri Jun 24 10:56:40 2016

Copyright (c) 1982, 2009, Oracle. All rights reserved.

SQL> conn /as sydba
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SQL> exit
[oracle@firebox42 ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Fri Jun 24 10:57:02 2016

Copyright (c) 1982, 2009, Oracle. All rights reserved.

SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup nomount
ORA-01012: not logged on
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.

Total System Global Area 1.0689E+10 bytes
Fixed Size 2216344 bytes
Variable Size 6845107816 bytes
Database Buffers 3825205248 bytes
Redo Buffers 16945152 bytes
SQL> alter database mount;

Database altered.

SQL> show parameter db_recover;

NAME TYPE VALUE


db_recovery_file_dest string /opt/oracle/flash_recovery_are
a
db_recovery_file_dest_size big integer 3882M
SQL> alter system set db_recovery_file_dest_size=80G;

System altered.

SQL> alter database open;

Database altered.

参考文章:https://www.jianshu.com/p/97b86d95894b

将VMware转换为VirtualBox(或将VirtualBox转换为VMware)

虚拟机本质上仅仅是这-您可以尝试所有新的操作系统,程序或任何您需要的辅助空间。它基本上就像单独的计算机一样工作,您可以安装所需的任何OS,并在其中安装程序。这一切都不会影响您当前的设置,因此,如果出现问题,则不会影响您的主操作系统。基本上,您是在主操作系统上的软件中运行辅助操作系统。

这样做有很多选择,两个最受欢迎的软件是VMwareVirtual Box。两者的工作方式相似。他们创建了一个容器,您可以在其中运行和安装操作系统,就像将其安装在单独的PC上一样。这些使您可以选择要分配给辅助OS的RAM,存储量和处理能力。唯一的是,如果要从使用其中一种迁移到另一种,那么任务就不那么简单了。如果要在从VMware迁移到Virtual Box时保持操作系统设置及其所有文件,程序和设置完整,请执行以下步骤。

将VMware转换为Virtual Box,反之亦然

进行转换之前首先要安装一个VMware Player(点击可进入官方下载页面)

从VMware到Virtual Box

在开始之前,请确保要导出的虚拟机处于“关闭电源”状态,否则不要处于其他状态。为了能够在Virtual Box中运行它,我们需要将VMware文件(.vmx)转换为Virtual Box文件(.ovf)。为此,请按照以下步骤操作。尽管没有基于GUI的方法,但这也不是那么困难。

现在关闭电源,让我们开始。

  1. 打开VMware安装目录。默认情况下,它是  C:\ Program Files(x86)\ VMware \ VMware Player。
  2. 现在,在文件夹内,按住shift键右键单击  文件夹中存在的OVF工具
  1. 选择“在  此处打开命令窗口” 选项。
  2. 现在,将打开一个CMD窗口。
  3. 现在,以以下格式运行命令以将vmx文件转换为ovf。
    ovftool“源文件.vmx” export.ovf
  1. 此处,源文件部分将替换为源vmx文件的位置。
  2. 保持扩展名和导出部分相同。
  3. 例如,如果文件存储在相应目录中,则  ovftool“ D:\ Documents \ Virtual Machines \ Windows 7 \ Windows 7.vmx” D:\ Documents \ export.ovf是我正在运行的命令。
  1. 现在,该命令将运行,文件将被导出到相应目录中。

导出现已完成。现在,您也可以在Virtual Box上打开具有相同文件,操作系统和设置的相同虚拟机。要在Virtual Box中打开导出的文件,请按照以下步骤操作。

  1. 打开虚拟盒子。
  2. 单击文件选项,然后选择导入设备… 选项。
  1. 现在浏览并选择新导出的.ovf文件。
  2. 现在单击下一步。
  1. 最后,单击导入 按钮以完成导入.ovf文件。

完成后,您也应该能够在Virtual Box上使用相同的虚拟机。

虚拟机到VMware

虽然没有基于GUI的简单方法将VMware转换为Virtual Box。但是,将Virtual Box转换为VMware相对简单得多。它提供了一个基于GUI的简洁程序,因此您不必费心CMD命令和错误。要进行其他转换,请按照以下步骤操作。使用这个

  1. 打开虚拟盒子。
  2. 单击文件 按钮,然后单击  导出设备… 选项。
  1. 在“  导出虚拟设备” 向导中,选择要导出的虚拟机,然后单击“ 下一步”。
  1. 现在,选择要存储导出文件的位置,然后单击“ 下一步”。
  1. 在“  设备设置” 页面中,单击“  导出” 以完成导出过程。

现在,导出的文件已准备好在VMware上运行。为此,请按照以下步骤操作。值得注意的是,您将在导入过程中收到警告,但这绝对可以。只需单击“  重试” 按钮,这一次应该将其导入,没有任何问题或错误。

  1. 打开VMware。
  2. 单击“  打开虚拟机” 选项以打开新创建的虚拟机。
  1. 浏览并打开文件。
  2. 现在,只需单击导入 按钮。
  1. 现在,该过程完成后,您可能会看到一条错误消息。
  1. 单击“  重试” 按钮以重试该操作,它将在这次导入且没有任何错误。
  2. 如果错误没有消失,则可能必须重新尝试导出过程。
  3. 完成后,您应该在VMware Player中看到新的虚拟机。

现在,您可以轻松地将虚拟机从VMware转换为Virtual Box,也可以采用其他方法。该过程非常简单,并且工作得很好,因为这两个程序都能够将虚拟机导出为相应的格式。

但是,如果遇到任何错误,请再次尝试导入过程,如果未解决,请尝试再次将其全部导出。

迁移之后个人遇到了虚拟机版本识别错误,install VMware tools 为灰色无法安装的问题,解决方案可以参考这篇文章

参考文章:https://blog.csdn.net/zb774095236/article/details/103046675

VirtualBox网络配置方案

VirtualBox是开源的虚拟机软件,这里重点讲一下它的的网络配置。

一般虚拟机都会提供了三种网络工作模式,分别是:

  • Bridged(桥接模式
  • NAT(网络地址转换模式)
  • Host-Only(仅主机模式)

这三种网络模式有什么区别,会在哪种情况下使用?我们来详细分析一下。


1. Bridged(桥接模式)

桥接模式就是将主机的网卡,与虚拟机虚拟的网卡利用虚拟网桥进行通信。

  • 类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。
  • 虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。

其网络结构如下图所示:

VirtualBox虚拟机会默认安装Bridged网卡和Host-Only网卡:

在虚拟机里选择要桥接的物理网卡,这里选择的是Intel wi-fi这个物理网卡:

因为启用了【网卡1】,虚拟机会给Ubuntu系统配置一块虚拟网卡【enp03】,这里我们设置Ubuntu虚拟网卡和桥接的Windows物理网卡在同一个网段,这样就可以实现互通了;

因为windows的wifi网卡地址是:10.4.23.200,所以设置虚拟机的enp0s3网卡地址为:10.4.23.218;这样两个系统现在都在真实的网络上,且可以正常上网。

小结:

  • 桥接模式:物理机和虚拟机在网络上是一样的,虚拟系统相当于在此网络下的一个独立系统,需要分配网络的一个独立IP。
  • 连接时指定的桥接到哪个物理网卡,相当于要把虚拟系统接到那个网段的交换机上。

2. NAT(地址转换模式)

NAT模式下,虚拟机访问网络的所有数据都是由主机提供的,虚拟机并不真实的存在于网络上,主机和网络中的任何机器是不能查看和访问这个虚拟机的。

其网络结构如下图所示:

NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。

  • DHCP用于动态分配虚拟机的IP地址。
  • 物理机下的虚拟网卡,在VMware下是VMnet8网卡,在VirtualBox下不可见。

另外,在连接上:

  • 虚拟机可以通过网络访问主机
  • 主机无法通过网络访问虚拟机,如:telnet 是连不到虚拟机中的。

小结:

这种虚拟系统都是隐藏在物理机后面的机器,在网络上是看不见的,地址由DHCP负责分配,上网有NAT设备负责。

这这网络连接实现有些系统不需要暴露在网络节点上又需要上网的这种需求,这也是最简单的一种虚拟机使用方式。

3. Host-Only(仅主机模式)

Host-Only听名字就是只和主机建立关系。这种模式是将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。

它的网络结构是在NAT网络的基础上,去除虚拟NAT设备让它不能上网,如下图所示:

在虚拟机安装完后,windows下就会多出来一个Host-Only网卡,这个虚拟网卡就是用来实现通信用的。

在选择Host-Only模式时,需要选择一块Host-Only网卡用于和虚拟机进行通信使用:

同时设置虚拟机的IP地址和Host-Only的网卡地址要在同一个网段:

相互ping都是通的,这也实现了物理机和虚拟机互通的功能。


三种模式总结:

  • 桥接模式:实现虚拟机在真实的网络上;
  • NAT模式:实现虚拟机隐藏在物理机之后,能上网,但不能访问物理机;
  • Host-Only模式:实现虚拟机隐藏在物理机之后,不能上网,但可以访问物理机;

上面只是介绍选用一个网络模式的情况,在实际使用中,我们还可以同时使用两种及以上的网络模式,比如:NAT + Host-Only,这样可以实现虚拟机上网和物理机通信两种能力。

以上就是VirtualBox最常用的网络配置,希望对你有用。

参考文章:https://zhuanlan.zhihu.com/p/403513377

一下为个人配置,可能与上面的ip分配模式不完全相同,仅供参考

如果想要用只配置nat网络,并且让主机访问到虚拟机的话就需要配置端口转发,

配置位置:管理->全局设定->网络->主机使用的NAT网络,我这边配置的是NatNetwork,双击即可看到端口转发按钮

点击即可看到端口转发规则界面,我这边配置的nat网关ip是192.168.77.1,子系统ip是192.168.77.4

通过如下配置,主机即可通过访问192.168.77.1:12580来实现对于192.168.77.4:22的访问

linux下的C语言开发

看到一个很好的文章,学习记录一下,原文链接可以在最后找到


在很多人的眼里,C语言和linux常常是分不开的。这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当然,linux操作系统本身对C语言的支持也是相当到位的。作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位。作为程序员来说,linux系统为我们提供了很多理想的环境,这其中包括了下面几个方面,

(1)完善的编译环境,包括gcc、as、ld等编译、链接工具
(2)强大的调试环境,主要是gdb工具
(3)丰富的自动编译工具,主要是make工具
(4)多样化的os选择,ubuntu、redflag等等
(5)浩瀚的开源代码库

当然,不管我怎么说,最终朋友们还是应该自己勇敢地跨出前进的第一步。
如果还没有过Linux编程经验的朋友可以首先在自己的pc上面安装一个虚拟机,然后就可以在shell下面编写自己的C语言代码了。

#include &lt;stdio.h>
int main()
{
    printf("hello!\n");
    return 1;
}

编写完上面的代码后,你需要做的就是两个步骤:
1、输入 gcc hello.c -o hello;
2、输入./hello。
如果一切正常的话,此时你应该会在屏幕上看到一行hello的打印。如果你看到了,那么恭喜你,你已经可以开始linux的c语言编程之旅了。

当然,我们不会满足于这么简单的打印功能。下面就可以编写一个简单的迭代函数,

#include &lt;stdio.h>
int iterate(int value)
{
    if(1 == value)
        return 1;
    return iterate(value - 1) + value;
}
int main()
{
    printf("%d\n", iterate(10));
    return 1;
}

此时,同样我们需要重复上面的步骤:
1、输入gcc hello.c -o hello;
2、输入./hello。
当然此时如果一切OK的话,你就会看到屏幕会有55这个数的输出。本来1到10的数据之和就是55, 这说明我们的程序是正确的。

当然, 还会有一些朋友对程序的反汇编感兴趣,那么他需要两个步骤:
1、gcc hello.c -g -o hello;
2、objdump -S -d ./hello。
之所以在gcc编译的时候加上-g是为了添加调试信息,objdump中的-S选项是为了在显示汇编代码的时候同时显示原来的C语言源代码。

int iterate(int value)
{
    8048374: 55 push %ebp
    8048375: 89 e5 mov %esp,%ebp
    8048377: 83 ec 08 sub $0x8,%esp
    if(1 == value)
        804837a: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
        804837e: 75 09 jne 8048389 &lt;iterate+0x15>
        return 1;
    8048380: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)
    8048387: eb 16 jmp 804839f &lt;iterate+0x2b>
    return iterate(value -1) + value;
    8048389: 8b 45 08 mov 0x8(%ebp),%eax
    804838c: 83 e8 01 sub $0x1,%eax
    804838f: 89 04 24 mov %eax,(%esp)
    8048392: e8 dd ff ff ff call 8048374 &lt;iterate>
    8048397: 8b 55 08 mov 0x8(%ebp),%edx
    804839a: 01 c2 add %eax,%edx
    804839c: 89 55 fc mov %edx,0xfffffffc(%ebp)
    804839f: 8b 45 fc mov 0xfffffffc(%ebp),%eax
}
80483a2: c9 leave
80483a3: c3 ret

linux下的C语言开发(makefile编写)
对于程序设计员来说,makefile是我们绕不过去的一个坎。可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓。毕竟工具本身已经帮我们做好了全部的编译流程。但是在Linux上面,一切变得不一样了,没有人会为你做这一切。编代码要靠你,测试要靠你,最后自动化编译设计也要靠你自己。想想看,如果你下载了一个开源软件,却因为自动化编译失败,那将会在很大程度上打击你学习代码的自信心了。所以,我的理解是这样的。我们要学会编写makefile,至少会编写最简单的makefile。

首先编写add.c文件,

#include "test.h"
#include &lt;stdio.h>
int add(int a, int b)
{
    return a + b;
}
int main()
{
    printf(" 2 + 3 = %d\n", add(2, 3));
    printf(" 2 - 3 = %d\n", sub(2, 3));
    return 1;
}

再编写sub.c文件,

#include "test.h"
int sub(int a, int b)
{
    return a - b;
}

最后编写test.h文件,

#ifndef _TEST_H
#define _TEST_H
int add(int a, int b);
int sub(int a, int b);
#endif

那么,就是这三个简单的文件,应该怎么编写makefile呢?

test:
add.o sub.o
gcc -o test add.o sub.o
add.o:
add.c test.h
gcc -c add.c
sub.o:
sub.c test.h
gcc -c sub.c
clean:
rm -rf test
rm -rf *.o

linux下的C语言开发(gdb调试)
编写代码过程中少不了调试。在windows下面,我们有visual studio工具。在linux下面呢,实际上除了gdb工具之外,你没有别的选择。那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。

#include &lt;stdio.h>
int iterate(int value)
{undefined
    if(1 == value)
        return 1;
    return iterate(value - 1) + value;
}
int main()
{undefined
    printf("%d\n", iterate(10));
    return 1;
}

既然需要调试,那么生成的可执行文件就需要包含调试的信息,这里应该怎么做呢?很简单,输入 gcc test.c -g -o test。输入命令之后,如果没有编译和链接方面的错误,你就可以看到 可执行文件test了。

调试的步骤基本如下所示,
(01) 首先,输入gdb test
(02) 进入到gdb的调试界面之后,输入list,即可看到test.c源文件
(03) 设置断点,输入 b main
(04) 启动test程序,输入run
(05) 程序在main开始的地方设置了断点,所以程序在printf处断住
(06) 这时候,可以单步跟踪。s单步可以进入到函数,而n单步则越过函数
(07) 如果希望从断点处继续运行程序,输入c
(08) 希望程序运行到函数结束,输入finish
(09) 查看断点信息,输入 info break
(10) 如果希望查看堆栈信息,输入bt
(11) 希望查看内存,输入 x/64xh + 内存地址
(12) 删除断点,则输入delete break + 断点序号
(13) 希望查看函数局部变量的数值,可以输入print + 变量名
(14)希望修改内存值,直接输入 print + *地址 = 数值
(15) 希望实时打印变量的数值,可以输入display + 变量名
(16) 查看函数的汇编代码,输入 disassemble + 函数名
(17) 退出调试输入quit即可

linux下的C语言开发(AT&T 汇编语言)
同样是x86的cpu,但是却可以用不同形式的汇编语言来表示。
在window上面我们使用的更多是intel格式的汇编语言,而在Linux系统上面使用的更多的常常是AT&T格式的汇编语言。那什么是AT&T格式的汇编代码呢?我们可以写一个试试看。

.data
message: .string "hello!\n"
length = . - message
.text
.global _start
_start:
movl $length, %edx
movl $message, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
movl $0, %ebx
movl $1, %eax
int $0x80
08048074 &lt;_start>:
.text
.global _start
_start:
movl $length, %edx
8048074: ba 08 00 00 00 mov $0x8,%edx
movl $message, %ecx
8048079: b9 9c 90 04 08 mov $0x804909c,%ecx
movl $1, %ebx
804807e: bb 01 00 00 00 mov $0x1,%ebx
movl $4, %eax
8048083: b8 04 00 00 00 mov $0x4,%eax
int $0x80
8048088: cd 80 int $0x80
movl $0, %ebx
804808a: bb 00 00 00 00 mov $0x0,%ebx
movl $1, %eax
804808f: b8 01 00 00 00 mov $0x1,%eax
int $0x80
8048094: cd 80 int $0x80
ret
8048096: c3 ret

这是一个简单的汇编文件,我们可以分两步进行编译。首先,输入 as -gstabs -o hello.o hello.s, 接着输入ld -o hello hello.o即可。为了验证执行文件是否正确,可以输入./hello验证一下。
在as命令当中,由于我们使用了-gstabs选项,因此在hello执行文件中是包含调试信息的。所以,如果想单步调试的朋友可以输入gdb hello进行调试。
那么,hello执行文件反汇编的代码又是什么样的呢?我们可以输入objdump -S -d hello查看一下。

linux下的C语言开发(静态库)
在我们编写软件的过程当中,少不了需要使用别人的库函数。因为大家知道,软件是一个协作的工程。作为个人来讲,你不可能一个人完成所有的工作。另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把时间浪费在这些重复的工作上面。
既然说到了库函数,那么一般来说库函数分为两种方式:静态库和动态库。两者的区别其实很小,静态库是必须要链接到执行文件中去的,而动态库是不需要链接到最后的执行文件中的。怎么理解呢?也就是说,对于最后的执行文件而言,你是否删除静态库无所谓。但是,一旦你删除了动态库,最后的执行文件就玩不转了。
今天我们讨论的问题是静态库。为了显示windows和linux创建静态库之间的差别,我们首先在windows上面利用Visual C++6.0创建一个静态库。源文件的代码很简单,

#include "test.h"
int add(int a, int b)
{
    return a + b;
}

头文件代码也不难,

#ifndef _TEST_H
#define _TEST_H
int add(int a, int b);
#endif

如果你需要在windows上面创建一个静态库,那么你需要进行下面的操作,
(1)打开visual C++ 6.0工具,单击【File】-> 【New】->【Projects】
(2)选择【Win32 Static Library】,同时在【Project Name】写上项目名称,在【Location】选择项目保存地址
(3)单击【Ok】,继续单击【Finish】,再单击【Ok】,这样一个静态库工程就创建好了
(4)重新单击【File】->【New】->【Files】,选择【C++ Source Files】,
(5)选中【Add to pproject】,将源文件加入到刚才创建的工程中去,在File中输入文件名+.c后缀
(6)重复4、5的操作,加入一个文件名+.h头文件
(7)分别在头文件和源文件中输入上面的代码,单击F7按钮,即可在Debug目录中生成*.lib静态库文件

那么,在linux下面应该怎么运行呢?其实很简单,两条命令解决,
(1)首先生成*.o文件,输入gcc -c test.c -o test.o
(2)利用ar命令生成静态库,输入ar rc libtest.a test.o

此时如果还有一个hello.c文件使用到了这个静态库,比如说 ,

#include &lt;stdio.h>
#include "test.h"
int main()
{
    printf("%d\n", add(2, 3));
    return 1;
}

其实也很简单,输入一个简单的命令就可以生成执行文件了,
(1)首先输入gcc hello.c -o hello ./libtest.a
(2)输入./hello,验证生成的执行文件是否正确
(3)朋友们可以删除libtest.a文件,重新输入./hello,验证执行文件是否可以正常运行

linux下的C语言开发(动态库)
动态链接库不是linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以.dll作为结尾的,而linux下面的动态连接库是以.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布的。

那么,在Linux上动态库是怎么生成的呢?

#include "test.h"
int add(int a, int b)
{
    return a + b;
}

头文件格式,

#ifndef _TEST_H
#define _TEST_H
int add(int a, int b);
#endif

此时如果我们想要生成动态库,要做的工作其实非常简单,输入gcc -shared -fPIC -o libtest.so test.c即可。回车后输入ls,我们就可以发现当前目录下面出现了libtest.so文件。

#include &lt;stdio.h>
#include "test.h"
int main()
{
    printf("%d\n", add(2, 3));
    return 1;
}

在上面的代码当中,我们发现使用到了add函数,那么此时如何才能生成一个执行文件呢?也很简单,输入gcc hello.c -o hello ./libtest.so。然后输入./hello,此时可以验证一下执行文件运行是否正确。在编写静态库的时候,我说过静态库是汇编链接到执行文件当中的,而动态库不会。朋友们可以做个小实验,删除libtest.so,然后输入./hello。此时大家可以看看系统有没有错误返回?
这个时候,有的朋友就会问了,那在windows下面dll应该怎么编写呢?其实也不难,只要在test.h上面稍作改变即可。其他的步骤和静态库的操作是基本类似的。

#ifndef _TEST_H
#define _TEST_H
#ifdef USR_DLL
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif
DLL_API int add(int a, int b);
#endif

linux下的C语言开发(定时器)
定时器是我们需要经常处理的一种资源。那linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号。这里的定时器就相当于系统每隔一段时间给进程发一个定时信号,我们所要做的就是定义一个信号处理函数。

#include &lt;stdio.h>
#include &lt;time.h>
#include &lt;sys/time.h>
#include &lt;stdlib.h>
#include &lt;signal.h>
static int count = 0;
static struct itimerval oldtv;
void set_timer()
{
    struct itimerval itv;
    itv.it_interval.tv_sec = 1;
    itv.it_interval.tv_usec = 0;
    itv.it_value.tv_sec = 1;
    itv.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL, &amp;itv, &amp;oldtv);
}
void signal_handler(int m)
{
    count ++;
    printf("%d\n", count);
}
int main()
{
    signal(SIGALRM, signal_handler);
    set_timer();
    while(count &lt; 10000);
    exit(0);
    return 1;
}

linux下的C语言开发(自动编译工具)
在Linux下面,编写makefile是一件辛苦的事情。因此,为了减轻程序员编写makefile的负担,人们发明了autoconf和automake这两个工具,可以很好地帮我们解决这个问题。
我们可以通过一个简单的示例来说明如何使用配置工具。

(1)首先,编写源文件hello.c。

#include &lt;stdio.h>
int main(int argc, char** argv[])
{
    printf("hello, world!\n");
    return 1;
}

(2)接下来,我们需要创建一个Makefile.am,同时编写上脚本。

SUBDIRS=
bin_PROGRAMS=hello
hello_SOURCES=hello.c

(3)直接输入autoscan,生成文件configure.scan,再改名为configure.in。修改脚本AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)为AC_INIT(hello, 1.0, feixiaoxing@163.com)同时,在AC_CONFIG_HEADER([config.h])后面添加AM_INIT_AUTOMAKE(hello, 0.1)
(4)依次输入aclocal命令、autoheader命令
(5)创建4个文件,分别为README、NEWS、AUTHORS和ChangeLog
(6)依次输入automake -a、autoconf命令
(7)输入./configure,生成最终的Makefile
(8)如果需要编译,输入make;如果需要安装, 输入make install;如果需要发布软件包,输入make dist

linux下的C语言开发(进程创建)
在Linux下面,创建进程是一件十分有意思的事情。我们都知道,进程是操作系统下面享有资源的基本单位。那么,在Linux下面应该怎么创建进程呢?其实非常简单,一个fork函数就可以搞定了。但是,我们需要清楚的是子进程与父进程之间除了代码是共享的之外,堆栈数据和全局数据均是独立的。

#include &lt;unistd.h>
#include &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;math.h>
#include &lt;errno.h>
#include &lt;sys/types.h>
#include &lt;sys/wait.h>
int main()
{
    pid_t pid;
    if(-1 == (pid = fork())) {
        printf("Error happened in fork function!\n");
        return 0;
    }
    if(0 == pid) {
        printf("This is child process: %d\n", getpid());
    } else {
        printf("This is parent process: %d\n", getpid());
    }
    return 0;
}

linux下的C语言开发(进程等待)
所谓进程等待,其实很简单。前面我们说过可以用fork创建子进程,那么这里我们就可以使用wait函数让父进程等待子进程运行结束后才开始运行。注意,为了证明父进程确实是等待子进程运行结束后才继续运行的,我们使用了sleep函数。但是,在linux下面,sleep函数的参数是秒,而windows下面sleep的函数参数是毫秒。

#include &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;unistd.h>
int main(int argc, char* argv[])
{
    pid_t pid;
    pid = fork();
    if(0 == pid) {
        printf("This is child process, %d\n", getpid());
        sleep(5);
    } else {
        wait(NULL);
        printf("This is parent process, %d\n", getpid());
    }
    return 1;
}

下面,我们需要做的就是两步,首先输入gcc fork.c -o fork, 然后输入./fork,就会在console下面获得这样的结果。

[root@localhost fork]# ./fork
This is child process, 2135
This is parent process, 2134

linux下的C语言开发(信号处理)
信号处理是linux程序的一个特色。用信号处理来模拟操作系统的中断功能,对于我们这些系统程序员来说是最好的一个选择了。要想使用信号处理功能,你要做的就是填写一个信号处理函数即可。一旦进程有待处理的信号处理,那么进程就会立即进行处理。

#include &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;signal.h>
int value = 0;
void func(int sig)
{
    printf("I get a signal!\n");
    value = 1;
}
int main()
{
    signal(SIGINT, func);
    while(0 == value)
        sleep(1);
    return 0;
}

为了显示linux对signal的处理流程,我们需要进行两个步骤。
第一,输入gcc sig.c -o sig, 然后输入./sig即可;
第二则重启一个console窗口,输入ps -aux | grep sig, 在获取sig的pid之后然后输入kill -INT 2082, 我们即可得到如下的输出。

[root@localhost fork]#./sig
I get a signal!
[root@localhost fork]#

linux下的C语言开发(管道通信)
Linux系统本身为进程间通信提供了很多的方式,比如说管道、共享内存、socket通信等。管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另外一个管道接受数据即可。

#include &lt;stdio.h>
#include &lt;unistd.h>
#include &lt;stdlib.h>
#include &lt;string.h>
int pipe_default[2];
int main()
{
    pid_t pid;
    char buffer[32];
    memset(buffer, 0, 32);
    if(pipe(pipe_default) &lt; 0) {
        printf("Failed to create pipe!\n");
        return 0;
    }
    if(0 == (pid = fork())) {
        close(pipe_default[1]);
        sleep(5);
        if(read(pipe_default[0], buffer, 32) > 0) {
            printf("Receive data from server, %s!\n", buffer);
        }
        close(pipe_default[0]);
    } else {
        close(pipe_default[0]);
        if(-1 != write(pipe_default[1], "hello", strlen("hello"))) {
            printf("Send data to client, hello!\n");
        }
        close(pipe_default[1]);
        waitpid(pid, NULL, 0);
    }
    return 1;
}

下面我们就可以开始编译运行了,老规矩分成两步骤进行:
(1)输入gcc pipe.c -o pipe;
(2)然后输入./pipe,过一会儿你就可以看到下面的打印了。

[test@localhost pipe]$ ./pipe
Send data to client, hello!
Receive data from server, hello!

linux下的C语言开发(多线程编程)
多线程和多进程还是有很多区别的。其中之一就是,多进程是linux内核本身所支持的,而多线程则需要相应的动态库进行支持。对于进程而言,数据之间都是相互隔离的,而多线程则不同,不同的线程除了堆栈空间之外所有的数据都是共享的。说了这么多,我们还是自己编写一个多线程程序看看结果究竟是怎么样的。

#include &lt;stdio.h>
#include &lt;pthread.h>
#include &lt;unistd.h>
#include &lt;stdlib.h>
void func_1(void* args)
{
    while(1) {
        sleep(1);
        printf("this is func_1!\n");
    }
}
void func_2(void* args)
{
    while(1) {
        sleep(2);
        printf("this is func_2!\n");
    }
}
int main()
{
    pthread_t pid1, pid2;
    if(pthread_create(&amp;pid1, NULL, func_1, NULL)) {
        return -1;
    }
    if(pthread_create(&amp;pid2, NULL, func_2, NULL)) {
        return -1;
    }
    while(1) {
        sleep(3);
    }
    return 0;
}

和我们以前编写的程序有所不同,多线程代码需要这样编译,输入gcc thread.c -o thread -lpthread,编译之后你就可以看到thread可执行文件,输入./thread即可。

[test@localhost Desktop]$ ./thread
this is func_1!
this is func_2!
this is func_1!
this is func_1!
this is func_2!
this is func_1!
this is func_1!
this is func_2!
this is func_1!
this is func_1!

linux下的C语言开发(线程等待)
和多进程一样,多线程也有自己的等待函数。这个等待函数就是pthread_join函数。那么这个函数有什么用呢?我们其实可以用它来等待线程运行结束。

#include &lt;stdio.h>
#include &lt;pthread.h>
#include &lt;unistd.h>
#include &lt;stdlib.h>
void func(void* args)
{
    sleep(2);
    printf("this is func!\n");
}
int main()
{
    pthread_t pid;
    if(pthread_create(&amp;pid, NULL, func, NULL)) {
        return -1;
    }
    pthread_join(pid, NULL);
    printf("this is end of main!\n");
    return 0;
}

编写wait.c文件结束之后,我们就可以开始编译了。首先你需要输入gcc wait.c -o wait -lpthread,编译之后你就可以看到wait可执行文件,输入./wait即可。

[test@localhost thread]$ ./thread
this is func!
this is end of main!

linux下的C语言开发(线程互斥)
对于编写多线程的朋友来说,线程互斥是少不了的。在linux下面,编写多线程常用的工具其实是pthread_mutex_t。本质上来说,它和Windows下面的mutex其实是一样的,差别几乎是没有。希望对线程互斥进行详细了解的朋友可以看这里。

#include &lt;stdio.h>
#include &lt;pthread.h>
#include &lt;unistd.h>
#include &lt;stdlib.h>
static int value = 0;
pthread_mutex_t mutex;
void func(void* args)
{
    while(1) {
        pthread_mutex_lock(&amp;mutex);
        sleep(1);
        value ++;
        printf("value = %d!\n", value);
        pthread_mutex_unlock(&amp;mutex);
    }
}
int main()
{
    pthread_t pid1, pid2;
    pthread_mutex_init(&amp;mutex, NULL);
    if(pthread_create(&amp;pid1, NULL, func, NULL)) {
        return -1;
    }
    if(pthread_create(&amp;pid2, NULL, func, NULL)) {
        return -1;
    }
    while(1)
        sleep(0);
    return 0;
}

编写mutex.c文件结束之后,我们就可以开始编译了。首先你需要输入gcc mutex.c -o mutex -lpthread,编译之后你就可以看到mutex可执行文件,输入./mutex即可。

[test@localhost thread]$ ./mutex
value = 1!
value = 2!
value = 3!
value = 4!
value = 5!
value = 6!

linux下的C语言开发(网络编程)
不管在Windows平台下面还是在Linux平台下面,网络编程都是少不了的。在互联网发达的今天,我们的生活基本上已经离不开网络了。我们可以用网络干很多的事情,比如说IM聊天、FTP下载、电子银行、网络购物、在线游戏、电子邮件的收发等等。所以说,对于一个软件的开发者来说,如果说他不会进行网络程序的开发,那真是难以想象的。

在开始介绍网络编程的方法之前,我们可以回忆一下计算机网络的相关知识。目前为止,我们使用的最多网络协议还是tcp/ip网络。通常来说,我们习惯上称为tcp/ip协议栈。至于协议栈分成几层,有两种说法。一种是五层,一种是七层,我个人本身也比较倾向于五层的划分方法。大家可以通过下面的图看看协议栈是怎么划分的。

5、应用层
4、传输层
3、网络层
2、数据链路层
1、物理层

网络的不同层次实现网络的不同功能。物理层主要实现报文的成帧处理;数据链路层完成对报文的优先级的管理,同时实现二层转发和流量控制;网络层实现路由和转发的功能,一方面它需要实现对报文的fragment处理,另外一方面它还需要对路由信息进行处理和保存;传输层实现报文的发送和接受,它利用计数、时序、定时器、重发等机制实现对报文的准确发送,当然这都是tcp的发送机制,而udp一般是不保证报文正确发送和接收的;应用层就是根据传输层的端口信息调用不同的程序来处理传输的内容,端口8080是http报文,端口21是ftp报文等等。上面的逻辑稍显复杂,朋友们可以这么理解,
物理层关心的是如何把电气信号变成一段报文;数据链路层关心的是mac地址、vlan、优先级等;网络层关心的是ip地址,下一跳ip;传输层关心的是端口资源;应用层关心的是报文组装、解析、渲染、存储、执行等等。
目前关于tcp/ip完整协议栈的代码很多,其中我认为写得比较好的还是linux内核/net/ipv4下面的代码。如果朋友们对ipv6的代码感兴趣,也可以看看/net/ipv6的代码。档案如果朋友们对整个协议栈的代码结构理解得不是很清楚,可以参考《linux网络分析与开发》这本书。
当然,作为应用层,我们的其实考虑的不用这么复杂。对于网络程序编写人员来讲,所有网络的资源只要和一个socket关联在一起就可以了。当然在socket可用之前,我们需要为它配置端口信息和ip地址。配置完了之后,我们就可以慢慢等待报文的收发了。所以一般来说,作为服务器端口的处理流程是这样的,
a) 创建socket
b) 绑定socket到特定的ip地址
c) 对socket进行侦听处理
d) 接受socket,表明有客户端和服务器连接
e) 和客户端循环收发报文
f) 关闭socket

作为服务器程序而言,它要对特定的端口进行绑定和侦听处理,这样稍显复杂。但是如果是编写客户端的程序,一切的一切就变得非常简单了,
a) 创建socket
b) 链接服务器端地址
c) 和服务器端的socket收发报文

上面只是对网络编程做了一个基本的介绍,但是好多的东西还是没有涉及到,比如说:
(1) 什么时候该使用udp,什么时候该使用tcp?
(2) 如何把多线程和网络编程联系在一起?
(3) 如何把多进程和网络编程联系在一起?
(4) 如何利用select函数、epoll_create机制、非阻塞函数提高socket的并发处理效率?
(5) linux内核是怎么实现tcp/ip协议的?
(6) 我们自己是否也可以实现协议的处理流程等等?

参考文章:https://blog.csdn.net/weixin_40756041/article/details/88112872

Mysql跳过root密码,并修改root密码方法

1、跳过密码认证

 vim /etc/my.cnf
[mysqld]
skip-grant-tables      //指定位置加一行

改了配置文件,记得重启服务

systemctl restart mysqld       
mysql      //进入到mysql 

mysql> exit

二:更改root密码方式


1:第一种方式
直接在用Linux命令mysqladmin修改。

mysqladmin -u root password “123456”

ubuntu@server:~$ sudo mysqladmin -u root password “123456”
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.


2:第二种方式
登录mysql 更改密码

ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘654321’;

mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘654321’;
Query OK, 0 rows affected (0.00 sec)

mysql>

3、消除跳过密码认证,进入正常mysql

vim /etc/my.cnf     

把刚刚添加的skip-grant-tables注释或者删除

同样,改了配置文件,要重启服务

 systemctl restart mysqld    

使用新密码登入

 mysql -uroot -p'123456'   

参考文章:https://cloud.tencent.com/developer/article/1661445
         https://blog.csdn.net/weixin_52270081/article/details/121539373

MySQL8中的lower_case_table_names忽略大小写配置

在MySQL数据库中我们可以通过配置 lower_case_table_names=1 来让其忽略大小写。在 MySQL 8 以下版本我们很好配置,但在 MySQL 8 中配置起来却有些麻烦。本文将尝试说明其中的问题,并给出解决方式。

lower_case_table_names 的作用

lower_case_table_names 的值:

  • 如果设置为 0,表名将按指定方式存储,并且在对比表名时区分大小写。
  • 如果设置为 1,表名将以小写形式存储在磁盘上,在对比表名时不区分大小写。
  • 如果设置为 2,则表名按给定格式存储,但以小写形式进行比较。

此选项还适用于数据库名称和表别名。有关其他详细信息,请参阅第 9.2.3 节 “标识符区分大小写“。

由于 MySQL 最初依赖于文件系统来作为其数据字典,因此默认设置是依赖于文件系统是否 区分大小写。

在 Windows 上,默认值为 1。在 macOS 上,默认值是 2。在 Linux 上,不支持值 2;服 务器会将该值设置为 0。

在不区分大小写的文件系统上(比如 Windows 或 macOS 中的文件系统),运行 MySQL 时 ,不应使用 --lower_case_table_names=0 。 这将是不受支持的组合。

如果尝试在不区分大小写的文件系统上使用--lower_case_table_names=0 启动服务器, 则会打印错误消息并退出服务器。

如果使用 InnoDB 表,则应在所有平台上将此变量设置为 1,以强制将名称转换为小写。

必须在初始化 MySQL 服务器(安装 MySQL 后的首次启动)之前将 lower_case_table_names 配置为所需的值。 在大多数情况下,这需要在首次启动 MySQL 服务器之前在 MySQL 配置文件中设置 lower_case_table_names 。

但是,当你在 Debian 和 Ubuntu 使用 APT 安装 MySQL 时,系统将自动为您初始化 MySQL,并且没有机会事先在配置文件中设置该值。因此,在使用 APT 安装 MySQL 之前, 必须使用 debconf-set-selection 实用程序来启用小写的表名。为此,请在使用 APT 安 装 MySQL 之前运行此命令(官方给出的命令,我没用过):

1shell> sudo debconf-set-selections <<< "mysql-server mysql-server/lowercase-table-names select Enabled

在 MySQL 8 中,数据目录初始化之后,不再允许更改 lower_case_table_names = 1 的 值;

MySQL 基于某些原因,禁止在重新启动 MySQL 服务时将 lower_case_table_names 设置 成不同于初始化 MySQL 服务时设置的 lower_case_table_names 值。

也就是说启动(重启)MySQL 时,lower_case_table_names的值必须于,初始化 MySQL 时(安装 MySQL 后的首次启动)的值相同。

这种限制是必要的,因为各种数据字典表字段使用的排序 规则基于服务器初始化时的设置,而使用不同设置重新启动服务器将导致标识符的排序和比 较方式不一致。

换一种说法: 一旦 MySQL 的数据目录被初始化后,该数据目录的中的标识符的排序和比较 方式就被确定;而使用不同设置重新启动 MySQL 服务器时,MySQL 服务器检测到其于数据 目录不匹配,将会报错。

如果您尝试使用与 MySQL 初始化时不同的lower_case_table_names值来启动 MySQL 8, 您将收到类似的错误:

1 2 3 4 5# lower_case_table_names 在数据目录的值为 0 ,而 mysql 服务器中的值为 1
2019-04-14T03:57:19.095459Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2019-04-14T03:57:19.097773Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2019-04-14T03:57:19.098425Z 0 [ERROR] [MY-010119] [Server] Aborting
2019-04-14T03:57:20.784893Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15) MySQL Community Server - GPL.

安装 MySQL 8时配置不区分大小写

那么用 lower_case_table_names = 1 初始化 MySQL 8 的步骤是什么?

在 CentOS 中安装MySQL8:

  1. 添加 MySQL YUM repository (添加 MySQL 的 yam 仓库,略)
  2. 卸载当前系统中的其它 MySQL。(如果需要同时安装不同版本的 MySQL,请使用 tarball 发行版。)
  3. 清除数据目录: 为了能够初始化 MySQL,数据目录必须为空。 您可以选择对数据目录 使用非默认位置;也可以删除 /var/lib/mysql 目录。 如果要保留旧的数据目录,请 先进行备份!
  4. 安装 MySQL 8 :通过 yam install
  5. 初始化前指定 lower_case_table_names = 1: 方法,在初次使用 systemd 启动 mysqld 之前,在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1
  6. 初始化: systemctl start mysqld

在 Debian 和 Ubuntu 中:

  • 与之类似,但在安装 MySQL 8 之前,需要借助 debconf-set-selections 运行上文讲 到过的命令。

为已安装的MySQL8设置不区分大小写

  • 停止MySQL
  • 删除数据目录,即删除 /var/lib/mysql 目录
  • 在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1
  • 启动 MySQL

为Docker中的MySQL8容器设置不区分大小写

官方MySQL镜像,是基于 debian 系统的,FROM debian:buster-slim,并在该系统中使用 apt-get 安装 mysql-community-server ;详见其 Dockerfile

使用下面的方式运行 MySQL 8 容器:

设置字符集和排序方式

1docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

然后再来配置 mysql 8 忽略大小写:

  • 先使用上面的命令创建并运行容器 some-mysql
  • 在主机中创建配置文件,比如 /root/docker/mysql8/conf.d/config-file.cnf,文件内容如下:
[mysqld]
  lower_case_table_names = 1

  • 使用下面的命令将该文件复制到容器中
1docker cp /root/docker/mysql8/conf.d/config-file.cnf some-mysql:/etc/mysql/conf.d/
  • 停止容器
  • 删除数据目录,比如删除 /var/lib/mysql
  • 重启容器

参考文章

mysql错误:The MySQL server is running with the –skip-grant-tables option so it cannot execute this statement解决方法


本文为大家讲解的是mysql错误:The MySQL server is running with the –skip-grant-tables option so it cannot execute this statement解决方法,感兴趣的同学参考下。

错误描述:

mysql> grant all on cactidb.* to dbuser@’localhost’ identified by ‘123’;

ERROR 1290 (HY000): The MySQL server is running with the –skip-grant-tables option so it cannot execute this statement

解决方法:

先刷新一下权限表。

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> grant all on cactidb.* to dbuser@’localhost’ identified by ‘123’;

Query OK, 0 rows affected (0.00 sec)

原文博客的链接地址:https://cnblogs.com/qzf/

Debian初始化常用配置,及常用软件安装

开始配置:

1、配置sudo

Debian 11 安装完毕,首先需要授予当前用户sudo权限,否则无法进行系统升级、软件安装。

su root 输入管理员密码切换到root用户下  
vi /etc/sudoers

在# User privilege specification下添加如下内容(username为需要授予权限的用户)  

username ALL=(ALL:ALL) ALL  

如果要设置免密码sudo的话,添加如下内容
username ALL=(ALL:ALL) NOPASSWD:ALL  

然后输入:wq保存退出

2、配置右键打开终端参考文章

安装完后注销重新登录即可

sudo apt-get install caja-open-terminal

3、处理vi/vim无法用backspace删除和无法使用上下左右键移动的问题

sudo vi /etc/vim/vimrc.tiny

添加如下两行

set nocompatible
set backspace=2

4、处理vi/vim鼠标右键进入visual模式无法复制的问题参考文章

比较新的 Debian 系统中内置的 vim 也比较新,vim 有个默认的配置文件位于/usr/share/vim/vim80/defaults.vim,如果没有设置 $HOME/.vimrc 的话,vim 就会读取这个配置文件。

这个配置文件里有一项配置

if has(‘mouse’)  

set mouse=a

endif

导致 vim 默认为 visual 模式,与之前的默认模式不一致,操作不顺手。

我们可以自己新建一个 $HOME/.vimrc 写入自己想要的配置,比如代码高亮

if has(“syntax”)  

syntax on

endif

有了 $HOME/.vimrc 之后就不会读取 /usr/share/vim/vim80/defaults.vim 了。

也可以用shift+insert按键进行插入

5、关闭linux下的主板响声(主板蜂鸣器)

root模式下执行:(参考文章

rmmod pcspkr

echo “blacklist pcspkr” > /etc/modprobe.d/nobeep.conf

5、安装常用软件参考文章

Visual Studio Code(因VS Code开发版更新频繁,Debian 11 微软库速度太慢,所以安装稳定版)

1$ sudo dpkg -i code_1.60.2-1632313585_amd64.deb

FileZilla 开始 > 应用 > 系统 Discover 软件中心搜索下载

Dbeaver(点击可至官网下载)

1$ sudo dpkg -i dbeaver-ce_21.2.1_amd64.deb

WPS Office (点击可至官方网站)建议安装11.1.0.10161,11.1.0.10702提示系统分辨率缩放问题,显示有问题

1$ sudo dpkg -i wps-office_11.1.0.10161_amd64.deb

配置deepin仓库

wget -O- https://deepin-wine.i-m.dev/setup.sh | sh

微信

1# 首次使用,需添加deepin-wine仓库 $ sudo apt install com.qq.weixin.deepin

企业微信

1# 首次使用,需添加deepin-wine仓库 $ sudo apt install com.qq.weixin.work.deepin

QQ/TIM 当前版本TIM容易卡死自动关闭,所以最近在用QQ

TIM

1# 首次使用,需添加deepin-wine仓库 $ sudo apt install com.qq.office.deepin

QQ

1# 首次使用,需添加deepin-wine仓库 $ sudo apt install com.qq.im.deepin

百度网盘(点击可至官网下载)

安装前需要安装两个lib文件

wget http://ftp.de.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_amd64.deb

sudo apt install ./libindicator3-7_0.5.0-4_amd64.deb

wget http://ftp.de.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_amd64.deb

sudo apt install ./libappindicator3-1_0.4.92-7_amd64.deb

安装完lib,再安装百度网盘

sudo apt install ./baidunetdisk_3.5.0_amd64.deb

搜狗输入法

1$ sudo dpkg -i sogoupinyin_2.4.0.3469_amd64.deb

Yandex浏览器参考文章

要获取最新更新,建议从其官方APT存储库安装Yandex浏览器。 首先为Yandex浏览器创建源列表文件

sudo vim /etc/apt/sources.list.d/yandex-browser.list

将以下行添加到文件中。

deb [arch=amd64] http://repo.yandex.ru/yandex-browser/deb beta main

然后按:wq保存并退出

我们还需要下载并导入GPG密钥,以便可以验证从该存储库下载的软件包。

wget https://repo.yandex.ru/yandex-browser/YANDEX-BROWSER-KEY.GPG

sudo apt-key add YANDEX-BROWSER-KEY.GPG

之后,更新本地软件包索引并安装Yandex浏览器。

sudo apt update

sudo apt install yandex-browser-beta

安装后,您可以从Ubuntu Unity Dash或您喜欢的应用程序菜单启动它。

或从命令行。

yandex-browser

Debian 11系统安装

1. 启动镜像

启动镜像,进入安装界面,默认选择第一个图形化安装界面,回车

2. 选择语言

这里选择English语言,然后点击Continue

3.选择所在位置

4. 键盘布局

默认American English,然后点击Continue

5. 设置主机名

默认主机名(hostname)为debian,点击Continue

6. 设置域名

设置域名(Domain name)为jamysong,这里大家可以根据自己的来设定

7. 设置root账户密码

这里我设置root账户密码为root,大家根据自己的来设定,点击Continue

8. 设置用户和密码

(1)设置用户名

(2)设置密码

9. 设置时区

10. 磁盘分区

(1)选择Manual,进行手动磁盘分区模式,如果你不是太熟悉手动磁盘分区,可以选择第一个Guided-use entire disk,这样就可以自动分区了,我这里主要是介绍一下怎么手动进行磁盘分区

(2)选中你的磁盘,这里是53.7G这个,然后点击Continue

(3)选择yes开始创建分区,点击Continue

(4)创建boot(引导)分区

(I)选中下图所示分区,点击Continue

(II) 选中Create a new partition,点击Continue

(III) 输入分区大小,我这里设置的是1GB

(IV)设置分区类型为主分区(Primary)

(V)选择Done setting up the partition,完成boot分区参数设置,点击Continue

(5)创建swap虚拟分区

(I)选中下图所示分区,点击Continue

(II) 选中Create a new partition,点击Continue

(III) 输入分区大小,我这里设置的是2GB

(IV)设置分区类型为逻辑分区(Logical)

(V)选择Done setting up the partition,完成swap分区参数设置,点击Continue

(6) 创建根分区(/)

(I)选中下图所示分区,点击Continue

(II) 选中Create a new partition,点击Continue

(III) 输入分区大小,我这里设置的是剩下的所有,默认即可

(IV)设置分区类型为主分区(Primary)

(V)选择Done setting up the partition,完成swap分区参数设置,点击Continue

(7)执行分区方案,完成分区

这里主要是执行前面步骤中设定的分区方案,如果想重新进行分区,在这一步点击Continue之前还来得及,如果没有问题,直接点击Continue

(8)确认执行分区方案,进行写入磁盘操作

(9)如图所示正在执行分区操作并安装系统,耐心等待。。。。。。

11. 安装其他软件包

这里默认选择no,然后点击Continue

11. 安装系统镜像

这是询问是否使用网络镜像,默认选择no,然后点击Continue

12. 参与软件包使用情况调查

这里默认选择no,不用管这个,点击Continue继续往下走

13. 安装环境

这里选择安装环境,在默认基础上再勾选上SSH server,这个是为了后面可以进行用户ssh客户端软件进行连接,主要是为了方便命令操作和上传下载文件,然后点击Continue进入系统安装

14. 系统正在安装。。。。。

15. 安装引导程序

(1) 这里是安装系统引导程序,默认yes即可,点击Continue

(2) 这里选择你的磁盘就可以,然后点击Continue

16. 系统安装完成

走到这一步说明系统已经安装成功,点击Continue重启进入系统

17. 系统登录

这里直接点击用户名即可,如果你需要切换用户,点击Not listed?

输入用户密码,登录系统

到此登录真正的debian11界面了,大家可以尽情的玩耍了

终端输入cat /etc/os-release查看系统版本,这里确认是debian11

18. root用户登录

Debian安装完后,默认是不允许root用户直接登陆的,处于安全考虑,但是可以先通过普通用户登陆后再su root,然后输入root用户密码登录root用户,但是感觉这个还是比较麻烦的,下面介绍下通过修改配置文件来允许root用户直接登录,主要分两步:

(1)先用普通用户登录进系统,然后 su root,输入root密码切换到root用户,

直接nano /etc/gdm3/daemon.conf 文件,再security下面加上这么一行:AllowRoot = true,然后按Ctrl+X退出并保存,确认保存输入Y,最后按Ctrl+M退出即可

(2)nano /etc/pam.d/gdm-password文件,直接用#注释掉auth required pam_succeed_if.so user != root quiet_success这一行,然后按Ctrl+X保存,确认保存输入Y,再按Ctrl+M退出即可,最后重启系统可用root账户直接登录了

19. SSH登录

直接nano /etc/ssh/sshd_config文件,将PermitRootLogin 设置为yes,PasswordAuthentication设置为yes即可,然后重启sshd服务,就可以使用ssh客户端进行登录了

如下为Xshell登录界面

20. 修改镜像源文件

nano /etc/apt/sources/list文件,注释掉原有的内容,添加如下阿里云的镜像源,

deb http://mirrors.aliyun.com/debian/ bullseye main contrib

deb-src http://mirrors.aliyun.com/debian/ bullseye main contrib

deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib

deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main contrib

deb http://mirrors.aliyun.com/debian/ bullseye-backports main contrib

deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main contrib

deb http://mirrors.aliyun.com/debian/ bullseye-proposed-updates main contrib

deb-src http://mirrors.aliyun.com/debian/ bullseye-proposed-updates main contrib

然后按Ctrl+x保存,确认保存输入Y,最后按Ctrl+M退出,这时候可以执行apt-get update看下系统能否进行更新

参考链接:https://blog.csdn.net/u010080562/article/details/120246284

33、程序包管理之四-编译安装

33.1 程序包编译安装流程

        testapp-VERSION-release.src.rpmà安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装

        源代码à预处理à编译(gcc)à汇编à链接à执行

33.2 源代码组织格式:

        多文件:文件中的代码之间,很可能存在跨文件依赖关系;

        C,C++:make(configureàMakefile.inàmakefile)

        java:maven

33.3 编译安装三步骤

        1、./configure:

                (1)通过选项传递参数,指定启用特性,安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile

                (2)检查依赖到的外部环境

        2、make:

                根据makefile文件,构建应用程序

        3、makeinstall:

        4、开发工具:

                autoconf:生成configure脚本

                automake:生成Makefile.in

33.4 开源程序源代码的获取:

        官方自建站点:

                apache.org(ASF)

                mariadb.org

                …

        代码托管:

                SourceForge

                Github.com

                code.google.com

        C/C++:gcc(GNU C Complier)

33.5 编译C源代码:

        1、前提:提供开发工具及开发环境

                开发工具:make,gcc等,

                开发环境:开发库,头文件

                        glibc:标准库

                通过“包组”提供开发组件

                        CentOS6:“Development Tools”,“Server Platform Development”

        2、配置步骤

        第一步:configure脚本

                选项:指定安装位置,指定启用的特性

                –help:获取其支持使用的选项

                        选项分类:

                                安装路径设定:

                                        –prefix=/PATH/TO/SOMEWHERE:指定默认安装路径

                                        –sysconfigdir=/PATH/TO/SOMEWHERE:配置文件安装位置

                                System types:

                                Optional Features:可选特性

                                        –disable-FEATURE

                                        –enable-FEATURE[=ARG]

                                Optional Packages:可选包

                                        –with-PACKAGE[=ARG]

                                        –without-PACKAGE

        第二步:make

        第三步:make install

        3、安装后的配置:

                (1)导出二进制程序目录至PATH环境变量中;

                        编辑文件/etc/profile.d/NAME.sh

                                export PATH=/PATH/TO/BIN:$PATH

                (2)导出库文件路径

                        编辑/etc/ld.so.conf.d/NAME.conf

                                添加新的库文件所在目录至此文件中

                        让系统重新生成缓存:

                                ldconfig [-v]

                (3)导出头文件

                        基于链接的方式实现

                                ln -sv

                (4)导出帮助手册

                        编辑/etc/man.config文件

                                添加一个MANPATH

联系:

        1、yum的配置和使用;包括yum repository的创建

        2、编译安装apache 2.2;启动此服务;

32、程序包管理之三-yum

32.1 yum简介

        CentOS:yum,dnf

        URL:yum仓库路径

        YUM:yellow dog,Yellowdog Update Modifier

32.2 repository

        1、yum repository: yum repo

                存储了众多的yum包,以及包的相关的元数据文件(放置于特定目录下:repodata);

        2、文件服务器

                ftp://

                http://

                nfs://

                file://

        3、yum 客户端:

                配置文件:

                        /etc/yum.conf:为所有仓库提供公共配置

                        /etc/yum.repos.d/*.repo:为仓库的指向提供配置

                [root@localhost cd-rom]# rpm -qc yum

                /etc/logrotate.d/yum

                /etc/yum.conf

                /etc/yum/version-groups.conf

                仓库指向的定义:

                [repositoryID]

                        name=Some name for this respository

                        baseurl=url://path/to/respository/

                        enabled={1|0}

                        gpgcheck={1|0}

                        gpgkey=URL

                        enablegroups={1|0}

                        failovermethod={roundrobin|priority}

                        默认为roundrobin,意为随机挑选;

                        cost=

                        默认为1000

        4、yum命令的用法

                yum [options] [command] package

        显示仓库列表

                yum repolist [all|enabled|disabled]:显示仓库列表

                [root@localhost cd-rom]# yum repolist all

                Loaded plugins: fastestmirror, langpacks

                Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                repo id                     repo name                    status

                C7.0.1406-base/x86_64       CentOS-7.0.1406 – Base       disabled

                C7.0.1406-centosplus/x86_64 CentOS-7.0.1406 – CentOSPlus disabled

                C7.0.1406-extras/x86_64     CentOS-7.0.1406 – Extras     disabled

                C7.0.1406-fasttrack/x86_64  CentOS-7.0.1406 – CentOSPlus disabled

                C7.0.1406-updates/x86_64    CentOS-7.0.1406 – Updates    disabled

                C7.1.1503-base/x86_64       CentOS-7.1.1503 – Base       disabled

                C7.1.1503-centosplus/x86_64 CentOS-7.1.1503 – CentOSPlus disabled

                C7.1.1503-extras/x86_64     CentOS-7.1.1503 – Extras     disabled

                C7.1.1503-fasttrack/x86_64  CentOS-7.1.1503 – CentOSPlus disabled

                C7.1.1503-updates/x86_64    CentOS-7.1.1503 – Updates    disabled

                C7.2.1511-base/x86_64       CentOS-7.2.1511 – Base       disabled

                C7.2.1511-centosplus/x86_64 CentOS-7.2.1511 – CentOSPlus disabled

                C7.2.1511-extras/x86_64     CentOS-7.2.1511 – Extras     disabled

                C7.2.1511-fasttrack/x86_64  CentOS-7.2.1511 – CentOSPlus disabled

                C7.2.1511-updates/x86_64    CentOS-7.2.1511 – Updates    disabled

                C7.3.1611-base/x86_64       CentOS-7.3.1611 – Base       disabled

                C7.3.1611-centosplus/x86_64 CentOS-7.3.1611 – CentOSPlus disabled

                C7.3.1611-extras/x86_64     CentOS-7.3.1611 – Extras     disabled

                C7.3.1611-fasttrack/x86_64  CentOS-7.3.1611 – CentOSPlus disabled

                C7.3.1611-updates/x86_64    CentOS-7.3.1611 – Updates    disabled

                !base/7/x86_64              CentOS-7 – Base              enabled: 10,072

                base-debuginfo/x86_64       CentOS-7 – Debuginfo         disabled

                base-source/7               CentOS-7 – Base Sources      disabled

                c7-media                    CentOS-7 – Media             disabled

                centosplus/7/x86_64         CentOS-7 – Plus              disabled

                centosplus-source/7         CentOS-7 – Plus Sources      disabled

                cr/7/x86_64                 CentOS-7 – cr                disabled

                !extras/7/x86_64            CentOS-7 – Extras            enabled:    476

                extras-source/7             CentOS-7 – Extras Sources    disabled

                fasttrack/7/x86_64          CentOS-7 – fasttrack         disabled

                !updates/7/x86_64           CentOS-7 – Updates           enabled:  2,189

                updates-source/7            CentOS-7 – Updates Sources   disabled

                repolist: 12,737

                [root@localhost cd-rom]# 

        显示程序包

                yum list [all|glob_exp]:显示所有程序包或者自定义的程序包

                yum list {avaliable|installed|updates} [glob_exp]

                [root@localhost cd-rom]# yum list all | head -20

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                Installed Packages

                GConf2.x86_64                               3.2.6-8.el7                @anaconda

                GeoIP.x86_64                                1.5.0-11.el7               @anaconda

                ModemManager.x86_64                         1.6.0-2.el7                @anaconda

                ModemManager-glib.x86_64                    1.6.0-2.el7                @anaconda

                NetworkManager.x86_64                       1:1.8.0-9.el7              @anaconda

                NetworkManager-adsl.x86_64                  1:1.8.0-9.el7              @anaconda

                NetworkManager-glib.x86_64                  1:1.8.0-9.el7              @anaconda

                NetworkManager-libnm.x86_64                 1:1.8.0-9.el7              @anaconda

                NetworkManager-libreswan.x86_64             1.2.4-2.el7                @anaconda

                NetworkManager-libreswan-gnome.x86_64       1.2.4-2.el7                @anaconda

                NetworkManager-ppp.x86_64                   1:1.8.0-9.el7              @anaconda

                NetworkManager-team.x86_64                  1:1.8.0-9.el7              @anaconda

                NetworkManager-tui.x86_64                   1:1.8.0-9.el7              @anaconda

                NetworkManager-wifi.x86_64                  1:1.8.0-9.el7              @anaconda

                Exiting on Broken Pipe

                [root@localhost cd-rom]# 

        安装程序包

                yum install package

                yum reinstall package重新安装

                [root@localhost cd-rom]# yum reinstall zsh

                Loaded plugins: fastestmirror, langpacks

                No Match for argument: zsh

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                Package(s) zsh available, but not installed.

                Error: Nothing to do

                [root@localhost cd-rom]# yum install zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                Resolving Dependencies

                –> Running transaction check

                —> Package zsh.x86_64 0:5.0.2-34.el7_8.2 will be installed

                –> Finished Dependency Resolution

                Dependencies Resolved

                ===============================================================================================================================================================

                 Package                          Arch                                Version                                          Repository                         Size

                ===============================================================================================================================================================

                Installing:

                 zsh                              x86_64                              5.0.2-34.el7_8.2                                 base                              2.4 M

                Transaction Summary

                ===============================================================================================================================================================

                Install  1 Package

                Total download size: 2.4 M

                Installed size: 5.6 M

                Is this ok [y/d/N]: y

                Downloading packages:

                zsh-5.0.2-34.el7_8.2.x86_64.rpm                                                                                                         | 2.4 MB  00:00:03     

                Running transaction check

                Running transaction test

                Transaction test succeeded

                Running transaction

                  Installing : zsh-5.0.2-34.el7_8.2.x86_64                                                                                                                 1/1 

                  Verifying  : zsh-5.0.2-34.el7_8.2.x86_64                                                                                                                 1/1 

                Installed:

                  zsh.x86_64 0:5.0.2-34.el7_8.2                                                                                                                                

                Complete!

                [root@localhost cd-rom]# 

        升级程序包

                yum update package

                yum downgrade package降级程序包

                [root@localhost cd-rom]# yum update zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                No packages marked for update

                [root@localhost cd-rom]# yum downgrade zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                Nothing to do

                [root@localhost cd-rom]# 

        检查可用升级

                yum check-update package

                [root@localhost cd-rom]# yum check-update python

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                python.x86_64                                  2.7.5-90.el7                                  updates

                [root@localhost cd-rom]# 

        卸载程序包

                yum remove|erase package

                [root@localhost cd-rom]# yum remove zsh.x86_64 

                Loaded plugins: fastestmirror, langpacks

                Resolving Dependencies

                –> Running transaction check

                —> Package zsh.x86_64 0:5.0.2-34.el7_8.2 will be erased

                –> Finished Dependency Resolution

                Dependencies Resolved

                ====================================================================================================

                 Package           Arch                 Version                           Repository           Size

                ====================================================================================================

                Removing:

                 zsh               x86_64               5.0.2-34.el7_8.2                  @base               5.6 M

                Transaction Summary

                ====================================================================================================

                Remove  1 Package

                Installed size: 5.6 M

                Is this ok [y/N]: y

                Downloading packages:

                Running transaction check

                Running transaction test

                Transaction test succeeded

                Running transaction

                  Erasing    : zsh-5.0.2-34.el7_8.2.x86_64                                                      1/1 

                  Verifying  : zsh-5.0.2-34.el7_8.2.x86_64                                                      1/1 

                Removed:

                  zsh.x86_64 0:5.0.2-34.el7_8.2                                                                     

                Complete!

                [root@localhost cd-rom]# 

        查看程序包information

                yum info package

                [root@localhost cd-rom]# yum info zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                Installed Packages

                Name        : zsh

                Arch        : x86_64

                Version     : 5.0.2

                Release     : 34.el7_8.2

                Size        : 5.6 M

                Repo        : installed

                From repo   : base

                Summary     : Powerful interactive shell

                URL         : http://zsh.sourceforge.net/

                License     : MIT

                Description : The zsh shell is a command interpreter usable as an interactive login

                            : shell and as a shell script command processor.  Zsh resembles the ksh

                            : shell (the Korn shell), but includes many enhancements.  Zsh supports

                            : command line editing, built-in spelling correction, programmable

                            : command completion, shell functions (with autoloading), a history

                            : mechanism, and more.

                [root@localhost cd-rom]# 

        查看指定的特性(可以是某文件)是由哪个程序包所提供

                yum provides|whatprovides package

                [root@localhost cd-rom]# yum provides zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                zsh-5.0.2-34.el7_8.2.x86_64 : Powerful interactive shell

                Repo        : base

                zsh-5.0.2-34.el7_8.2.x86_64 : Powerful interactive shell

                Repo        : @base

                [root@localhost cd-rom]# yum whatprovides zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.ustc.edu.cn

                zsh-5.0.2-34.el7_8.2.x86_64 : Powerful interactive shell

                Repo        : base

                zsh-5.0.2-34.el7_8.2.x86_64 : Powerful interactive shell

                Repo        : @base

                [root@localhost cd-rom]# 

        清理本地缓存

                yum clean all|packages|metadate…

                [root@localhost cd-rom]# yum clean all

                Loaded plugins: fastestmirror, langpacks

                Cleaning repos: base extras updates

                Cleaning up everything

                Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos

                Cleaning up list of fastest mirrors

                [root@localhost cd-rom]# yum clean zsh

                Loaded plugins: fastestmirror, langpacks

                Error: invalid clean argument: ‘zsh’

                 Mini usage:

                clean [headers|packages|metadata|dbcache|plugins|expire-cache|all]

                Remove cached data

                [root@localhost cd-rom]# yum clean packages 

                Loaded plugins: fastestmirror, langpacks

                Cleaning repos: base extras updates

                0 package files removed

                [root@localhost cd-rom]# 

        构建缓存

                yum makecache

                [root@localhost cd-rom]# yum makecache

                Loaded plugins: fastestmirror, langpacks

                base                                                                         | 3.6 kB  00:00:00     

                extras                                                                       | 2.9 kB  00:00:00     

                updates                                                                      | 2.9 kB  00:00:00     

                (1/10): base/7/x86_64/primary_db                                             | 6.1 MB  00:00:00     

                (2/10): base/7/x86_64/group_gz                                               | 153 kB  00:00:01     

                (3/10): extras/7/x86_64/filelists_db                                         | 235 kB  00:00:00     

                (4/10): updates/7/x86_64/filelists_db                                        | 5.5 MB  00:00:00     

                (5/10): updates/7/x86_64/primary_db                                          | 9.5 MB  00:00:00     

                (6/10): extras/7/x86_64/primary_db                                           | 242 kB  00:00:00     

                (7/10): updates/7/x86_64/other_db                                            | 681 kB  00:00:00     

                (8/10): extras/7/x86_64/other_db                                             | 143 kB  00:00:01     

                (9/10): base/7/x86_64/other_db                                               | 2.6 MB  00:00:03     

                (10/10): base/7/x86_64/filelists_db                                          | 7.2 MB  00:00:07     

                Determining fastest mirrors

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.163.com

                Metadata Cache Created

                [root@localhost cd-rom]# 

        搜索

                yum search string

                以指定的关键字搜索程序包名及summary信息

                [root@localhost cd-rom]# yum search zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.163.com

                ========================================= N/S matched: zsh =========================================

                zsh-html.x86_64 : Zsh shell manual in html format

                zsh.x86_64 : Powerful interactive shell

                  Name and summary matches only, use “search all” for everything.

                [root@localhost cd-rom]# 

        查看指定报名所依赖的compabilities;

                yum deplist package

                [root@localhost cd-rom]# yum deplist zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.163.com

                package: zsh.x86_64 5.0.2-34.el7_8.2

                  dependency: /bin/sh

                   provider: bash.x86_64 4.2.46-34.el7

                  dependency: /sbin/install-info

                   provider: info.x86_64 5.1-5.el7

                  dependency: coreutils

                   provider: coreutils.x86_64 8.22-24.el7_9.2

                  dependency: grep

                   provider: grep.x86_64 2.20-3.el7

                  dependency: libc.so.6(GLIBC_2.15)(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libdl.so.2()(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libdl.so.2(GLIBC_2.2.5)(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libm.so.6()(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libm.so.6(GLIBC_2.2.5)(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libncursesw.so.5()(64bit)

                   provider: ncurses-libs.x86_64 5.9-14.20130511.el7_4

                  dependency: librt.so.1()(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: librt.so.1(GLIBC_2.2.5)(64bit)

                   provider: glibc.x86_64 2.17-324.el7_9

                  dependency: libtinfo.so.5()(64bit)

                   provider: ncurses-libs.x86_64 5.9-14.20130511.el7_4

                  dependency: rtld(GNU_HASH)

                   provider: glibc.x86_64 2.17-324.el7_9

                   provider: glibc.i686 2.17-324.el7_9

                [root@localhost cd-rom]# 

        查看yum事务历史

                yum history

                [root@localhost cd-rom]# yum history 

                Loaded plugins: fastestmirror, langpacks

                ID     | Login user               | Date and time    | Action(s)      | Altered

                ——————————————————————————-

                     9 | root <root>              | 2021-08-02 23:39 | Install        |    1   

                     8 | root <root>              | 2021-08-02 23:38 | Erase          |    1   

                     7 | root <root>              | 2021-08-02 23:35 | Install        |    1   

                     6 | root <root>              | 2021-08-02 23:35 | Erase          |    1 E<

                     5 |  <oracle>                | 2021-05-26 00:05 | Install        |    1 > 

                     4 |  <oracle>                | 2021-05-25 23:48 | Install        |    1   

                     3 |  <oracle>                | 2021-05-25 22:58 | I, U           |   11   

                     2 | daniel <daniel>          | 2021-05-25 22:26 | I, U           |   41 EE

                     1 | System <unset>           | 2021-05-19 21:06 | Install        | 1255   

                history list

                [root@localhost cd-rom]# 

        安装及升级本地程序包

                yum localinstall rpmfile

                yum localupdate rpmfile

                [root@localhost cd-rom]# yum localinstall ./Packages/zsh-5.0.2-28.el7.x86_64.rpm 

                Loaded plugins: fastestmirror, langpacks

                Examining ./Packages/zsh-5.0.2-28.el7.x86_64.rpm: zsh-5.0.2-28.el7.x86_64

                Marking ./Packages/zsh-5.0.2-28.el7.x86_64.rpm to be installed

                Resolving Dependencies

                –> Running transaction check

                —> Package zsh.x86_64 0:5.0.2-28.el7 will be installed

                –> Finished Dependency Resolution

                Dependencies Resolved

                ====================================================================================================

                 Package        Arch              Version                 Repository                           Size

                ====================================================================================================

                Installing:

                 zsh            x86_64            5.0.2-28.el7            /zsh-5.0.2-28.el7.x86_64            5.6 M

                Transaction Summary

                ====================================================================================================

                Install  1 Package

                Total size: 5.6 M

                Installed size: 5.6 M

                Is this ok [y/d/N]: y

                Downloading packages:

                Running transaction check

                Running transaction test

                Transaction test succeeded

                Running transaction

                  Installing : zsh-5.0.2-28.el7.x86_64                                                          1/1 

                  Verifying  : zsh-5.0.2-28.el7.x86_64                                                          1/1 

                Installed:

                  zsh.x86_64 0:5.0.2-28.el7                                                                         

                Complete!

                [root@localhost cd-rom]# 

        包组管理的相关命令

                groupinstall

                groupupdate

                grouplist

                groupremove

                groupinfo

                [root@localhost cd-rom]# yum grouplist

                Loaded plugins: fastestmirror, langpacks

                There is no installed groups file.

                Maybe run: yum groups mark convert (see man yum)

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.163.com

                Available Environment Groups:

                   Minimal Install

                   Compute Node

                   Infrastructure Server

                   File and Print Server

                   Basic Web Server

                   Virtualization Host

                   Server with GUI

                   GNOME Desktop

                   KDE Plasma Workspaces

                   Development and Creative Workstation

                Available Groups:

                   Compatibility Libraries

                   Console Internet Tools

                   Development Tools

                   Graphical Administration Tools

                   Legacy UNIX Compatibility

                   Scientific Support

                   Security Tools

                   Smart Card Support

                   System Administration Tools

                   System Management

                Done

                [root@localhost cd-rom]# yum groupinstall “Basic Web Server”

                Loaded plugins: fastestmirror, langpacks

                There is no installed groups file.

                Maybe run: yum groups mark convert (see man yum)

                Loading mirror speeds from cached hostfile

                 * base: mirrors.cn99.com

                 * extras: mirrors.cn99.com

                 * updates: mirrors.163.com

                Resolving Dependencies

                –> Running transaction check

                —> Package bpftool.x86_64 0:3.10.0-1160.36.2.el7 will be installed

                —> Package crypto-utils.x86_64 0:2.4.1-42.el7 will be installed

                –> Processing Dependency: perl(Newt) for package: crypto-utils-2.4.1-42.el7.x86_64

                –> Processing Dependency: kernel(___ratelimit) = 0x155f4108 for package: kmod-kvdo-6.1.3.23-5.el7.x86_64

                –> Processing Dependency: kernel >= 3.10.0-1133.el7 for package: kmod-kvdo-6.1.3.23-5.el7.x86_64

                —> Package lshw.x86_64 0:B.02.18-17.el7 will be installed

                —> Package mod_fcgid.x86_64 0:2.3.9-6.el7 will be installed

                —> Package libselinux-utils.x86_64 0:2.5-15.el7 will be an update

                –> Processing Dependency: libselinux(x86-64) = 2.5-15.el7 for package: libselinux-utils-2.5-15.el7.x86_64

                —> Package libsemanage.x86_64 0:2.5-8.el7 will be updated

                –> Processing Dependency: libsemanage = 2.5-8.el7 for package: libsemanage-python-2.5-11.el7.x86_64

                —> Package libselinux.x86_64 0:2.5-15.el7 will be an update

                —> Package libsemanage-python.x86_64 0:2.5-8.el7 will be updated

                —> Package libsemanage-python.x86_64 0:2.5-14.el7 will be an update

                —> Package setools-libs.x86_64 0:3.3.8-1.1.el7 will be updated

                —> Package setools-libs.x86_64 0:3.3.8-4.el7 will be an update

                –> Running transaction check

                —> Package libselinux-python.x86_64 0:2.5-11.el7 will be updated

                —> Package libselinux-python.x86_64 0:2.5-15.el7 will be an update

                –> Finished Dependency Resolution

                Dependencies Resolved

                ====================================================================================================

                 Package                       Arch         Version                             Repository     Size

                ====================================================================================================

                64       2.4.6-97.el7.centos                 updates        93 k

                 libyaml                       x86_64       0.1.4-11.el7_0                      base           55 k

                 mailcap                       noarch       2.1.41-2.el7                        base           31 k

                 perl-Newt                     x86_64       1.08-36.el7                         base           64 k

                Updating for dependencies:

                 libselinux                    x86_64       2.5-15.el7                          base          162 k

                 libselinux-python             x86_64       2.5-15.el7                          base          236 k

                 libselinux-utils              x86_64       2.5-15.el7                          base          151 k

                 libsemanage                   x86_64       2.5-14.el7                          base          151 k

                 libsemanage-python            x86_64       2.5-14.el7                          base          113 k

                 libsepol                      x86_64       2.5-10.el7                          base          297 k

                 linux-firmware                noarch       20200421-80.git78c0348.el7_9        updates        80 M

                 policycoreutils               x86_64       2.5-34.el7                          base          917 k

                 policycoreutils-python        x86_64       2.5-34.el7                          base          457 k

                 python                        x86_64       2.7.5-90.el7                        updates        96 k

                 python-libs                   x86_64       2.7.5-90.el7                        updates       5.6 M

                 selinux-policy                noarch       3.13.1-268.el7_9.2                  updates       498 k

                 setools-libs                  x86_64       3.3.8-4.el7                         base          620 k

                 sg3_utils-libs                x86_64       1:1.37-19.el7                       base           65 k

                Transaction Summary

                ====================================================================================================

                Install  11 Packages (+ 7 Dependent packages)

                Upgrade   1 Package  (+14 Dependent packages)

                Total download size: 162 M

                Is this ok [y/d/N]: 

32.3 本地yum仓库配置

        1、如何使用光盘当作本地yum仓库:

                (1)挂载光盘至某目录,例如/media/cdrom

                        [root@localhost /]# mkdir /media/cdrom

                        [root@localhost /]# mount -r -t iso9660 /dev/cdrom /media/cdrom

                (2)创建配置文件

                        [base]

                        name=CentOSlocal

                        #mirrorlist=file:///opt/yum.repo/

                        baseurl=file:///media/cdrom

                        gpgcheck=1

                        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

        2、yum的命令行选项

                –nogpgcheck:禁止进行gpg check

                –y:自动回复yes

                –q:静默模式

                –disablerepo=repoidglob:临时禁用此处指定的repo;

                –enablerepo=repoidglob:临时禁用此处指定的repo;

                –noplugins:禁用所有插件

        3、yum的repo配置文件中可用的变量

                $releasesever:当前OS的发行版的主版本号

                $arch:平台

                $basearch:基础平台

                $YUM0-$YUM9

        4、创建yum仓库

                createrepo [options] <directory>

                repo格式

                        [base]

                        name=CentOS-$releasever – test

                        #mirrorlist=file:///opt/yum.repo

                        baseurl=file:///opt/yum.repo

                        gpgcheck=1

                        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

                [root@localhost yum.repo]# createrepo /opt/yum.repo/

                Spawning worker 0 with 974 pkgs

                Spawning worker 1 with 974 pkgs

                Spawning worker 2 with 973 pkgs

                Spawning worker 3 with 973 pkgs

                Workers Finished

                Saving Primary metadata

                Saving file lists metadata

                Saving other metadata

                Generating sqlite DBs

                Sqlite DBs complete

                [root@localhost yum.repo]# yum clean all

                Loaded plugins: fastestmirror, langpacks

                Cleaning repos: base

                Cleaning up everything

                Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos

                [root@localhost yum.repo]# rm -rf /var/cache/yum

                [root@localhost yum.repo]# vim /etc/yum.repos.d/CentOS-Base.repo 

                [root@localhost yum.repo]# yum repolist 

                Loaded plugins: fastestmirror, langpacks

                base                                                                                                                                    | 2.9 kB  00:00:00     

                base/primary_db                                                                                                                         | 3.0 MB  00:00:00     

                Determining fastest mirrors

                repo id                                                                 repo name                                                                        status

                base                                                                    CentOS-7 – test                                                                  3,894

                repolist: 3,894

                [root@localhost yum.repo]# ll /opt/yum.repo/ | wc -l

                3897

                [root@localhost yum.repo]# yum install z

                zenity-3.22.0-1.el7.x86_64.rpm      zlib-devel-1.2.7-17.el7.x86_64.rpm  zsh.x86_64                          

                zip-3.0-11.el7.x86_64.rpm           zlib-devel.x86_64                   zziplib-0.13.62-5.el7.x86_64.rpm    

                zlib-1.2.7-17.el7.x86_64.rpm        zsh-5.0.2-28.el7.x86_64.rpm         zziplib.x86_64                      

                [root@localhost yum.repo]# yum install z

                zenity-3.22.0-1.el7.x86_64.rpm      zlib-devel-1.2.7-17.el7.x86_64.rpm  zsh.x86_64                          

                zip-3.0-11.el7.x86_64.rpm           zlib-devel.x86_64                   zziplib-0.13.62-5.el7.x86_64.rpm    

                zlib-1.2.7-17.el7.x86_64.rpm        zsh-5.0.2-28.el7.x86_64.rpm         zziplib.x86_64                      

                [root@localhost yum.repo]# yum install zsh

                Loaded plugins: fastestmirror, langpacks

                Loading mirror speeds from cached hostfile

                Resolving Dependencies

                –> Running transaction check

                —> Package zsh.x86_64 0:5.0.2-28.el7 will be installed

                –> Finished Dependency Resolution

                Dependencies Resolved

                ===============================================================================================================================================================

                 Package                           Arch                                 Version                                       Repository                          Size

                ===============================================================================================================================================================

                Installing:

                 zsh                               x86_64                               5.0.2-28.el7                                  base                               2.4 M

                Transaction Summary

                ===============================================================================================================================================================

                Install  1 Package

                Total download size: 2.4 M

                Installed size: 5.6 M

                Is this ok [y/d/N]: y

                Downloading packages:

                Running transaction check

                Running transaction test

                Transaction test succeeded

                Running transaction

                  Installing : zsh-5.0.2-28.el7.x86_64                                                                                                                     1/1 

                  Verifying  : zsh-5.0.2-28.el7.x86_64                                                                                                                     1/1 

                Installed:

                  zsh.x86_64 0:5.0.2-28.el7                                                                                                                                    

                Complete!

                [root@localhost yum.repo]# yum list | grep zsh

                zsh.x86_64                              5.0.2-28.el7                   @base    

                [root@localhost yum.repo]# 

31、程序包管理之二-rpm

31.1 Centos系统上使用rpm管理安装包

安装,卸载,更新,查询,校验,数据库维护

31.1.1 安装:

        rpm {-i|–install} [install options] package

                -v:verbos

                -vv:显示更多的详细信息

                -h:以#显示程序包管理执行进度,每#表示2%的进度

        rpm -ivh packagefile

                [install-option]

                        –test:测试安装,但不真正执行安装过程

                        –nodeps:忽略依赖关系

                        –replacepkgs:重新安装

                        –nosignature:不检查来源合法性

                        –nodigest:不检查包完整性;

                        –noscripts:不执行程序包脚本片段preun

                                %pre:安装前脚本      –nopre

                                %post:安装后脚本    –nopost1

                                %preun:卸载前脚本 –nopreun

                                %postun:卸载后脚本–nopostun

        [root@localhost ~]# rpm -qa | grep zsh

        [root@localhost ~]# cd /media/cd-rom/Packages/

        [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm –test

        Preparing…                          ################################# [

        [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm

        Preparing…                          ################################# [100%]

        Updating / installing…

           1:zsh-5.0.2-28.el7                 ################################# [100%]

        [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm –replace

        –replacefiles  –replacepkgs   

        [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm –replace

        –replacefiles  –replacepkgs   

        [root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm –replacepkgs 

        Preparing…                          ################################# [100%]

        Updating / installing…

           1:zsh-5.0.2-28.el7                 ################################# [100%]

        [root@localhost Packages]# 

31.1.2 升级

        rpm {-U|–upgrade} [install options] package

        rpm {-F|–freshen} [install options] package

        upgrade:安装有旧版程序包,则升级;如果不存在旧版程序包,则安装

        freeshen:安装有旧版程序包,则升级;如果不存在旧版程序包,则不执行

        rpm -Uvh package

        rpm -fvh package

        –oldpackage:降级

        –force:强行升级

        [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm

        Preparing…                          ################################# [100%]

            package zsh-5.0.2-28.el7.x86_64 is already installed

        [root@localhost Packages]# rpm -Fvh zsh-5.0.2-28.el7.x86_64.rpm

        [root@localhost Packages]# rpm -e zsh 

        [root@localhost Packages]# rpm -Fvh zsh-5.0.2-28.el7.x86_64.rpm

        [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm

        Preparing…                          ################################# [100%]

        Updating / installing…

           1:zsh-5.0.2-28.el7                 ################################# [100%]

        [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm –force

        Preparing…                          ################################# [100%]

        Updating / installing…

           1:zsh-5.0.2-28.el7                 ################################# [100%]

        [root@localhost Packages]# 

注意:(1)不要对内核做升级操作;linux支持多内核版本并存,因此直接安装新版本内核即可

        (2)如果对元程序包的配置文件安装后曾被修改,升级时,新版本提供的配置文件并不会直接覆盖旧版本的配置文件,而是把新版本的文件重命名后保存(filename.rpmnew)

31.1.3 查询

        rpm {-q|–query} [select options] [quire options]

                [select options]

                        -a:所有包

                        -f:查看指定文件由那个程序包安装生成

                        -p /PATH/TO/PACKAGE:针对尚未安装的程序文件做查询操作

                        –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供

                        –whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

                [quire options]

                        –changelog:查询rpm包的changelog

                        -c:查询程序的配置文件

                        -d:查询程序的文档

                        -i:information

                        -l:查看指定程序包安装后生成的所有文件

                        –scripts:查看程序包自带的脚本片段

                        -R:查询指定的程序包所依赖的CAPABILITY

                        –provides:列出指定程序包所提供的CAPABILITY

        用法:

                -qi PACKAGE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE,

                -qf FILE,

                -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,…

                -qa

        [root@localhost Packages]# rpm -qf zsh 

        error: file /media/cd-rom/Packages/zsh: No such file or directory

        [root@localhost Packages]# rpm -qi zsh 

        Name        : zsh

        Version     : 5.0.2

        Release     : 28.el7

        Architecture: x86_64

        Install Date: Mon 02 Aug 2021 11:11:00 PM EDT

        Group       : System Environment/Shells

        Size        : 5855982

        License     : MIT

        Signature   : RSA/SHA256, Thu 10 Aug 2017 04:28:17 PM EDT, Key ID 24c6a8a7f4a80eb5

        Source RPM  : zsh-5.0.2-28.el7.src.rpm

        Build Date  : Wed 02 Aug 2017 06:52:37 AM EDT

        Build Host  : c1bm.rdu2.centos.org

        Relocations : (not relocatable)

        Packager    : CentOS BuildSystem <http://bugs.centos.org>

        Vendor      : CentOS

        URL         : http://zsh.sourceforge.net/

        Summary     : Powerful interactive shell

        Description :

        The zsh shell is a command interpreter usable as an interactive login

        shell and as a shell script command processor.  Zsh resembles the ksh

        shell (the Korn shell), but includes many enhancements.  Zsh supports

        command line editing, built-in spelling correction, programmable

        command completion, shell functions (with autoloading), a history

        mechanism, and more.

        [root@localhost Packages]# rpm -qf /bin/zsh 

        zsh-5.0.2-28.el7.x86_64

        [root@localhost Packages]# rpm -qpi zsh-5.0.2-28.el7.x86_64.rpm 

        Name        : zsh

        Version     : 5.0.2

        Release     : 28.el7

        Architecture: x86_64

        Install Date: (not installed)

        Group       : System Environment/Shells

        Size        : 5855982

        License     : MIT

        Signature   : RSA/SHA256, Thu 10 Aug 2017 04:28:17 PM EDT, Key ID 24c6a8a7f4a80eb5

        Source RPM  : zsh-5.0.2-28.el7.src.rpm

        Build Date  : Wed 02 Aug 2017 06:52:37 AM EDT

        Build Host  : c1bm.rdu2.centos.org

        Relocations : (not relocatable)

        Packager    : CentOS BuildSystem <http://bugs.centos.org>

        Vendor      : CentOS

        URL         : http://zsh.sourceforge.net/

        Summary     : Powerful interactive shell

        Description :

        The zsh shell is a command interpreter usable as an interactive login

        shell and as a shell script command processor.  Zsh resembles the ksh

        shell (the Korn shell), but includes many enhancements.  Zsh supports

        command line editing, built-in spelling correction, programmable

        command completion, shell functions (with autoloading), a history

        mechanism, and more.

        [root@localhost Packages]# rpm -qa | head -3

        cups-pk-helper-0.2.6-2.el7.x86_64

        teamd-1.25-5.el7.x86_64

        ipxe-roms-qemu-20170123-1.git4e85b27.el7.noarch

        [root@localhost Packages]# 

31.1.4 卸载:

        rpm {-e|–erase} PACKAGE_NAME

        [root@localhost Packages]# rpm -e zsh 

        [root@localhost Packages]# rpm -qa | grep zsh

        [root@localhost Packages]# 

31.1.5 检验:

rpm {-V|–verify} [select-options] [verify-options]

        S file Size differs

        M Mode differs (includes permissions and file type)

        5 digest (formerly MD5 sum) differs

        D Device major/minor number mismatch

        L readLink(2) path mismatch

        U User ownership differs

        G Group ownership differs

        T mTime differs

        P caPabilities differ

[root@localhost Packages]# vim /usr/share/doc/zsh-5.0.2/MACHINES

[root@localhost Packages]# rpm -V zsh 

S.5….T.  d /usr/share/doc/zsh-5.0.2/MACHINES

missing   d /usr/share/man/man1/zshzle.1.gz

[root@localhost Packages]# 

31.1.6 包来源合法性及完整性验证

        完整性验证:SHA256

        来源合法性验证:RSA

         数据加密方法:

                (1)对称加密:加密和解密使用同一个密码

                (2)公钥加密(非对称加密):每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key),一个用来加密,一个用来解密

                (3)单向加密,散列加密(可以由明文取得密文,但不能由密文取得明文):提取数据特征码,常用于数据完整性校验

            单向加密特点

                雪崩效应(蝴蝶效应):初始条件的微小改变会引起结果的巨大改变

                [root@Daniel-R480 ~]# cp /etc/inittab ./

                [root@Daniel-R480 ~]# md5sum inittab

                66a88d6c4d693170753ea3382f8bc150  inittab

                [root@Daniel-R480 ~]# vim inittab

                -bash: vim: command not found

                [root@Daniel-R480 ~]# vi inittab

                [root@Daniel-R480 ~]# md5sum inittab

                568c018aebe36cf208fc32c465e4b120  inittab

                定长输出

                    MD5:Message Digest, 128位定长输出

                    SHA1:Secure Hash Algorithm, 160位定长输出

                密码前面一般会有加上的杂质(salt),防止相同用户的密码显示的密文相同

31.1.7 导入所需要的公钥

        rpm -import /PATH/FROM/GPG-PUBKEY-FILE

        CentOS 7 发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

        [root@localhost cd-rom]# rpm -import RPM-GPG-KEY-CentOS-7

        [root@localhost cd-rom]#

31.1.8 数据库重建

        rpm {–initdb|–rebuilddb}

                initdb:初始化

                        如果事先不存在数据库则新建之,否则,不执行任何操作

                rebuilddb:重建

                        无论当前存在与否,直接重新创建数据库;

        [root@localhost cd-rom]# rpm –initdb

        [root@localhost cd-rom]# rpm –rebuilddb 

        [root@localhost cd-rom]# 

30、程序包管理之一-程序及库简介

30.1 程序及库简介

30.1.1 POSIX

        API:Application Program Interface

        POSIX:Portable OS,定义了不同系统如何提供统一的API

30.1.2 程序运行流程

        程序源代码à预处理à编译à汇编à链接

                静态编译

                共享编译:.so

30.1.3 Windows和Linux程序兼容方式

        ABI:Application Binary Interface

                Windows与Linux的ABI不兼容

        库级别的虚拟化

                WINE:Windows库的虚拟化,让Windows程序可在Linux上运行

                cywin:Linux库的虚拟化,让Linux程序可在Windows上运行

30.1.4 应用程序开发

        系统级开发(面向底层进行开发)

                C,C++

        应用级开发(面向系统和库进行开发)

                java,python,phpdeb,perl,ruby

        二进制应用程序的组成部分:

                二进制文件,库文件,配置文件,帮助文件

30.2程序包管理

30.2.1 程序包管理器:

        debian:包名deb,包管理器dpt

        redhat:包名rpm,包管理器rpm(Redhat Package Manager)

                RPM is Package Manager(C语言研发)

        Gentoo

        Archlinux

30.2.2 程序源代码及rpm包

1、程序源代码:name-VERSION.tar.gz

        VERSION:major.monor.release

2、rpm包

        命名方式

                name-VERSION-ARCH.rpm

                        VERSION:major.monor.release

                        ARCH:release(rpm包的release).os(支持的linux型号).arch(支持的cpu型号)

                常见的arch:

                        x86:i386,i486,i586,i686

                        x86_64:x64,x86_64,amd64

                        powerpc:ppc

                        跟平台无关:noarch

        例:zlib-1.2.7-17.el7.x86_64.rpm

        程序包拆包

                testapp:

                        testapp-VERSION-ARCH.rpm:主包

                        testapp-devel-VERSION-RACH.rpm:支包

                        testapp-testing-VERSION-RACH.rpm

        依赖关系

                X依赖Y,Y依赖Z

        ldd + 程序:查看二进制程序的依赖关系

    [root@localhost ~]# ldd /bin/ls

        linux-vdso.so.1 =>  (0x00007fffb09b7000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f69482d3000)

        libcap.so.2 => /lib64/libcap.so.2 (0x00007f69480ce000)

        libacl.so.1 => /lib64/libacl.so.1 (0x00007f6947ec4000)

        libc.so.6 => /lib64/libc.so.6 (0x00007f6947af6000)

        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f6947894000)

        libdl.so.2 => /lib64/libdl.so.2 (0x00007f694768f000)

        /lib64/ld-linux-x86-64.so.2 (0x000055807796f000)

        libattr.so.1 => /lib64/libattr.so.1 (0x00007f694748a000)

        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f694726e000)

        [root@localhost ~]# 

        管理及查看本机装载的库文件:

        ldconfig

                /sbin/ldconfig -p:显示本机已经缓存的所有可用库文件及文件路径映射

                配置文件为:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf

                缓存文件:/etc/ld.so.cache

        [root@localhost ~]# ldconfig -p | head -10

        1095 libs found in cache /etc/ld.so.cache

            p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so

            libz.so.1 (libc6,x86-64) => /lib64/libz.so.1

            libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0

            libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2

            libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10

            libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.1

            libxshmfence.so.1 (libc6,x86-64) => /lib64/libxshmfence.so.1

            libxml2.so.2 (libc6,x86-64) => /lib64/libxml2.so.2

            libxmlsec1.so.1 (libc6,x86-64) => /lib64/libxmlsec1.so.1

                [root@localhost ~]# 

30.2.3 包管理器的前端工具

        yum:rpm包管理器的前端工具,用于解决依赖关系,自动下载所需要的程序及其依赖包

        apt-get:deb包管理器前端工具

        zypper:suse上的rpm前端管理工具

        dnf:Fedora 22+ rpm包管理器的前端管理工具

30.2.4 程序包管理

        程序包管理:

                功能:将编译好的应用程序的各组成文件打包成一个或几个程序文件,从而方便快捷的实现程序的安装,卸载,查询,升级,校验等管理操作

                1、程序的组成清单(每个包独有)

                        文件清单

                        安装或卸载时运行的脚本

                2、数据库(公共)

                        程序包名称及版本

                        依赖关系;

                        功能说明;

                        安装生成的各文件的文件路径及校验码信息

        管理程序包的方式:

                使用包管理器:rpm

                使用前端工具:yum,dnf

        获取程序包的路径:

                1、系统发行版的光盘或者是官方的服务器

                CentOS镜像:

                        http://mirrors.aliyun.com

                        http://mirrors.sohu.com

                        http://mirrors.163.com

                2、项目官方站点

                3、第三方组织:

                        Fedora-EPEL

                        搜索引擎:

                                http://pkgs.org

                                http://rpmfind.net

                                http://rpm.pgone.net

                4、自己制作

        建议:检查其合法性

                来源合法性;程序包的完整性;

29、btrfs文件系统简介

29.1 Btrfs(B-tree,Butter FS,Better FS)

GPL,Oracle,2007,CoW;ext3/ext4,xfs

1、核心特性:

多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以”联机添加“,“移除”,“修改”;

写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新

数据及元数据校验码:checksum

子卷:sub_volume

快照:支持快照的快照

透明压缩

2、文件系统创建:

mkfs.btrfs

-L ‘LABEL’

-d <type>: raid0.raid1,raid5,raid6,raid10,single

-m <profile>:raid0,raid1,raid5,raid6,raid10,single,dup

属性查看:

btrfs filesystem show

挂载文件系统:

mount -t btrfs /dev/sdb MOUNT_POINT

透明压缩机制:

mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

3、子命令:filesystem,device,balance,subvolume

btrfs-convert:将ext文件系统转换为btrfs或者将btrfs转换为ext文件系统

28、LVM2详解及until

28.1 LVM

Logical Volume Manager,Version: 2

28.1.1 DM和MD

cat /proc/filesystems : 查看当前内核所支持文件系统类型

RAID: 独立冗余磁盘阵列

Linux:硬件,软件

/dev/md#

Linux中两种不同的设备类型

MD: Multi Device, 多设备

MD, DM

/dev/md#

meta device

DM: Device Mapper,将一个或多个底层块设备组织成一个逻辑设备的模块

逻辑设备

RAID, LVM2(逻辑卷)

DM: 通常用于LVM2

/dev/dm-#

组件:

快照:将要改变的数据进行备份,实现数据的备份(数据备份:避免因为误操作或者文件删除的情况造成的损失)

多路径

物理卷(PE)-》卷组(VG)-》逻辑卷(LE)

28.2 PV,VG管理

28.2.1 PV管理工具

pvs:简要pv信息展示

pvdisplay:显示pv的详细信息

pvcreate /dev/DEVICE:创建PV

-v 显示创建过程

pvmove:pv移除,在vgreduce之前要先移除

[root@localhost ~]# pvs

  /dev/md0: read failed after 0 of 4096 at 0: Input/output error

  PV         VG     Fmt  Attr PSize   PFree

  /dev/sdb2  centos lvm2 a–  <99.00g 4.00m

[root@localhost ~]# pvdisplay

  /dev/md0: read failed after 0 of 4096 at 0: Input/output error

  — Physical volume —

  PV Name               /dev/sdb2

  VG Name               centos

  PV Size               <99.00 GiB / not usable 3.00 MiB

  Allocatable           yes 

  PE Size               4.00 MiB

  Total PE              25343

  Free PE               1

  Allocated PE          25342

  PV UUID               0R0BFP-witm-SfMZ-d9an-26rT-JDtg-XzwGqy

[root@localhost ~]# 

28.2.2 VG管理工具

vgcreate VG_NAME /PATH/TO/PV:创建vg

-v 显示过程

-s #: PE大小,默认为4MB

vgs:简要vg信息展示

vgdisplay:显示pv的详细信息

vgextend:扩展

vgreduce:vg缩减

vgremove:删除vg

28.3 lv逻辑卷配置

28.3.1 LV管理工具

lvs:简要lv信息展示

lvdisplay:显示lv的详细信息

lvcreate -n LV_NAME -L #[mMgGtT] VG_NAME:创建lv

-n:指明逻辑卷名称

-L:指定大小

-l:指定逻辑盘区的数量

lvremove:删除逻辑卷

创建分区:创建物理边界

创建文件系统:创建逻辑边界(紧贴着物理边界)

28.3.2 扩展逻辑卷;

lvextend:扩展逻辑卷物理边界

-L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME

+可带可不带,不带的话代表的是扩展的目标大小

resize2fs:扩展文件系统边界(不指定大小则为使用分区所有大小)

resize2fs -p /PATH/TO/LV

28.3.3 缩减逻辑卷;

注意:1、不能在线缩减,必须先卸载;

  2、确保缩减后的空间大小依然能存储原有的所有数据;

  3、在缩减之前应该先强行检查文件,以确保文件系统处于一至性状态;

操作过程:

df -lh

umount

e2fsck -f         

resize2fs:缩减文件系统边界

resize2fs /PATH/TO/PV 3G

lvreduce -L [-]# /PATH/TO/LV(缩减逻辑卷物理边界)

mount重新挂载

[root@localhost ~]# umount /test

[root@localhost ~]# mount /test

mount: cant find /test in /etc/fstab

[root@localhost ~]# mount /dev/mypv/mvvg /test

mount: special device /dev/mypv/mvvg does not exist

[root@localhost ~]# mount /dev/mypv/myvg /test

mount: special device /dev/mypv/myvg does not exist

[root@localhost ~]# mount /dev/myvg/mylv /test

[root@localhost ~]# resize

resize2fs   resizecons  resizepart  

[root@localhost ~]# resize

resize2fs   resizecons  resizepart  

[root@localhost ~]# resize2fs /dev/myvg/mylv 

resize2fs 1.42.9 (28-Dec-2013)

Filesystem at /dev/myvg/mylv is mounted on /test; on-line resizing required

old_desc_blocks = 16, new_desc_blocks = 40

The filesystem on /dev/myvg/mylv is now 5242880 blocks long.

[root@localhost ~]# df -lh

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/mapper/myvg-mylv    4.9G  3.2M  4.7G   1% /test

[root@localhost ~]# umount /dev/myvg/mylv

[root@localhost ~]# e2fsck -f /dev/myvg/mylv

e2fsck 1.42.9 (28-Dec-2013)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

MYLV: 12/327680 files (0.0% non-contiguous), 119806/5242880 blocks

[root@localhost ~]# resize2fs /dev/myvg/mylv 3G

resize2fs 1.42.9 (28-Dec-2013)

Resizing the filesystem on /dev/myvg/mylv to 3145728 (1k) blocks.

The filesystem on /dev/myvg/mylv is now 3145728 blocks long.

[root@localhost ~]# lvreduce /dev/myvg/mylv 3G

  No command with matching syntax recognised.  Run ‘lvreduce –help’ for more information.

  Correct command syntax is:

  lvreduce -L|–size [-]Size[m|UNIT] LV

[root@localhost ~]# lvreduce /dev/myvg/mylv -L 3G

  WARNING: Reducing active logical volume to 3.00 GiB.

  THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce myvg/mylv? [y/n]: y

  Size of logical volume myvg/mylv changed from 5.00 GiB (1280 extents) to 3.00 GiB (768 extents).

  Logical volume myvg/mylv successfully resized.

[root@localhost ~]# mount /dev/myvg/mylv /test

[root@localhost ~]# df -lh

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/mapper/myvg-mylv    3.0G  3.2M  2.8G   1% /test

[root@localhost ~]# 

28.3.4 快照卷(snapshot)

1、生命周期为整个数据时长;在这段时长内,数据的增长量不能超出快照卷大小;

2、快照卷应该是只读的;

3、跟原卷在同一卷组内;

创建过程

lvcreate

-s:创建快照卷

-p r|w:指定权限

lvcreate -L # -n SLV_NAME -p r /PATH/TO/LV

练习1:创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16MB,而后在卷组中创建大小为5G逻辑卷testlv,挂载至、users目录

[root@localhost ~]# pvcreate /dev/sdc

  Physical volume “/dev/sdc” successfully created.

[root@localhost ~]# pvs

  PV         VG     Fmt  Attr PSize   PFree 

  /dev/sda2  centos lvm2 a–  <99.00g  4.00m

  /dev/sdb          lvm2 —   20.00g 20.00g

  /dev/sdc          lvm2 —   20.00g 20.00g

[root@localhost ~]# vgcreate vg1 -s 16 /dev/sdb

  Volume group “vg1” successfully created

[root@localhost ~]# vgextend vg1 -s 16 /dev/sdc

vgextend: invalid option — ‘s’

  Error during parsing of command line.

[root@localhost ~]# vgextend vg1 /dev/sdc

  Volume group “vg1” successfully extended

[root@localhost ~]# vgdisplay 

  — Volume group —

  VG Name               centos

  System ID             

  Format                lvm2

  Metadata Areas        1

  Metadata Sequence No  4

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                3

  Open LV               3

  Max PV                0

  Cur PV                1

  Act PV                1

  VG Size               <99.00 GiB

  PE Size               4.00 MiB

  Total PE              25343

  Alloc PE / Size       25342 / 98.99 GiB

  Free  PE / Size       1 / 4.00 MiB

  VG UUID               fE3YOB-nPtn-bYfY-RZX4-moqi-3YMu-6deJXo

  — Volume group —

  VG Name               vg1

  System ID             

  Format                lvm2

  Metadata Areas        2

  Metadata Sequence No  2

  VG Access             read/write

  VG Status             resizable

  MAX LV                0

  Cur LV                0

  Open LV               0

  Max PV                0

  Cur PV                2

  Act PV                2

  VG Size               <39.97 GiB

  PE Size               16.00 MiB

  Total PE              2558

  Alloc PE / Size       0 / 0   

  Free  PE / Size       2558 / <39.97 GiB

  VG UUID               Qf0Sfr-gRzG-vmmJ-7mTK-NUln-LlRj-U2IYJ2

[root@localhost ~]# lvcreate -n testlv -L 5G vg1

WARNING: ext4 signature detected on /dev/vg1/testlv at offset 1080. Wipe it? [y/n]: y

  Wiping ext4 signature on /dev/vg1/testlv.

  Logical volume “testlv” created.

[root@localhost ~]# mkdir /users

[root@localhost ~]# mke2fs -t ext4 /dev/vg1/testlv 

mke2fs 1.42.9 (28-Dec-2013)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

327680 inodes, 1310720 blocks

65536 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=1342177280

40 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

    32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done 

[root@localhost ~]# mount /dev/vg1/testlv /users

[root@localhost ~]# mount

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=3985976k,nr_inodes=996494,mode=755)

securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)

tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)

devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)

tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)

tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)

cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)

cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)

cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

configfs on /sys/kernel/config type configfs (rw,relatime)

/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)

systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=35,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=10884)

mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)

hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)

debugfs on /sys/kernel/debug type debugfs (rw,relatime)

/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=799408k,mode=700)

/dev/mapper/vg1-testlv on /users type ext4 (rw,relatime,seclabel,data=ordered)

练习2:新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录,

[root@localhost ~]# man useradd

[1]+  Stopped                 man useradd

[root@localhost ~]# ls /

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  users  usr  var

[root@localhost ~]# useradd -b /users archlinux

[root@localhost ~]# su – archlinux 

[archlinux@localhost ~]$ cp -a /etc/pam.d/ ~/

[archlinux@localhost ~]$ ls

pam.d

[archlinux@localhost ~]$ 

练习3:扩展testlv至7G,要求archlinux的文件不能丢失

[archlinux@localhost ~]$ lvextend -L 7G /dev/vg1/testlv

  WARNING: Running as a non-root user. Functionality may be unavailable.

  /run/lvm/lvmetad.socket: access failed: Permission denied

  WARNING: Failed to connect to lvmetad. Falling back to device scanning.

  /dev/mapper/control: open failed: Permission denied

  Failure to communicate with kernel device-mapper driver.

  Incompatible libdevmapper 1.02.140-RHEL7 (2017-05-03) and kernel driver (unknown version).

  /run/lock/lvm/V_vg1:aux: open failed: Permission denied

  Cant get lock for vg1

  Cannot process volume group vg1

[archlinux@localhost ~]$ umount /dev/vg1/testlv

umount: /users: umount failed: Operation not permitted

[archlinux@localhost ~]$ su – root

Password: 

Last login: Tue Jul 27 03:26:48 EDT 2021 from 192.168.77.2 on pts/0

[root@localhost ~]# umount /dev/vg1/testlv

umount: /users: target is busy.

        (In some cases useful info about processes that use

         the device is found by lsof(8) or fuser(1))

[root@localhost ~]# ps -ef | grep archlinux

root       1917   1463  0 04:01 pts/0    00:00:00 su – archlinux

root       1974   1953  0 04:21 pts/0    00:00:00 grep –color=auto archlinux

[root@localhost ~]# exit

logout

[archlinux@localhost ~]$ exit

logout

[root@localhost ~]# ps -ef | grep archlinux

root       1977   1463  0 04:22 pts/0    00:00:00 grep –color=auto archlinux

[root@localhost ~]# umount /dev/vg1/testlv

[root@localhost ~]# lvextend -L 7G /dev/vg1/testlv

  Size of logical volume vg1/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).

  Logical volume vg1/testlv successfully resized.

[root@localhost ~]# resize2fs /dev/vg1/testlv 

resize2fs 1.42.9 (28-Dec-2013)

Please run ‘e2fsck -f /dev/vg1/testlv’ first.

[root@localhost ~]# e2fsck -f /dev/vg1/testlv

e2fsck 1.42.9 (28-Dec-2013)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/vg1/testlv: 48/327680 files (0.0% non-contiguous), 58493/1310720 blocks

[root@localhost ~]# resize2fs /dev/vg1/testlv 

resize2fs 1.42.9 (28-Dec-2013)

Resizing the filesystem on /dev/vg1/testlv to 1835008 (4k) blocks.

The filesystem on /dev/vg1/testlv is now 1835008 blocks long.

[root@localhost ~]# mount /dev/vg1/testlv /users/

[root@localhost ~]# df -lh

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/mapper/vg1-testlv   6.8G   23M  6.4G   1% /users

[root@localhost ~]# 

[root@localhost ~]# ls /users/archlinux/

pam.d

[root@localhost ~]# 

练习4:收缩testlv至3G,要求archlinux的文件不能丢失

[root@localhost ~]# df -lh

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.6M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/mapper/vg1-testlv   6.8G   23M  6.4G   1% /users

[root@localhost ~]# umount /users 

[root@localhost ~]# e2fsck -f /dev/vg1/testlv

e2fsck 1.42.9 (28-Dec-2013)

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/vg1/testlv: 48/458752 files (0.0% non-contiguous), 67358/1835008 blocks

[root@localhost ~]# resize2fs /dev/vg1/testlv 3G

resize2fs 1.42.9 (28-Dec-2013)

Resizing the filesystem on /dev/vg1/testlv to 786432 (4k) blocks.

The filesystem on /dev/vg1/testlv is now 786432 blocks long.

[root@localhost ~]# lvreduce /dev/vg1/testlv 3G

  No command with matching syntax recognised.  Run ‘lvreduce –help’ for more information.

  Correct command syntax is:

  lvreduce -L|–size [-]Size[m|UNIT] LV

[root@localhost ~]# lvreduce /dev/vg1/testlv -L 3G

  WARNING: Reducing active logical volume to 3.00 GiB.

  THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce vg1/testlv? [y/n]: y

  Size of logical volume vg1/testlv changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).

  Logical volume vg1/testlv successfully resized.

[root@localhost ~]# lvs

  LV     VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  home   centos -wi-ao—- <41.12g                                                    

  root   centos -wi-ao—-  50.00g                                                    

  swap   centos -wi-ao—-  <7.88g                                                    

  testlv vg1    -wi-a—–   3.00g                                                    

[root@localhost ~]# mount /test

mount: cant find /test in /etc/fstab

[root@localhost ~]# mount /dev/vg1/testlv /users

[root@localhost ~]# df -lh

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.6M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/mapper/vg1-testlv   2.9G   16M  2.7G   1% /users

[root@localhost ~]# ls /users/archlinux/

pam.d

[root@localhost ~]# 

练习5:对testlv创建快照,并尝试基于快照备份数据,验证快照的功能

[root@localhost ~]# lvs

  LV     VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  home   centos -wi-ao—- <41.12g                                                    

  root   centos -wi-ao—-  50.00g                                                    

  swap   centos -wi-ao—-  <7.88g                                                    

  testlv vg1    -wi-ao—-   3.00g                                                    

[root@localhost ~]# cd /users/archlinux/

[root@localhost archlinux]# touch test

[root@localhost archlinux]# touch test1

[root@localhost archlinux]# ls

test  test1

[root@localhost archlinux]# lvcreate -s -n testlv-snap -p r -L 500M /dev/vg1/testlv

  Using default stripesize 64.00 KiB.

  Rounding up size to full physical extent 512.00 MiB

  Logical volume “testlv-snap” created.

[root@localhost archlinux]# mount /dev/vg1/testlv-snap /backup/

mount: /dev/mapper/vg1-testlv–snap is write-protected, mounting read-only

[root@localhost archlinux]# ls /backup/archlinux/

test  test1

[root@localhost archlinux]# rm -rf test

[root@localhost archlinux]# ls

test1

[root@localhost archlinux]# ls /backup/archlinux/

test  test1

[root@localhost archlinux]# 

28.4 脚本完成磁盘分区格式化

28.4.1脚本编程及until简介

1、控制结构

脚本编程控制结构:

顺序

选择

if

case

循环

for

while

until

2、while

while CONDITION; do

  statment

done

进入循环:条件满足

退出循环:条件不满足

3、until

until CONDITION; do

  statement

  …

done

进入循环:条件不满足

退出循环:条件满足

4、for的两种形式

for 变量 in 列表; do

循环体

done

for (( expr1 ; expr2 ; expr3 )); do {例for((i=1;i<10;i++));do}

  循环体

done

5、continue

写一个脚本:

1、通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线,

如果在线,就显示”ip is up.”,其中的IP要换为真正的IP地址,且以绿色显示;

如果不在线,就显示”ip is down.”,其中的IP要换为真正的IP地址,且以红色显示;

要求:分别使用while,until和for(两种形式)循环实现。

ping

-c

-W

写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:

1、列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本;如果用户选择错误,就让用户重新选择;

2、当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,n就退出;否则,让用户重新选择;

3、抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区);并为其创建三个主分区,第一个为20M,第二个为512M, 第三个为128M,且第三个为swap分区类型;(提示:将分区命令通过echo传送给fdisk即可实现)

fdisk -l |grep “

dd if=/dev/zero of=/dev/sdb bs=512 count=1

sync

sleep 3

RAID

LVM:

逻辑卷的缩减

扩展

快照卷

while CONDITION; do

  循环体

done

while [ $VAR != ‘quit’ ];do 

done

27、RAID及mdadm命令

27.1 文件系统基本概念

ext2: 文件系统块组组成:

超级块、GDT、block bitmap、inode bitmap、data blocks

驱动程序:将CPU的控制指令转换为特定设备要执行的操作(一般由硬件厂商提供)

控制器:直接继承的设备

适配器:非继承的

硬盘类型

IDE总线:速度133Mbps

SATA(1,2,3):300Mbps,600Mbps,6Gbps

USB 3.0:480Mbps

SCSI(Small Computer System Interface):有自己的CPU可以分担大CPU的存储负担(目前RAID常用)

SAS:(目前RAID常用)

27.2 RAID

RAID(Redundant Arrays of Inexpensive/Independent Disks )

廉价/独立冗余磁盘阵列(之前叫廉价,后来发现成本不低,就改成了独立)

Berkeley(美国加州大学伯克利分校的一位教授的论文):A case for Redundent Arrays of Inexpensive Disks RAID

提高I/O能力:

磁盘并行读写

提高耐用性:

磁盘冗余来实现

RAID实现的方式:

Hardware RAID

外接式磁盘阵列,通过扩展RAID卡实现外界磁盘阵列;

内接式RAID:主板集成RAID控制器

Software RAID:

RAID控制器:可以控制多个硬盘的控制器

RAID LEVEL

级别:仅代表磁盘组织方式不同,没有上下之分;

RAID10优于RAID01

RAID0: 条带

性能提升: 读,写

冗余能力(容错能力): 无

空间利用率:1*min(S1,S2…)

至少2块盘

RAID1: 镜像

性能表现:写性能略有下降,读性能提升

冗余能力:有

空间利用率:1*min(S1,S2…)

至少2块盘

RAID2

RAID3

RAID4:

校验码:硬件备份和冗余机制

校验码盘容易成为性能瓶颈:解决方案,轮换成为校验码盘

有一块专门的盘存储校验码(异或制,此块盘为性能瓶颈)

性能表现:读,写提升

冗余能力:有

空间利用率:(N-1)*min(S1,S2,…)

至少需要3块

RAID5:

性能表现:读,写提升

冗余能力:有(1块盘)

空间利用率:(N-1)*min(S1,S2,…)

至少需要3块

RAID6:

性能表现:读,写提升

冗余能力:有(2块盘)

空间利用率:(N-2)*min(S1,S2,…)

至少需要3块

RAID10:先作镜像再做条带(相对更可靠)

性能表现:读、写提升

冗余能力:有(每组镜像最多只能坏一块)

空间利用率:N*min(S1,S2,…)/2

至少需要4块

RAID01:先做条带再做镜像,

性能表现:读、写提升

冗余能力:有

空间利用率:N*min(S1,S2,…)/2

至少需要4块

RAID50:(先做RAID5,再做RAID0)

性能表现:读、写提升

冗余能力:有

空间利用率:(N-2)/N*min(S1,S2,…)/2

至少需要6块

RAID7

jbod:将多个小盘组成一个大盘

性能表现:无提升

冗余能力:无

空间利用率:100%(SUM(S1,S2…..))

至少需要2块

常用级别:RAID0,RAID1,RAID5,RAID10,RAID50,JBOD

27.3 RAID实现

27.3.1 硬件RAID

在主板上有个RAID控制器,通过BIOS进行控制更改

27.3.2 软件RAID

通过内核中的md模块来手动配置RAID

md:multi disks/devices

软RAID设备必须被标识为fd类型,避免系统崩溃以后RAID设备无法再访问

/proc/mdstat:显示当前系统所有启动的RAID

逻辑RIAD:

/dev/md0

/dev/md1

mdadm(md管理器):

将任何块设备做成RAID(同一块硬盘两个分区也可以做,但没有性能提升的意义)

支持的RAID级别:LINEAR,RAID0,RAID1,RAID4,RAID5,RAID6,RAID10等

模式化的命令:

创建模式

-C

专用选项:

-l: 指明要创建的RAID级别

-n #: 设备个数

-a {yes|no}: 是否自动为其创建设备文件

-c: 指定CHUNK(条带)大小, 2^n,默认为64K

-x #: 指定空闲盘个数

管理模式

-a:添加磁盘

-r:移除磁盘

-f:标记指定磁盘为损坏

–add, –remove, –fail

mdadm /dev/md# –fail /dev/sda7

监控模式

-F

增长模式

-G

装配模式

-A

查看RAID阵列的详细信息

-D /dev/md#

–detail

–scan > /etc/mdadm.conf(将当前RAID信息保存至配置文件,以便以后进行装配:)

停止阵列:

-S /dev/md#

–stop

例:创建一个10G可用空间的3块盘

[root@localhost ~]# mdadm -C /dev/md0 -a yes -n 3 -l 5 /dev/sda1 /dev/sda2 /dev/sda3

mdadm: Fail to create md0 when using /sys/module/md_mod/parameters/new_array, fallback to creation via node

mdadm: Defaulting to version 1.2 metadata

mdadm: array /dev/md0 started.

[root@localhost ~]# cat /proc/mdstat

Personalities : [raid6] [raid5] [raid4] 

md0 : active raid5 sda3[3] sda2[1] sda1[0]

      10475520 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]

      [==>………………]  recovery = 10.6% (556540/5237760) finish=0.7min speed=111308K/sec

unused devices: <none>

[root@localhost ~]# mkdir /test

[root@localhost ~]# mount /dev/md0 /test

[root@localhost ~]# df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sdb1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/md0                 9.8G   37M  9.2G   1% /test

[root@localhost ~]# mke2fs -t ext4 /etc/md0

mke2fs 1.42.9 (28-Dec-2013)

Could not stat /etc/md0 — No such file or directory

The device apparently does not exist; did you specify it correctly?

[root@localhost ~]# mke2fs -t ext4 /dev/md0

mke2fs 1.42.9 (28-Dec-2013)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=128 blocks, Stripe width=256 blocks

655360 inodes, 2618880 blocks

130944 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2151677952

80 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done 

[root@localhost ~]# mkdir /test

[root@localhost ~]# mount /dev/md0 /test

[root@localhost ~]# mount

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=3985976k,nr_inodes=996494,mode=755)

securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)

tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)

devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)

tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)

tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)

cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)

cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)

cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

configfs on /sys/kernel/config type configfs (rw,relatime)

/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)

systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12878)

debugfs on /sys/kernel/debug type debugfs (rw,relatime)

mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)

hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)

/dev/sdb1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=799408k,mode=700)

/dev/md0 on /test type ext4 (rw,relatime,seclabel,stripe=256,data=ordered)

[root@localhost ~]# blkid /dev/md0

/dev/md0: UUID=”827112e4-bd97-4394-b812-1394dcd10e71″ TYPE=”ext4″ 

[root@localhost ~]# mdadm -D /dev/md0

/dev/md0:

           Version : 1.2

     Creation Time : Mon Jul 26 04:26:58 2021

        Raid Level : raid5

        Array Size : 10475520 (9.99 GiB 10.73 GB)

     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)

      Raid Devices : 3

     Total Devices : 3

       Persistence : Superblock is persistent

       Update Time : Mon Jul 26 04:32:45 2021

             State : clean 

    Active Devices : 3

   Working Devices : 3

    Failed Devices : 0

     Spare Devices : 0

            Layout : left-symmetric

        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)

              UUID : 5fb851eb:b930b950:288b80e1:e384eb79

            Events : 18

    Number   Major   Minor   RaidDevice State

       0       8        1        0      active sync   /dev/sda1

       1       8        2        1      active sync   /dev/sda2

       3       8        3        2      active sync   /dev/sda3

[root@localhost ~]# mdadm /dev/md0 -f /dev/sda1

mdadm: set /dev/sda1 faulty in /dev/md0

[root@localhost ~]# mdadm -D /dev/md0

/dev/md0:

           Version : 1.2

     Creation Time : Mon Jul 26 04:26:58 2021

        Raid Level : raid5

        Array Size : 10475520 (9.99 GiB 10.73 GB)

     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)

      Raid Devices : 3

     Total Devices : 3

       Persistence : Superblock is persistent

       Update Time : Mon Jul 26 04:35:01 2021

             State : clean, degraded 

    Active Devices : 2

   Working Devices : 2

    Failed Devices : 1

     Spare Devices : 0

            Layout : left-symmetric

        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)

              UUID : 5fb851eb:b930b950:288b80e1:e384eb79

            Events : 20

    Number   Major   Minor   RaidDevice State

       –       0        0        0      removed

       1       8        2        1      active sync   /dev/sda2

       3       8        3        2      active sync   /dev/sda3

       0       8        1        –      faulty   /dev/sda1

[root@localhost ~]# mdadm /dev/md0 -f /dev/sda2

mdadm: set /dev/sda2 faulty in /dev/md0

[root@localhost ~]# mdadm -D /dev/md0

/dev/md0:

           Version : 1.2

     Creation Time : Mon Jul 26 04:26:58 2021

        Raid Level : raid5

        Array Size : 10475520 (9.99 GiB 10.73 GB)

     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)

      Raid Devices : 3

     Total Devices : 3

       Persistence : Superblock is persistent

       Update Time : Mon Jul 26 04:35:40 2021

             State : clean, FAILED 

    Active Devices : 1

   Working Devices : 1

    Failed Devices : 2

     Spare Devices : 0

            Layout : left-symmetric

        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)

              UUID : 5fb851eb:b930b950:288b80e1:e384eb79

            Events : 22

    Number   Major   Minor   RaidDevice State

       –       0        0        0      removed

       –       0        0        1      removed

       3       8        3        2      active sync   /dev/sda3

       0       8        1        –      faulty   /dev/sda1

       1       8        2        –      faulty   /dev/sda2

[root@localhost ~]# mdadm /dev/md0 -a /dev/sda1

mdadm: Cannot open /dev/sda1: Device or resource busy

[root@localhost ~]# 

[root@localhost ~]# mdadm /dev/md0 -a /dev/sda2

mdadm: Cannot open /dev/sda2: Device or resource busy

[root@localhost ~]# mdadm /dev/md0 -r /dev/sda2

mdadm: hot removed /dev/sda2 from /dev/md0

[root@localhost ~]# mdadm /dev/md0 -r /dev/sda1

mdadm: hot removed /dev/sda1 from /dev/md0

[root@localhost ~]# mdadm -D /dev/md0

/dev/md0:

           Version : 1.2

     Creation Time : Mon Jul 26 04:26:58 2021

        Raid Level : raid5

        Array Size : 10475520 (9.99 GiB 10.73 GB)

     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)

      Raid Devices : 3

     Total Devices : 1

       Persistence : Superblock is persistent

       Update Time : Mon Jul 26 04:37:12 2021

             State : clean, FAILED 

    Active Devices : 1

   Working Devices : 1

    Failed Devices : 0

     Spare Devices : 0

            Layout : left-symmetric

        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:0  (local to host localhost.localdomain)

              UUID : 5fb851eb:b930b950:288b80e1:e384eb79

            Events : 24

    Number   Major   Minor   RaidDevice State

       –       0        0        0      removed

       –       0        0        1      removed

       3       8        3        2      active sync   /dev/sda3

[root@localhost ~]# mdadm -S /dev/md0

mdadm: Cannot get exclusive access to /dev/md0:Perhaps a running process, mounted filesystem or active volume group?

[root@localhost ~]# unmount /dev/md0

-bash: unmount: command not found

[root@localhost ~]# umount /dev/md0

[root@localhost ~]# mdadm -S /dev/md0

mdadm: stopped /dev/md0

[root@localhost ~]# cat /proc/mdstat 

Personalities : [raid6] [raid5] [raid4] 

unused devices: <none>

[root@localhost ~]# 

watch: 周期性地执行指定命令,并以全屏方式显示结果

-n #:指定周期长度,单位为秒,默认为2

格式: watch -n # ‘COMMAND’

CentOS7.4 安装wordpress

步骤一:安装Apache服务器

1、yum -y install httpd

最后显示complete即完成

2、启动httpd并且设置为开机启动

systemctl start httpd.service
systemctl enable httpd.service

3、安装firewall

yum -y install firewalld firewall-config

systemctl start firewalld.service
systemctl enable firewalld.service

4、配置firewall

firewall-cmd –permanent –zone=public –add-service=http
firewall-cmd –permanent –zone=public –add-service=https
firewall-cmd –reload

步骤二:安装MariaDB

1、利用yum命令进行安装,并配置开机启动

3. 添加mariadb10.2的国内yum源

之前我添加的是国外的源,安装很耗时,所以我找到国内yum源,通过这个源安装较快。

vim  /etc/yum.repos.d/Mariadb.repo

添加以下内容:

[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

按esc,然后:wq退出

清除yum源缓存数据

yum clean all

生成新的yum源数据缓存

yum makecache all

官方yum源(国内安装较慢)

1 2 3 4 5 6 7# MariaDB 10.2 CentOS repository list – created 2018-06-06 03:42 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

官方不同系统yum源网址:https://downloads.mariadb.org/mariadb/repositories/#mirror=tuna

4. 安装mariadb10.2

yum install MariaDB-server MariaDB-client -y

启动并添加开机自启:

systemctl start mariadb.service
systemctl enable mariadb.service

5. mariadb的初始化

mysql_secure_installation

一般建议按以下进行配置:

Enter current password for root (enter for none): Just press the Enter button
Set root password? [Y/n]: Y
New password: your-MariaDB-root-password
Re-enter new password: your-MariaDB-root-password
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: n
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y

yum -y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service

6、配置root密码

mysql_secure_installation

  • 具体有以下几个选项,可以根据各自情况进行配置(建议全部选Y)

Enter current password for root (enter for none):(输入原始root密码,若无则按enter)
OK, successfully used password, moving on…

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] (按Y设置root密码)whd-521123
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 … Success!

Remove anonymous users? [Y/n] (按Y移除匿名用户)
 … Success!

Disallow root login remotely? [Y/n] (按Y禁止远程root登陆,一般root都设定为只允许本地登陆)
 … skipping.

Remove test database and access to it? [Y/n] (按Y删除测试数据库)

Reload privilege tables now? [Y/n] (按Y重新载入)
 … Success!

Cleaning up…

All done!  If you’ve completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

步骤三:安装PHP

1. 更新yum安装包

CentOS 7.x

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

CentOS 6.x

rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm

CentOS 5.x

rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm

2. 通过云进行php和其他组件的安装

yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64 php70w-fpm

yum install其他需要的组件在自行安装。

3.测试php安装情况

vim /var/www/html/config.php 

按字母i或insert键进入编辑模式,编辑为以下内容php

<?php
phpinfo();
?>

编辑完成后键入“Esc:wq”,保存文件并退回到命令行模式

5、重启httpd服务

systemctl restart httpd.service

6、在浏览器打开网址 http://x.x.x.x/config.php 进行查看(x.x.x.x为你的服务器公网IP)

类似图中即为正常

步骤四:配置数据库

1、登陆MariaDB为WordPress建立数据库及用户

mysql -u root -p

2、新建数据库wordpressdb,用户为wordpressuser,密码为123456

CREATE DATABASE wp_danios;
CREATE USER daniel@localhost IDENTIFIED BY ‘Abcd@123’;

3、更改用户权限,保存并退出

GRANT ALL PRIVILEGES ON wp_danios.* TO daniel@localhost;
FLUSH PRIVILEGES;
exit

4、重启相关服务

systemctl restart httpd.service
systemctl restart  mariadb.service

步骤五:安装WordPress

1、新建一个文件夹,此处取名wp

mkdir wp
cd wp
yum -y install wget unzip net-tools
wget http://wordpress.org/latest.zip

2、解压文件,并且将其复制到/var/www/html目录下

unzip -q latest.zip
cp -rf wordpress/* /var/www/html/

3、修改文件夹权限

chown -R apache:apache /var/www/html/
chmod -R 755 /var/www/html/
mkdir -p /var/www/html/wp-content/uploads
chown -R :apache /var/www/html/wp-content/uploads

4、编辑配置文件

cd /var/www/html
cp wp-config-sample.php wp-config.php
vim wp-config.php

打开文件后,按i键或insert键进入编辑模式,将其修改为以下格式(其中wordpressdb为数据库名称,wordpressuser为数据库用户名,123456为数据库密码)

// * MySQL settings – You can get this info from your web host * //
/* The name of the database for WordPress /
define(‘DB_NAME’, ‘wordpressdb’);

/* mysql database username /
define(‘DB_USER’, ‘wordpressuser’);

/* MySQL database password /
define(‘DB_PASSWORD’, ‘123456’);

键入“Esc:wq”,存盘并退出

5、重启相关服务

systemctl restart httpd.service
systemctl restart mariadb.service

步骤六:WordPress的个人设置

登录 http://x.x.x.x/访问你的博客(x.x.x.x为你的服务器公网IP),按照自己的喜好进行相关的设置。

参考素材:http://blog.csdn.net/keneuro/article/details/48543613 

http://blog.csdn.net/keneuro/article/details/48575533 

https://www.qcloud.com/community/article/883465

<https://blog.csdn.net/liyaxin2010/article/details/83184423>

vmware虚拟机安装CentOS7.4

本教程使用Vmware虚拟机系统搭载 Linux 系统 CentOS 7.4为例

1、安装GUI服务器即可

2、设置ROOT密码,并创建新用户

3、网卡设置为桥接模式,个人更喜欢这种模式

4、安装完成,重启同意协议即可

5、安装puttyFileZilla

使用putty通过IP地址远程连接服务器进行配置

Mysql 8.0.26 wordpress无法访问数据库问题处理

mysql8.0.26配置完成以后,发现wordpress无法访问数据库,后来确认了一下用户名,密码都是正确的。

猜想可能是密码权限的问题,更改密码格式后正常访问

命令:

mysql -u root -p

alter user ‘root’@’%’identified with mysql_native_password by ‘密码’;

root改为自己wordpress的用户名,密码改为自己的密码即可,与之前的一样也不影响

tctconfig使用说明


tctconfig

实现通过脚本自动部署备份,重启,更新tomcat系统

详细文档及配置内容,请查看http://www.danios.com/tctconfig/

1、安装步骤

a)root账户或有权限访问/etc,/usr/bin的账户可用software模式

	bash tctcofig-xx.run -sw|--software(可直接下载tctconfig-xx.run,或者在源码包中可找到tctconfig-xx.run)

卸载

	removtct

	若是无法找到removtct,说明程序未安装

b)所有用户都可用script模式部署(默认部署路径为$HOME)

	bash tctcofig-xx.run -sc|--script(可直接下载tctconfig-xx.run,或者在源码包中可找到tctconfig-xx.run)

卸载

	removtct

	若是无法找到removtct,说明程序未安装

2、命令格式

tctconfig [OPTION] [TOMCATNAME]
tctconfig -l TOMCATNAME [COUNT]

Option:

-b|--backup
    
	备份对应的tomcat根路径的所有文件,生成ROOTPATHYYYY-MM-DD-HH:MM:SS.zip格式的备份文件,直接放置于根路径所在的父目录中

-tb|--testbackup

	测试前的备份,备份对应的tomcat根路径的所有文件,生成ROOTPATHYYYY-MM-DD-HH:MM:SSTB.zip格式的备份文件,直接放置于根路径所在的父目录中

-r|--restart

	重启对应的tomcat,并查看catliana.out日志

-u|--update

	更新对应的tomcat,有4个步骤;
	 1、备份对应的tomcat,类似-b命令
	 2、关闭对应的tomcat,类似-sh命令
	 3、更新文件,将$PACKAGE_PATH/packages/update文件夹下面的所有更新文件拷贝到$TOMCATPATH/webapps/$ROOTPATH中,并覆盖重复的文件
	 4、清理更新文件,将$PACKAGE_PATH/packages/update文件夹下面的所有更新文件移动到./tctconfig/packages/backup/$TOMCATVERSION/YYYY-MM-DD-HH:MM:SS文件夹中
	 5、开启对应tomcat,类似-st命令

-tu|--testupdate

	更新测试文件,不进行备份操作,只更新文件,重启tomcat,相当于-u的2,3,4功能
	建议进行测试更新之前执行以下tctconfig -tb TOMCATVERSION,进行一下备份,避免出现不必要的损失


-tg|--tgupdate

	同时进行两个或者多个系统的更新,可通过配置tgupdate函数进行调整

-sh|--shutdown

	关闭对应的tomcat

-st|--startup

	开启对应的tomcat


-e|--edit

	使用vim编辑WEB-INF/classes里面的对应的文件,目前有三个选项:con|com|spr


-l|--log

	查看对应的tomcat的catalina.out的日志,使用格式:
		multi模式:tctconfig -l TOMCATVERSION [COUNT]
			例:tctconfig -l vm(查看vm对应的系统的日志,并持续输出)
	    		    tctconfig -l vm 1000(查看vm对应的系统的最近1000行的日志,并持续输出)	
		
		single模式:tctconfig -l [COUNT]
			例: tctconfig -l(查看single tomcat对应的系统的日志,并持续输出)
                                tctconfig -l 1000(查看vm对应的系统的最近1000行的日志,并持续输出)

-i|--install

	安装部署tomcat,jdk,redis,可以选择需要的组件进行安装,安装文件位置为./package/install

-c|--clean

	清理日志,更新备份文件和残留进程,可用y/n选择清理对应的文件

-h|--help 

	查看帮助

tct.conf:

tctconfig的配置文件,用于配置tctconfig的运行模式以及应用信息。

TOMCATVERSION:
    	为tomcat的版本名称,版本信息位于/etc/tct.conf或者$HOME/tctconfig/conf/tct.conf中,以分号隔开
    例:
    	vm:/opt/webserver/tomcat8:ROOT
    	tomcat版本:tomcat部署路径:根路径

PROGRAM_MODE:
	程序的运行模式,分为单系统模式(single)和多系统模式(multi),
SINGLE_PATH:
	后面跟的是单用户模式的应用信息。
	模式为TOMCATVERSION:TOMCATPATH:ROOTPATH
MULTI_name:
	通过此配置文件可配置多个tomcat,后面的tomcat名称用空格隔开,name为关键字
	例:MULTI_name:tomcat tomcat2 tomcat3

WordPress更改固定连接(permalinks)后只能访问首页问题处理

今天整理了一下网站,想将固定链接调整一下,但是又出现了只能访问首页,其他子页面提示无法访问的问题,联想到之前也出现过同样的问题,然后这次就研究了一下。

看到了wordpress官网关于固定链接的介绍,发现需要开启apache的mod_rewrite module才能正常使用Pretty permalinks,

以下是原文:

Using mod_rewrite or lighttpd you can produce much nicer permalinks (see Pretty Permalinks). There are many different formats, but the most common, and most versatile looks like

http://example.com/2012/post-name/

or

http://example.com/2012/12/30/post-name

Pretty permalinks are available under:

  • Apache web server with the mod_rewrite module
  • Nginx using try-files, e.g. according to this tutorial
  • Hiawatha web server with UrlToolkit support enabled.
  • Lighttpd using a 404 handler or mod_rewrite
  • Caddy using rewrite, e.g. according to this tutorial

随后找了一下开启的方法,在这里找到了

如果不想打开链接的话,直接往下看即可。

我直接把对应的部分拷贝了出来,如果想看中文的话可以拉到最后

Enable Mod_rewrite Module

The mod_rewrite module is enabled by default on CentOS 7. If you find it is not enabled on your server, you can enable it by editing 00-base.conf file located in /etc/httpd/conf.modules.d/ directory.

sudo nano /etc/httpd/conf.modules.d/00-base.conf

Add or uncomment the following line:

LoadModule rewrite_module modules/mod_rewrite.so

Save and close the file, then restart the httpd service:

sudo systemctl restart httpd

Enable .Htaccess File

Once the mod_rewrite module has been activated, you can set up your URL rewrites by creating an .htaccess file in your default document root directory. A .htaccess file allows us to modify our rewrite rules without accessing server configuration files. For this reason, .htaccess is critical to your web server. Before we begin, we need to allow Apache to read .htaccess files located under the /var/www/html directory.

You can do this by editing httpd.conf file:

sudo nano /etc/httpd/conf/httpd.conf

Find the section <directory /var/www/html> and change AllowOverride None to AllowOverride All

 &lt;Directory /var/www/html>
    AllowOverride All
 &lt;/Directory>

Save and exit.

Now restart Apache to put the change into effect:

sudo systemctl restart httpd

第一步大概意思就是修改/etc/httpd/conf.modules.d/00-base.conf文件,将

LoadModule rewrite_module modules/mod_rewrite.so

这一句前的注释取消,如果没有这一句的话直接加上即可

我看了一下,我的是这个文件里的这部分是正常的,就没有调整。

然后我按照第二步调整了一下,网站显示就正常了,下面是调整步骤

修改/etc/httpd/conf/httpd.conf文件,找到如下类型的文本,修改为

 &lt;Directory /var/www/html>
    AllowOverride All
 &lt;/Directory>

修改完以后重启apache即可

sudo systemctl restart httpd

文本修改的方法可以参考我的关于vim配置的文章

此处理方案仅是个人环境的处理方案,仅供参考,有问题的话也可以留言讨论

tctconfig

tomcat自动重启配置脚本,之后会试着加上一些系统配置相关的内容

使用说明查看这里

Github地址:https://github.com/Daniel-W7/tctconfig

Gitee地址:https://gitee.com/daniel-w7/tctconfig

添加-e选项用于修改WEB-INF/classes下的配置文件

完善安装流程

更新多个tomcat同时更新的流程,简化操作

更新update函数,将更新程序和清理更新文件区分开来

添加MULTI_name参数,来实现通过自定义tct.conf文件来实现多个tomcat同时部署,更新,重启,多个tomcat之间用空格隔开

修改tct_run.sh参数,进行整行替换,避免出现定义多个INSTALL_OPTION的情况

添加run_create.sh脚本,可实现自动打包tct_run.sh和程序文件

clean添加清理缓存参数,可通过tctconfig -c log|bak|cache分别清理日志,备份和缓存

修复software模式下TCT_PATH路径定义为空的问题

修改tctconfig-xx.run安装脚本配置,可直接通过bash tctconfig-xx.run -sw|–software|-sc|–script进行对应模式的安装

删除instct脚本,完善removtct脚本

添加redis_configure选项,可通过-st命令开启,-sh命令关闭,-r命令重启对应目录的所有redis

修复脚本模式下日志还是定位到/usr/local/tctconfig/logs文件夹的bug

tctconfig -v里面添加install option选项,支持查看INSTALL_OPTION变量,判断安装模式

添加-gt选项,用于同时更新两个tomcat,更改同时更新两个tomcat的方式

修改版本号定义方式,添加小版本号

开启关闭tomcat之前添加cd $TOMCAT_PATH命令,避免某些根据程序启动路径生成日志的问题出现

更新tct.conf,将配置文件关键字锁定在首位,避免出现问题

tctconfig主程序添加CONF_FILE变量,用于保存tct.conf的位置,避免没有权限访问/etc和/usr/bin会出现的部署问题

优化卸载功能,将安装卸载文件添加到/usr/bin文件夹中

tctconfig程序添加INSTALL_OPTION函数,配置脚本(script)模式或者是软件(software)模式(默认为software模式)
根据程序是software模式还是script模式来判断配置文件及日志文件的的路径
如果INSTALL_OPTION配置为script模式,则设置tct.conf的路径为$HOME/tctconfig/conf/tct.conf,更新补丁及备份补丁路径为$HOME/tctconfig,日志路径为$HOME/tctconfig/logs
注释掉INSTALL_OPTION或者是配置其他值,则设置tct.conf的路径为/etc/tct.conf,更新补丁及备份补丁路径为$HOME/tctconfig,日志路径为/usr/local/logs,
根据程序是software模式还是script模式来判断配置文件及日志文件的的路径

修改-l命令中的COUNT参数配置,区分不同模式下的COUNT的配置方式;

输出日志方式:

single模式:
tctconfig -l [COUNT]
multi模式:
tctconfig -l TOMCATVERSION [COUNT]

更新README.md文件

修改更新顺序,关闭tomcat以后再进行更新

修改run文件名称为tctconfig-xx.run

添加安装配置,新增tctinstall.run安装文件,执行bash tctinstall.run即可进行安装部署

程序二进制文件部署文件夹修改为/usr/bin,

日志及程序初始文件夹为/usr/local/tctconfig

package文件夹修改为安装程序的用户家目录下的tctconfig/package,例/root/tctconfig/package

添加-v选项,可查看当前的程序版本,并查看对应的配置

修改-h选项的显示内容

新添加bin目录用来放置程序

修改tctconfig.sh名称为tctconfig

添加instct脚本用来安装配置tctconfig,

添加removtct脚本用来卸载tctconfig

将tee文件的清理方式由rm改为mv,移动到logs文件夹中

修复部分bug

添加TOMCAT_CHECK函数来判断TOMCATVERSION是否合规,不合规的话给出原因

优化程序执行的判断结构,避免出现程序无法判断输入的内容而报错的情况

将更新前的对于更新文件是否存在的判断调整到备份之前,避免多余的备份操作

-l命令添加行数选项,可进行行数选定

添加-tg选项,可以用来同时更新多个tomcat系统

修复update下面的更新文件不止一个时,-z选项无法正常判断的问题

生成的压缩包的时间和backup生成文件夹的时间统一修改为YYY-MM-DD-HH:MM格式,避免输出和执行结果不对应的问题

添加删除tee的命令,在执行完成之后删除tee命令的残留文件

tct.conf里面添加PROGRAM_MODE键值,以single和multi来选择运行于多系统模式还是单系统模式

添加SINGLE_PATH键值,后面跟上单系统模式的配置信息

修复因为tct.conf里面的名称重复,程序无法正常开启的问题,名称重复的话进行提示

更新tct.conf中关于tomcatversion的键值,避免出现重复或者误读的情况

程序添加判断功能,当没有输入TOMCATVERSION时,进行提示

添加version文件,用于放置更新信息

更新的时候添加判断语句,若是./package/update文件夹下面无更新文件,则直接退出更新

执行-i安装选项时,若目标目录有相同的安装文件,则可选择是否部署安装

删除clean.sh脚本,tctconfig.sh添加-c选项,可选择清理日志文件和backup文件,顺带清理脚本进程

更新日志文件输出方式,日志名称修改

修改系统显示名称,改为具体的系统tomcat地址,方便定位问题

输出字符添加颜色,方便确认比照

修复部分bug

完善.bat脚本,和新版本tctconfig对应

添加-sh和-st命令,用于单独启动或者关闭tomcat

更新conf文件

调整程序逻辑,精简程序

修复部分bug

修改项目名称和脚本名称为tctconfig

添加配置信息文件tct.conf,放置于conf文件夹中,用于保存tomcat信息

添加logs文件夹,用于放置相关日志

添加clean.sh来清理遗留进程

package目录下添加install目录,用来放置部署文件,tomcat8.zip,redis.zip和jdk1.8.0_131.zip

修改upload目录为update,修改备份文件目录为backup

添加-i选项用于tomcat初始化部署

添加-tb选项用于测试前全包备份

添加-tu选项用于调试的时候仅更新调试文件不做多余的备份

添加-l选项用于查看catalina.out日志

将目录获取指令提到最前面,解决了进行更新时找不到目录的问题

将Linux端更新后的删除更新内容命令修改为了移动命令,在package下面添加了一个old文件夹用于放置更新文件

修复部分bug

将update.sh,backup.sh,restart.sh合并为tctconf.sh,

并且可以通过tctconf.sh -u,-b,-r TOMCATVERSION命令,进行对应版本的系统的更新,备份,重启操作

也可以直接通过tctconf.sh命令进行交互操作

仍然可以通过update.bat进行更新文件从Windows传输到Linux主机,需配置免密码登录

修复更新会误删除Windows端upload文件夹的错误

优化部分bug,

update.sh里面添加目录切换命令,直接切换到此程序根目录,可直接调用根目录shell脚本

update.sh输出内容调整,以适应Windows1界面的显示

update.bat添加清理本地upload文件夹下内容的功能,避免重复更新,并添加登录linux系统之后直接执行update. sh的功能,可实现自动更新

添加backup.sh,用于备份之前的系统文件,可重复备份

添加update.sh,用于更新,更新之前进行对应安装目录的备份

添加update.bat,用于Windows向linux自动上传更新补丁,补丁位置./package/upload/

添加clean.sh,用于清理可能遗留的shell进程

restart.sh里面添加set -m命令,用于分线程进行脚本执行,避免出现shell脚本关闭,tomcat也被一并关闭的情况

修改tomcat-restart为tomcat-install

调整了一下版本发布方式

加上选项功能,可以进行多个tomcat的管理

重启脚本基础版,仅添加重启单个tomcat功能

Nginx反向代理Apache下的wordpress问题记录

最近在配置Nginx的反向代理,通过反向代理访问到Apache下的wordpress。

在配置ssl的过程中出现了图片无法显示及页面布局混乱的问题,在这里记录一下,以作备忘,仅供参考

ssl配置过程在其他文章中记录,这里不再赘述,仅记录反向代理页面显示不正常问题的解决方法。

经过实际测试,下面的代码是维持wordpress正常显示的Nginx端最精简的配置

Nginx端

Nginx.conf配置

#配置将http自动跳转到https

server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.danios.com;
ssl_certificate *.pem;#这里要加上ssl对应的pem文件的绝对路径
ssl_certificate_key *.key;#这里是.key文件的绝对路径
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
     
            #定义反向代理x.x.x.x:port为要代理的地址和端口
            proxy_pass http://x.x.x.x:port/;
           #实测这段代码缺失会导致显示乱码
            proxy_set_header X-Forwarded-Proto https;
            
    }

Apache端配置:

搜索的时候看到网上有很多要配置wp-config.php文件的说法,但个人测试没有调整wp-config.php也可以正常访问

但是必须更改数据库wp-options表中的内容配合上面的Nginx配置才能正常显示,这里是我更改的内容,将siteurl和home都更改为了http://www.danios.com:8080,之后即可正常访问

这是个人部署过程的碰到的一个问题及个人的处理方案,可能不一定适用于其他的地方,仅供参考

有其他的方案也欢迎留言讨论

26、脚本编程之while语句,read,echo命令

26.1 脚本编程结构简介

顺序结构

选择结构

if

case

循环结构

for

while

until

26.2 while循环

while循环:适用于循环次数未知或循环过多的场景,要有退出条件

语法:

while CONDITION; do

  statement

  …

done

计算100以内所有正整数的和

#!/bin/bash

#

declare -i I=1

declare -i SUM=0

while [ $I -le 100 ];do

        let SUM+=I

        let I++

done

echo $SUM

26.3 用户交互(read)

read 读取用户输入(可一次读取多个输入分给不同的用户)

-p 显示提示

-t 指定超时时间

[root@localhost ~]# read a b c

how ae^H you

[root@localhost ~]# echo $a

how

[root@localhost ~]# echo $b

ae

[root@localhost ~]# echo $c

you

[root@localhost ~]# read a b c

how are

[root@localhost ~]# echo $a

how

[root@localhost ~]# echo $c

[root@localhost ~]# read a b c

how lo^H are you

[root@localhost ~]# read $a

abcd

[root@localhost ~]# read a b c

how old are you

[root@localhost ~]# echo $a

how

[root@localhost ~]# echo $c

are you

[root@localhost ~]# 

[root@localhost ~]# read -p “please enter your name:” -t 5 name

please enter your name:[root@localhost ~]# read -p “please enter your name:” -t 5 name

please enter your name:bob

[root@localhost ~]# echo $name

bob

[root@localhost ~]# 

26.4 bash脚本调试

bash

-n scripts.sh 检测脚本是否有错误

-x scripts.sh 分步执行脚本

练习:转换用户输入的字符为大写,除了quit:

[root@Daniel-R480 ~]# ./translate.sh 

Input something:ech

ECH

Input something:quit

[root@Daniel-R480 ~]# 

#!/bin/bash

#

read -p “Input something: ” STRING

while [ $STRING != ‘quit’ ]; do

  echo $STRING | tr ‘a-z’ ‘A-Z’

  read -p “Input something: ” STRING

done

练习:每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说明hadoop尚未登录:

#!/bin/bash

#

who | grep “hadoop” &> /dev/null

RETVAL=$?

while [ $RETVAL -ne 0 ]; do

        echo “`date`,hadoop is not log.”

        sleep 5

        who | grep “hadoop” &> /dev/null

        RETVAL=$?

done

echo “hadoop is logged in”

写一个脚本:

1) 显示一个菜单给用户:

d|D) show disk usages.

m|M) show memory usages.

s|S) show swap usages.

*) quit.

2) 当用户给定选项后显示相应的内容;

[root@Daniel-R480 ~]# ./showdisk.sh 

d|D) show disk usages.

m|M)show memory usages.

s|S)show swap usages.

*)quit

Your choice:s

Swap usage:

Swap:         30291           0       30291

[root@Daniel-R480 ~]# ./showdisk.sh 

d|D) show disk usages.

m|M)show memory usages.

s|S)show swap usages.

*)quit

Your choice:q

Unknown..

[root@Daniel-R480 ~]# echo $?

9

#!/bin/bash

#

cat << EOF

d|D) show disk usages.

m|M)show memory usages.

s|S)show swap usages.

*)quit

EOF

read -p “Your choice:” CHOICE

case $CHOICE in

d|D)

        echo “Disk usage:”

        df -Ph;;

m|M)

        echo “Memory usage:”

        free -m | grep “Mem”;;

s|S)

        echo “Swap usage:”

        free -m | grep “Swap”;;

*)

        echo “Unknown..”

        exit 9;;

esac

扩展:

当用户选择完成,显示相应信息后,不退出;而让用户再一次选择,再次显示相应内容;除了用户使用quit;

#!/bin/bash

#

cat << EOF

d|D) show disk usages.

m|M)show memory usages.

s|S)show swap usages.

*)quit

EOF

read -p “Your choice:” CHOICE

while [ $CHOICE != ‘quit’ ];do

{

case $CHOICE in

d|D)

        echo “Disk usage:”

        df -Ph;;

m|M)

        echo “Memory usage:”

        free -m | grep “Mem”;;

s|S)

        echo “Swap usage:”

        free -m | grep “Swap”;;

*)

        echo “Unknown..”

        exit 9;;

esac

read -p “Your choice:” CHOICE

echo输出不同格式的文本

[root@Daniel-R480 ~]# echo -e “\033[1mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[31mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[32mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[41mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[42mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[1,31,43mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]# echo -e “\033[1;31;43mHello\033[0m,world.”

Hello,world.

[root@Daniel-R480 ~]#

25、压缩、解压缩及归档工具

25.1 早期的压缩命令

    compress: FILENAME.Z

    uncompress

25.2 目前常用的压缩命令

压缩格式:gz, bz2, xz, zip, Z

压缩算法:算法不同,压缩比也会不同;

1、gzip: .gz

    gzip /PATH/TO/SOMEFILE:压缩完成后会删除原文件

-d:解压缩

-c:将结果输出至标准输出

-#:1-9,指定压缩比,默认是6;

gunzip: 解压缩

gunzip /PATH/TO/SOMEFILE.gz: 解压完成后会删除原文件

查看压缩文件内容

zcat /PATH/TO/SOMEFILE.gz: 不解压的情况,查看文本文件的内容

3、bzip2: .bz2

比gzip有着更大压缩比的压缩工具,使用格式近似

bzip2 /PATH/TO/SOMEFILE

-d:解压缩

-#: 1-9,默认是6

-k: 压缩时保留原文件

bunzip2 /PATH/TO/SOMEFILE.bz2

解压缩命令

bzcat:不解压查看压缩文件内容

4、xz: .xz

xz /PATH/TO/SOMEFILE

-d:解压缩

-#: 1-9, 默认是6

-k: 压缩时保留原文件

unxz:解压缩

xzdec:体积很小的解压缩xz文件的软件

xzcat :不解压的情况,查看文本文件的内容

5、zip

zip: 既归档又压缩的工具,可以压缩目录

zip FILENAME.zip FILE1 FILE2 …: 压缩后不删除原文件

unzip FILENAME.zip

使用deflat的压缩算法

archive: 归档,归档本身并不意味着压缩

分卷打包

zip -s 50m -r test.zip /etc   #(把etc目录按50M大小分卷打包。)

-s: 创建分卷的大小

-r: 循环压缩文件夹下面的内容

zip -s 0 test.zip  –out etc.zip  #把test.zip分卷合并成etc.zip压缩包

6、tar

tar: 归档工具,只归档不压缩, .tar

-c: 创建归档文件

-f FILE.tar: 操作的归档文件

-x: 展开归档

–xattrs: 归档时,保留文件的扩展属性信息

-t: 不展开归档,直接查看归档了哪些文件

-zcf: 归档并调用gzip压缩

-zxf: 调用gzip解压缩并展开归档,-z选项可省略

-jcf: 归档并调用bzip2压缩

-jxf:调用bzip2解压缩并展开归档,-j选项可省略

-Jcf: 归档并调用 xz压缩

-Jxf:调用xz解压缩并展开归档,-J选项可省略

7、ccpio

cpio: 比tar更古老的归档工具

练习:写一个脚本

从键盘让用户输入几个文件,脚本能够将此几个文件归档压缩成一个文件;

read:

    -p “PROMPT”: 给出提示

[root@localhost ~]# vim tar.sh 

[root@localhost ~]# bash -n tar.sh 

[root@localhost ~]# ./tar.sh 

Please input three file:a b c

Destination:tar

Compress type:(gzip,bzip2,xz)xz

[root@localhost ~]# ll

total 20

-rw——-. 2 root root 1426 May 27 06:31 a

-rw——-. 2 root root 1426 May 27 06:31 anaconda-ks.cfg

lrwxrwxrwx. 1 root root   15 Jul 21 21:46 b -> anaconda-ks.cfg

-rw-r–r–. 1 root root    0 Jul 23 03:56 c

-rwxr-xr-x. 1 root root  378 Jul 23 04:09 tar.sh

-rw-r–r–. 1 root root 1072 Jul 23 04:09 tar.tar.xz

-rw-r–r–. 1 root root   32 Jul 23 03:12 test.xz

[root@localhost ~]# tar -tf tar.tar.xz 

a

b

c

#脚本

#!/bin/bash

#

read -p “Please input three file:” FILE1 FILE2 FILE3

read -p “Destination:” DEST

read -p “Compress type:(gzip,bzip2,xz)” TYPE

case $TYPE in

gzip)

        tar -zcf ${DEST}.tar.gz $FILE1 $FILE2 $FILE3;;

bzip2)

        tar -jcf ${DEST}.tar.bz2 $FILE1 $FILE2 $FILE3;;

xz)

        tar -cf ${DEST}.tar $FILE1 $FILE2 $FILE3

        xz ${DEST}.tar;;

$)

        echo “wrong Input,exiting”

        exit 9;;

esac

24、Linux文件系统及分区挂载

24.1 Linux支持的文件系统

1、文件操作:

    打开,关闭,创建,删除,修改

2、文件系统类型(Linux几乎全部支持)

FAT32,NTFS,ISO9660,CIFS,ext2(CentOS5),ext3(CentOS5,6),ext4(CentOS6,7),xfs(CentOS7),btrfs(CentOS7),reiserfs,jfs,nfs,ocfs2,gfs2

swap:交换分区(可以将硬盘当做内存用的部分,将一些不常用的进程放于swap当中)

数据库:swap可以分配小一点(512M,1G左右)

hadoop:swap可以分配大一点(8G甚至以上,太大影响系统速度)

光盘:iso9660

Windows:fat32,NTFS

UNIX:FFS,UFS,JFS2

网络文件系统:NFS,CIFS

集群文件系统:GFS2,OCFS2

分布式文件系统:ceph

moosefs,mogilefs,GlusterFS,Lustre

根据其是否支持“journal”功能:

日志文件系统(有日志区域):ext3,ext4,xfs,…

非日志型文件系统(无日志区域):ext2,vfat

3、文件系统的组成部分:

内核中的模块:ext4,xfs,vfat

用户空间的管理工具:mkfs.ext2,mkfs.ext4,mkfs.vffat(FAT32)

4、Linux VFS:Virtual File System(虚拟文件系统):

用来统一各种文件系统,为开发者提供一个标准的文件接口,所以Linux支持众多的文件系统

查看linux支持的文件系统:

[root@localhost ~]# cat /proc/filesystems 

nodev   sysfs

nodev   rootfs

nodev   ramfs

nodev   bdev

nodev   proc

nodev   cgroup

nodev   cpuset

nodev   tmpfs

nodev   devtmpfs

nodev   debugfs

nodev   securityfs

nodev   sockfs

nodev   pipefs

nodev   anon_inodefs

nodev   configfs

nodev   devpts

nodev   hugetlbfs

nodev   autofs

nodev   pstore

nodev   mqueue

nodev   selinuxfs

    xfs

[root@localhost ~]# 

查看内核支持的模块(CentOS 7)

[root@localhost ~]# lsmod

Module                  Size  Used by

ip6t_rpfilter          12595  1 

ipt_REJECT             12541  2 

nf_reject_ipv4         13373  1 ipt_REJECT

ip6t_REJECT            12625  2 

nf_reject_ipv6         13717  1 ip6t_REJECT

xt_conntrack           12760  17 

ip_set                 36439  0 

nfnetlink              14696  1 ip_set

ebtable_nat            12807  1 

ebtable_broute         12731  1 

bridge                136173  1 ebtable_broute

stp                    12976  1 bridge

llc                    14552  2 stp,bridge

ip6table_nat           12864  1 

nf_conntrack_ipv6      18935  10 

nf_defrag_ipv6         35104  1 nf_conntrack_ipv6

nf_nat_ipv6            14131  1 ip6table_nat

ip6table_mangle        12700  1 

ip6table_security      12710  1 

ip6table_raw           12683  1 

iptable_nat            12875  1 

nf_conntrack_ipv4      15053  9 

nf_defrag_ipv4         12729  1 nf_conntrack_ipv4

nf_nat_ipv4            14115  1 iptable_nat

nf_nat                 26787  2 nf_nat_ipv4,nf_nat_ipv6

nf_conntrack          133387  6 nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6

iptable_mangle         12695  1 

iptable_security       12705  1 

iptable_raw            12678  1 

ebtable_filter         12827  1 

ebtables               35009  3 ebtable_broute,ebtable_nat,ebtable_filter

ip6table_filter        12815  1 

ip6_tables             26901  5 ip6table_filter,ip6table_mangle,ip6table_security,ip6table_nat,ip6table_raw

iptable_filter         12810  1 

vmw_vsock_vmci_transport    30577  1 

vsock                  35327  2 vmw_vsock_vmci_transport

iosf_mbi               13523  0 

crc32_pclmul           13113  0 

ghash_clmulni_intel    13259  0 

aesni_intel            69884  0 

lrw                    13286  1 aesni_intel

gf128mul               14951  1 lrw

glue_helper            13990  1 aesni_intel

ablk_helper            13597  1 aesni_intel

cryptd                 20359  3 ghash_clmulni_intel,aesni_intel,ablk_helper

ppdev                  17671  0 

btusb                  41436  0 

btrtl                  12945  1 btusb

btbcm                  14040  1 btusb

btintel                15709  1 btusb

bluetooth             544565  5 btbcm,btrtl,btusb,btintel

vmw_balloon            18190  0 

joydev                 17377  0 

rfkill                 22391  1 bluetooth

sg                     40721  0 

pcspkr                 12718  0 

ahci                   34042  0 

libahci                31992  1 ahci

nfit                   49183  0 

nvme                   27722  0 

nvme_core              52964  1 nvme

libnvdimm             132047  1 nfit

parport_pc             28165  0 

parport                42299  2 ppdev,parport_pc

shpchp                 37032  0 

i2c_piix4              22390  0 

vmw_vmci               67013  1 vmw_vsock_vmci_transport

ip_tables              27115  5 iptable_security,iptable_filter,iptable_mangle,iptable_nat,iptable_raw

xfs                   978100  3 

libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

sd_mod                 46322  3 

crc_t10dif             12714  1 sd_mod

sr_mod                 22416  0 

cdrom                  42556  1 sr_mod

crct10dif_generic      12647  0 

ata_generic            12910  0 

pata_acpi              13038  0 

vmwgfx                235405  1 

drm_kms_helper        159169  1 vmwgfx

syscopyarea            12529  1 drm_kms_helper

sysfillrect            12701  1 drm_kms_helper

sysimgblt              12640  1 drm_kms_helper

fb_sys_fops            12703  1 drm_kms_helper

ttm                    99345  1 vmwgfx

drm                   370825  4 ttm,drm_kms_helper,vmwgfx

crct10dif_pclmul       14289  1 

crct10dif_common       12595  3 crct10dif_pclmul,crct10dif_generic,crc_t10dif

crc32c_intel           22079  1 

mptspi                 22542  2 

serio_raw              13413  0 

i2c_core               40756  3 drm,i2c_piix4,drm_kms_helper

e1000                 137500  0 

ata_piix               35038  0 

scsi_transport_spi     30732  1 mptspi

libata                238896  5 ahci,pata_acpi,libahci,ata_generic,ata_piix

mptscsih               40150  1 mptspi

mptbase               105960  2 mptspi,mptscsih

dm_mirror              22124  0 

dm_region_hash         20813  1 dm_mirror

dm_log                 18411  2 dm_region_hash,dm_mirror

dm_mod                123303  11 dm_log,dm_mirror

[root@localhost ~]# 

Linux每个分区就可以使用一个独立的文件系统,但最后都要被挂载在根目录下

CPU分为四个环

    最内部的环ring0跑内核,最外部的环ring3跑软件,ring1,ring2不在使用

所以只有内核可以进行硬件调用,软件必须通过内核才能实现硬件的调用

24.2 磁盘管理

1、文件系统管理

创建文件系统:重新创建文件系统会损坏原有文件

mkfs: make file system

(1)-t FSTYPE 

mkfs -t ext2 = mkfs.ext2

mkfs -t ext3 = mkfs.ext3 = mke2fs -j = mke2fs -t ext3

(2)mkfs.FS_TYPE /dev/DEVICE (FS_TYPE指的是文件系统类型)

mke2fs:专门管理ext系列文件系统:

-t {ext2|ext3|ext4}:指定格式

-j: 创建ext3类型文件系统(相当于-t ext3)

-b BLOCK_SIZE: 指定块大小,默认为4096;可用取值为1024、2048或4096;

-L LABEL:指定分区卷标;

-m #: 指定预留给超级用户的块数百分比(为管理人员预备的)

-i #: 用于指定为多少字节的空间创建一个inode,默认为8192;此大小不应小于block大小;

-N #: 指定inode个数;

-F: 强制创建文件系统;

-E: 用户指定额外文件系统属性; 

-O FEATURE[,…]:启用指定特性

-O ^FEATURE:关闭指定特性

[root@localhost ~]# mke2fs -b 1024 -m 3 -L MYDATA /dev/sdc

mke2fs 1.42.9 (28-Dec-2013)

/dev/sdc is entire device, not just one partition!

Proceed anyway? (y,n) y

Filesystem label=MYDATA

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

65536 inodes, 1048576 blocks

31457 blocks (3.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=68157440

128 block groups

8192 blocks per group, 8192 fragments per group

512 inodes per group

Superblock backups stored on blocks: 

    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553, 

    1024001

Allocating group tables: done                            

Writing inode tables: done                            

Writing superblocks and filesystem accounting information: done   

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: LABEL=”MYDATA” UUID=”a59eac3b-c56d-40a9-b433-972cdb48afa6″ TYPE=”ext2″ 

[root@localhost ~]# 

blkid: 查询或查看磁盘设备的相关属性

-U UUID:根据指定的UUID来查找对应的设备

-L  LABEL:根据制定的LABEL来查找对应的设备

    [root@localhost ~]# blkid

    /dev/sda1: UUID=”c3a88fcb-06d4-4775-9a27-971904c2b154″ TYPE=”xfs” 

    /dev/sda2: UUID=”0R0BFP-witm-SfMZ-d9an-26rT-JDtg-XzwGqy” TYPE=”LVM2_member” 

    /dev/mapper/centos-root: UUID=”71c7bb53-2826-49e8-bb0c-d6a112a01836″ TYPE=”xfs” 

    /dev/mapper/centos-swap: UUID=”eb2dd31d-36f2-47e7-a474-7025f2dd6a1b” TYPE=”swap” 

    /dev/mapper/centos-home: UUID=”92db6af3-9a84-4284-9a59-d4e9f79cb7ab” TYPE=”xfs

[root@localhost ~]# mkfs.ext4 /dev/sdc

mke2fs 1.42.9 (28-Dec-2013)

/dev/sdc is entire device, not just one partition!

Proceed anyway? (y,n) y

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

65536 inodes, 262144 blocks

13107 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=268435456

8 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

    32768, 98304, 163840, 229376

Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: UUID=”ae7e23e0-db47-4b53-bb5d-fda50773ab8c” TYPE=”ext4″ 

[root@localhost ~]# 

[root@localhost ~]# mkfs.ext4 /dev/sdc

mke2fs 1.42.9 (28-Dec-2013)

/dev/sdc is entire device, not just one partition!

Proceed anyway? (y,n) y

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

65536 inodes, 262144 blocks

13107 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=268435456

8 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks: 

    32768, 98304, 163840, 229376

Allocating group tables: done                            

Writing inode tables: done                            

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: UUID=”ae7e23e0-db47-4b53-bb5d-fda50773ab8c” TYPE=”ext4″ 

[root@localhost ~]# 

[root@localhost ~]# mkfs.xfs -L MYDATA /dev/sdc

mkfs.xfs: /dev/sdc appears to contain an existing filesystem (ext4).

mkfs.xfs: Use the -f option to force overwrite.

[root@localhost ~]# mkfs.xfs -f /dev/sdc

meta-data=/dev/sdc               isize=512    agcount=4, agsize=65536 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=1        finobt=0, sparse=0

data     =                       bsize=4096   blocks=262144, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=1

log      =internal log           bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: UUID=”dd14e08c-1757-4cc5-986c-53de7ec05f13″ TYPE=”xfs” 

[root@localhost ~]# mkfs.btrfs -f /dev/sdc

btrfs-progs v4.9.1

See http://btrfs.wiki.kernel.org for more information.

Label:              (null)

UUID:               9671cf06-920b-4738-9bba-81a3b00fc2db

Node size:          16384

Sector size:        4096

Filesystem size:    1.00GiB

Block groups:

  Data:             single            8.00MiB

  Metadata:         DUP              51.19MiB

  System:           DUP               8.00MiB

SSD detected:       no

Incompat features:  extref, skinny-metadata

Number of devices:  1

Devices:

   ID        SIZE  PATH

    1     1.00GiB  /dev/sdc

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: UUID=”9671cf06-920b-4738-9bba-81a3b00fc2db” UUID_SUB=”20223c43-c91d-4a50-9297-66e3433f6e11″ TYPE=”btrfs” 

[root@localhost ~]# 

2、其他常用工具

(1)e2label DEVICE [LABEL]

用于查看或定义EXT文件系统的卷标

[root@localhost ~]# e2label /dev/sdc

MYDATA

[root@localhost ~]# e2label /dev/sdc DATA

[root@localhost ~]# e2label /dev/sdc

DATA

[root@localhost ~]# 

(2)tune2fs: 调整文件系统的相关可调整属性的值

-l:查看指定文件系统超级块信息;super block

-j: 不损害原有数据,将ext2升级为ext3;

-L LABEL: 设定或修改卷标; 

-m #: 调整预留百分比;

-r #: 指定预留块数;

-O:文件系统属性启用或禁用

-o: 设定默认挂载选项;

        acl

-c #:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能;

-i #: 每挂载使用多少天后进行自检;0或-1表示关闭此功能;

-l: 显示超级块中的信息;

[root@localhost ~]# tune2fs -l /dev/sdc

tune2fs 1.42.9 (28-Dec-2013)

Filesystem volume name:   DATA

Last mounted on:          <not available>

Filesystem UUID:          a59eac3b-c56d-40a9-b433-972cdb48afa6

Filesystem magic number:  0xEF53

Filesystem revision #:    1 (dynamic)

Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super

Filesystem flags:         signed_directory_hash 

Default mount options:    user_xattr acl

Filesystem state:         clean

Errors behavior:          Continue

Filesystem OS type:       Linux

Inode count:              65536

Block count:              1048576

Reserved block count:     31457

Free blocks:              1029050

Free inodes:              65525

First block:              1

Block size:               1024

Fragment size:            1024

Reserved GDT blocks:      256

Blocks per group:         8192

Fragments per group:      8192

Inodes per group:         512

Inode blocks per group:   128

Filesystem created:       Mon Jul 12 23:36:08 2021

Last mount time:          n/a

Last write time:          Mon Jul 12 23:40:37 2021

Mount count:              0

Maximum mount count:      -1

Last checked:             Mon Jul 12 23:36:08 2021

Check interval:           0 (<none>)

Reserved blocks uid:      0 (user root)

Reserved blocks gid:      0 (group root)

First inode:              11

Inode size:           256

Required extra isize:     28

Desired extra isize:      28

Default directory hash:   half_md4

Directory Hash Seed:      89099a6f-887d-4624-88e4-97ad656b609e

[root@localhost ~]# 

(3)dumpe2fs: 显示文件属性信息

dumpe2fs [ -bfhixV ] [ -o superblock=superblock ] [ -o blocksize=blocksize ] device

    -h: 只显示超级块中的信息

[root@localhost ~]# dumpe2fs /dev/sdc

dumpe2fs 1.42.9 (28-Dec-2013)

Filesystem volume name:   DATA

Last mounted on:          <not available>

Filesystem UUID:          a59eac3b-c56d-40a9-b433-972cdb48afa6

Filesystem magic number:  0xEF53

Filesystem revision #:    1 (dynamic)

Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super

Filesystem flags:         signed_directory_hash 

Default mount options:    user_xattr acl

Filesystem state:         clean

Errors behavior:          Continue

Filesystem OS type:       Linux

Inode count:              65536

Block count:              1048576

Reserved block count:     31457

Free blocks:              1029050

Free inodes:              65525

First block:              1

Block size:               1024

Fragment size:            1024

Reserved GDT blocks:      256

Blocks per group:         8192

Fragments per group:      8192

Inodes per group:         512

Inode blocks per group:   128

Filesystem created:       Mon Jul 12 23:36:08 2021

Last mount time:          n/a

Last write time:          Mon Jul 12 23:40:37 2021

Mount count:              0

Maximum mount count:      -1

Last checked:             Mon Jul 12 23:36:08 2021

Check interval:           0 (<none>)

Reserved blocks uid:      0 (user root)

Reserved blocks gid:      0 (group root)

First inode:              11

Inode size:           256

Required extra isize:     28

Desired extra isize:      28

Default directory hash:   half_md4

Directory Hash Seed:      89099a6f-887d-4624-88e4-97ad656b609e

Group 0: (Blocks 1-8192)

  Primary superblock at 1, Group descriptors at 2-5

  Reserved GDT blocks at 6-261

  Block bitmap at 262 (+261), Inode bitmap at 263 (+262)

  Inode table at 264-391 (+263)

  7787 free blocks, 501 free inodes, 2 directories

  Free blocks: 406-8192

  Free inodes: 12-512

Group 1: (Blocks 8193-16384)

  Backup superblock at 8193, Group descriptors at 8194-8197

  Reserved GDT blocks at 8198-8453

  Block bitmap at 8454 (+261), Inode bitmap at 8455 (+262)

  Inode table at 8456-8583 (+263)

  7801 free blocks, 512 free inodes, 0 directories

  Free blocks: 8584-16384

  Free inodes: 513-1024

Group 2: (Blocks 16385-24576)

  Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)

  Inode table at 16387-16514 (+2)

  8062 free blocks, 512 free inodes, 0 directories

  Free blocks: 16515-24576

  Free inodes: 1025-1536

(4)fsck(file system check): 检查并修复Linux文件系统

    -t FSTYPE: 指定文件系统类型=fsck.FS_TYPE(FS_TYPE一定要与分区上已有文件类型相同)

    -a: 自动修复

[root@localhost ~]# blkid /dev/sdc

/dev/sdc: LABEL=”DATA” UUID=”a59eac3b-c56d-40a9-b433-972cdb48afa6″ TYPE=”ext2″ 

[root@localhost ~]# fsck.ext2 /dev/sdc

e2fsck 1.42.9 (28-Dec-2013)

DATA: clean, 11/65536 files, 19526/1048576 blocks

(5)e2fsck: 专用于修复ext2/ext3文件系统

    -f: 强制检查;(检查前需要先卸载设备)

    -p: 自动修复;

(6)mount:挂载

    挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录成为其他文件访问入口的行为称之为是挂载。

    卸载:解除此关联关系的过程称之为卸载;

mount 设备 挂载点

 mount DEVICE MOUNT_POINT

        -o loop: 挂载本地回环设备

    mount /dev/sda5 /mnt/test

    设备:

        设备文件:/dev/sda5

        卷标:LABEL=“”

        UUID: UUID=“”

    dir,挂载点:目录

        要求:

            1、此目录没有被其它进程使用;

            2、目录得事先存在;

            3、目录中的原有的文件将会暂时隐藏(最好选择空文件夹进行挂载);

mount: 显示当前系统已经挂载的设备及挂载点

mount [options] [-o options] DEVICE MOUNT_POINT

    -a: 自动挂载所有支持自动挂载的设备,(在/etc/fstab文件中定义,且挂载选项中有自动挂载功能)

    -n: 任何设备挂载时,默认都会更新/etc/mtab,使用—n选项意味着挂载设备时,不把信息写入此文件;

    -t FSTYPE: 指定正在挂载设备上的文件系统的类型;不使用此选项时,mount会调用blkid命令获取对应文件系统的类型;

    -r: (readonly)只读挂载,挂载光盘时常用此选项

    -w: (read and write)读写挂载

-L:以LABEL指定挂载设备

-U:以UUID指定挂载设备

    -o: 指定额外的挂载选项,也即指定文件系统启用的属性;

async:异步模式(速度快)

sync:同步模式(数据更安全,速度慢得多)

remount: 重新挂载当前文件系统

ro: 挂载为只读

rw: 读写挂载

atime:(默认)每次访问文件/目录都会更新访问时间戳

noatime:访问文件/目录不会更新访问时间戳(一般关闭,对于访问非常多的文件能显著提高访问速度)

diratime/nodiratime:目录的访问时间戳

auto/noauto:是否支持自动挂载

exec/noexec:是否支持文件系统上的应用程序运行为进程

dev/nodev:是否支持在此文件系统上使用设备文件

suid/noosuid:是否允许此文件系统更改SUID(避免黑客通过系统更改SUID)

remount:重新挂载

user/nouser:是否允许用户挂载此设备

acl:启动此文件系统上的acl功能

注:上述选项可多个同时使用,彼此使用逗号分割,尽量避免普通用户挂载

默认挂载选项:defaults

 defaults

              Use default options: rw, suid, dev, exec, auto, nouser, and async.

DEVICE为要挂载的设备:

(1)设备文件:例如/dev/sda1

(2)卷标:-L ‘LABEL‘,例如 -L ‘MYDATA’

(3)UUID,-U  ‘UUID’

(4)伪文件系统名称:proc,sysfs,devtmpfs,configfs

挂载完成后,要通过挂载点访问对应文件系统上的文件;

(7)/etc/fstab

文件系统的配置文件/etc/fstab,OS在初始时,会自动用mount挂载此文件中每行定义的每个文件系统

每行定义一个要挂载的文件系统

    [neeq@gbiccxbrl ~]$ cat /etc/fstab

    #

    # /etc/fstab

    # Created by anaconda on Fri Dec 18 10:31:29 2015

    #

    # 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

    #

要挂载的设备             挂载点                 文件系统类型    挂载选项        转储频率(备份频率)       文件系统自动检测次序

                                                                                                                                                                            (每多少天做一次完全备份)            (只有根可以为1)

    UUID=55b61d2f-b139-4336-a8ab-54389d9555a6 /                       ext4    defaults        1 1

    UUID=c49032e0-d885-4d14-91fd-ff973cea66c0 /boot                   ext4    defaults        1 2

    UUID=c31675c1-786c-479f-a6cf-01e263d2b4eb swap                    swap    defaults        0 0

    tmpfs                   /dev/shm                tmpfs   defaults        0 0

    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

    sysfs                   /sys                    sysfs   defaults        0 0

    proc                    /proc                   proc    defaults        0 0

    UUID=d9bf2e82-327b-488d-b606-55801d31a41d /svn                    ext4    defaults        1 1

    UUID=5999452a-7b86-42dc-8be9-fb31b0752f0b /webserver              ext4    defaults        1 1

fstab目录详解

要挂载的设备或伪文件系统:

设备文件,LABEL(LABEL=“”)、UUID(UUID=“”),伪文件系统名称(proc,sysfs)

挂载选项:

defaults

转储频率(一般不配置转储):

0:不做备份

1:每天转储

2:每隔一天转储

自检次序(一般不配置自检):

0:不自检

1:首先自检,一般只有rootfs才用1

mount -a:挂载/etc/fstab文件中定义的所有文件系统

fuser: 验正进程正在使用的文件或套接字文件

        -v: 查看某文件上正在运行的进程

        -k:杀死正在访问对应文件的进程

        -m:杀死正在访问挂载点的进程

    fuser -km MOUNT_POINT:终止正在访问此挂载点的所有进程

umount: 卸载某文件系统

    umount 设备/挂载点

    卸载注意事项:

        挂载的设备没有进程使用;

查看正在访问制定文件系统的用户

fuser -v /挂载点

清除正在访问此挂载点的所有进程

fuser -km /挂载点

24.3 swap分区及相关配置(非必要情况下建议不要使用交换分区)

    CPU多路复用通过:time slice

    X86CPU(32bit)当中

             Memory引入了虚拟地址,线性地址(每个进程认为自己有4G空间可用)

            对内存进行分页(page frame)

    如果内存满了,可以在硬盘上划分出一部分空间,将不常用的内存里面的进程移到硬盘当中

     这部分空间称之为是交换空间

    swap in:将内存里面的进程移到硬盘当中

    swap out:将硬盘里面的进程移到内存当中

    交换空间的存在使得内存可以过载使用

    Windows中称之为是虚拟内存

    linux中的交换分区为swap分区:

1、free

    查看当前系统的内存和虚拟内存使用情况 

    -m:以M为单位显示

    -h:进行单位换算

    [root@Daniel-R480 ~]# free

                  total        used        free      shared  buff/cache   available

    Mem:       33404872     6063620    27111900       17720      229352    27207520

    Swap:      31018612       70528    30948084

    [root@Daniel-R480 ~]# free -m

                  total        used        free      shared  buff/cache   available

    Mem:          32621        5922       26475          17         223       26568

    Swap:         30291          68       30222

    [root@Daniel-R480 ~]# free -h

                  total        used        free      shared  buff/cache   available

    Mem:            31G        5.8G         25G         17M        223M         25G

    Swap:           29G         68M         29G

    [root@Daniel-R480 ~]#

2、创建交换分区步骤:

(1)fdisk命令中,调整分区类型为82;

(2)mkswap /dev/sda8

-L LABEL

-U UUID

(3)启用或者关闭swap

swapon /dev/sda8(启用此设备中的交换空间)

-a:启用所有的定义在/etc/fstab文件中的交换设备

-p PRIORITY:指定优先级

swapoff /dev/sda8

3、回环设备及dd命令

    loopback, 使用软件来模拟实现硬件

    可使用回环设备来创建swap空间

    创建一个镜像文件,120G

dd命令:复制并转换文件

复制底层的数据流

if=数据来源

of=数据存储目标

bs=1(block size,复制的文件大小)

count=2(复制数目)

seek=#: 创建数据文件时,跳过的空间大小(可以用来创建虚假大小的文件,可以du来确认真实大小);

磁盘拷贝:

dd if=/dev/sda of=/dev/sdb

MBR的备份和还原    

    dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1

    dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1

破坏MBR中的bootloader:

dd if=/dev/zero of=/dev/sda bs=256 count=1

    创建一个大小为1024的镜像文件

    dd if=/dev/zero of=/var/swapfile bs=1M count=1024

    /dev/zero:可以无限的出0

    /dev/null:可以吞掉所有的数据

24.4 光盘挂载

挂载光盘设备

光盘设备文件:

IDE:/dev/hdc

SATA:/dev/sr0

符号链接文件:

/dev/cdrom

/dev/cdrw

/dev/dvd

/dev/dvdrw

mount -r /dev/cdrom /media/cdrom

unmount /dev/cdrom

练习:

1、创建一个2G的分区,文件系统为ext2,卷标为DATA,块大小为1024,预留管理空间为磁盘分区的8%;挂载至/backup目录,要求使用卷标进行挂载,且在挂载时启动此文件系统上的acl功能;

[root@localhost ~]# fdisk -l

#查看目前存在的硬盘,有sda,sdb,sdc,nvme0n1四块盘

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x000acbe0

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *        2048     2099199     1048576   83  Linux

/dev/sda2         2099200   209715199   103808000   8e  Linux LVM

Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-swap: 8455 MB, 8455716864 bytes, 16515072 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/nvme0n1: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-home: 44.1 GB, 44149243904 bytes, 86228992 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@localhost ~]# fdisk /dev/sdb

#选择sdb进行实验

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Device does not contain a recognized partition table

Building a new DOS disklabel with disk identifier 0xfa7592c5.

Command (m for help): n

#创建新的分区

Partition type:

   p   primary (0 primary, 0 extended, 4 free)

   e   extended

Select (default p): p

#选择基本分区或者是扩展分区,这里选择基本分区

Partition number (1-4, default 1): 1

First sector (2048-41943039, default 2048): 2048

#配置初始sector,默认即可

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 2g^H

#配置最后的sector,这个根据需求,按照标准来配置,前3个是错误示范

Value out of range.

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 2g

Value out of range.

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 2G

Value out of range.

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G

Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): w

#保存退出

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

[root@localhost ~]# partx /dev/sdb

#声明分区,让内核进行读取

NR START     END SECTORS SIZE NAME UUID

 1  2048 4196351 4194304   2G      

[root@localhost ~]# fdisk -l /dev/sdb

#检查分区是否正常识别

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0xfa7592c5

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     4196351     2097152   83  Linux

#分区已经显示出来了,说明正常识别

[root@localhost ~]# mkfs.ext2 -L DATA -b 1024 -m 8 /dev/sdb1

#对分区进行格式化,配置文件系统

mke2fs 1.42.9 (28-Dec-2013)

Filesystem label=DATA

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

131072 inodes, 2097152 blocks

167772 blocks (8.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=69206016

256 block groups

8192 blocks per group, 8192 fragments per group

512 inodes per group

Superblock backups stored on blocks: 

   8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553, 

   1024001, 1990657

Allocating group tables: done                            

Writing inode tables: done                            

Writing superblocks and filesystem accounting information: done   

[root@localhost ~]# mkdir /backup

#创建分区要挂载的位置,这里是/backup

mkdir: cannot create directory ‘/backup’: File exists

[root@localhost ~]# blkid /dev/sdb1

#查看分区情况

/dev/sdb1: LABEL=”DATA” UUID=”0a96b1d2-eebe-4245-82b9-612ff8cde44c” TYPE=”ext2″ 

[root@localhost ~]# mount -o acl /dev/sdb1 /backup

#挂载分区至/backup,并配置acl

[root@localhost ~]# df -h

#检查是否正常挂载,出现sdb1即说明正常挂载

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/mapper/centos-home   42G   33M   42G   1% /home

/dev/sda1               1014M  143M  872M  15% /boot

tmpfs                    781M     0  781M   0% /run/user/0

/dev/sdb1                2.0G  3.1M  1.9G   1% /backup

[root@localhost ~]# 

2、将此文件系统的超级块中的信息中包含了block和inode的行保存至/tmp/partition.txt中;

#两个语句效果一样,选择一个进行执行即可,之后可以通过vim查看执行结果

[root@localhost ~]# dumpe2fs -h /dev/sdb1 | egrep -i  “block|inode” >> /tmp/partition.txt  

dumpe2fs 1.42.9 (28-Dec-2013)

[root@localhost ~]# vim /tmp/partition.txt 

[root@localhost ~]# tune2fs -l /dev/sdb1 | egrep -i  “block|inode” >> /tmp/partition.txt  

[root@localhost ~]# vim /tmp/partition.txt 

[root@localhost ~]# 

3、复制/etc目录中的所有文件至此文件系统;而后调整此文件系统类型为ext3,要求不能损坏已经复制而来的文件;

[root@localhost ~]# cp -r /etc/* /backup/

[root@localhost ~]# tune2fs -j  /dev/sdb1

tune2fs 1.42.9 (28-Dec-2013)

Creating journal inode: done

[root@localhost ~]# blkid /dev/sdb1

#查看分区类型

/dev/sdb1: LABEL=”DATA” UUID=”0a96b1d2-eebe-4245-82b9-612ff8cde44c” SEC_TYPE=”ext2″ TYPE=”ext3″ 

[root@localhost ~]# ls /backup/

#查看文件是否备份过来

4、调整其预留百分比为3%;

[root@localhost ~]# tune2fs -m 3 /dev/sdb1

tune2fs 1.42.9 (28-Dec-2013)

Setting reserved blocks percentage to 3% (62914 blocks)

[root@localhost ~]# 

5、以重新挂载的方式挂载此文件系统为不更新访问时间戳,并验正其效果;

[root@localhost ~]# stat /backup/inittab 

#当前时间戳

  File: ‘/backup/inittab’

  Size: 511          Blocks: 2          IO Block: 1024   regular file

Device: 811h/2065d   Inode: 53          Links: 1

Access: (0644/-rw-r–r–)  Uid: (    0/    root)   Gid: (    0/    root)

Context: unconfined_u:object_r:unlabeled_t:s0

Access: 2021-07-13 22:05:24.964712195 -0400

Modify: 2021-07-13 22:05:24.984712387 -0400

Change: 2021-07-13 22:05:24.984712387 -0400

 Birth: –

[root@localhost ~]# cat /backup/inittab 

#cat一下,修改时间戳

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

#

[root@localhost ~]# stat /backup/inittab 

#stat可以看到accesstime更新了

  File: ‘/backup/inittab’

  Size: 511          Blocks: 2          IO Block: 1024   regular file

Device: 811h/2065d   Inode: 53          Links: 1

Access: (0644/-rw-r–r–)  Uid: (    0/    root)   Gid: (    0/    root)

Context: unconfined_u:object_r:unlabeled_t:s0

Access: 2021-07-13 22:16:20.348151973 -0400

Modify: 2021-07-13 22:05:24.984712387 -0400

Change: 2021-07-13 22:05:24.984712387 -0400

 Birth: –

[root@localhost ~]# mount -o remount,noatime /backup/

#重新挂载为accesstime不随访问更改的系统

[root@localhost ~]# cat /backup/inittab

#cat测试,此时时间戳应该不会变 

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

#

[root@localhost ~]# stat /backup/inittab

#stat测试,时间戳确实没变

  File: ‘/backup/inittab’

  Size: 511          Blocks: 2          IO Block: 1024   regular file

Device: 811h/2065d   Inode: 53          Links: 1

Access: (0644/-rw-r–r–)  Uid: (    0/    root)   Gid: (    0/    root)

Context: unconfined_u:object_r:unlabeled_t:s0

Access: 2021-07-13 22:16:20.348151973 -0400

Modify: 2021-07-13 22:05:24.984712387 -0400

Change: 2021-07-13 22:05:24.984712387 -0400

 Birth: –

[root@localhost ~]# 

6、对此文件系统强行做一次检测;

[root@localhost ~]# e2fsck -f /dev/sdb1

e2fsck 1.42.9 (28-Dec-2013)

/dev/sdb1 is mounted.

e2fsck: Cannot continue, aborting.

[root@localhost ~]# umount /dev/sdb1

[root@localhost ~]# e2fsck -f /dev/sdb1

e2fsck 1.42.9 (28-Dec-2013)

Backing up journal inode block information.

Moving journal from /.journal to hidden inode.

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

DATA: ***** FILE SYSTEM WAS MODIFIED *****

DATA: 2372/131072 files (5.6% non-contiguous), 97234/2097152 blocks

[root@localhost ~]# 

7、删除复制而来的所有文件,并将此文件系统重新挂载为同步(sync);而后再次复制/etc目录中的所有文件至此挂载点,体验其性能变化;

[root@localhost ~]# mount /dev/sdb1 /backup/

[root@localhost ~]# mount -o remount,sync /backup

[root@localhost ~]# cp -ru /etc/* /backup/

[root@localhost ~]# cd 

23、磁盘及文件系统详解

23.1 磁盘管理(IO设备):

机械式硬盘:

    Cylinder:柱面

    分区是磁盘的逻辑边界

    磁盘刚出场时进行低级格式化,没有进行分区,创建磁道

    高级格式化:格式化以后可以创建文件系统

    Partition(分区):划分文件系统

    MBR(主引导记录):在零柱面,一般为512字节

        Master Boot Record

        Main Boot Record

                       446bytes:BootLoader,引导程序

                        64bytes:

                              16bytes:表示一个分区

                               前三个可以是主分区,第四个可以是扩展分区(指向其他地方的指针)

                                只能有四个分区,扩展分区只能有一个,扩展分区下的分区称之为是逻辑分区,逻辑分区可以有多个

                        2bytes:Magic Number

                              标记MBR是否有效    

    划分分区按柱面进行划分

    磁盘读写延迟,由硬盘的转速来决定,转速越快性能越好

    硬盘盘芯为真空,因为转速过快,要挡住灰尘,避免高温 

    文件系统是个管理软件,将磁盘划分为元数据(定义数据的编号和位置)和数据存储区

    位图(bitmap):

        用来确认存储空间使用情况的文件

             分为Inode bitmap和block bitmap

    Inode(Index Node):

        索引节点,存储和文件内容无关的文件信息

地址指针:

直接指针:

间接指针:

三级指针:

[root@localhost ~]# dumpe2fs /dev/sdb1 | tail -10

dumpe2fs 1.42.9 (28-Dec-2013)

  Inode table at 2080771-2080898 (+2)

  8059 free blocks, 492 free inodes, 3 directories

  Free blocks: 2080902-2088960

  Free inodes: 130069-130560

Group 255: (Blocks 2088961-2097151)

  Block bitmap at 2088961 (+0), Inode bitmap at 2088962 (+1)

  Inode table at 2088963-2089090 (+2)

  8061 free blocks, 512 free inodes, 0 directories

  Free blocks: 2089091-2097151

  Free inodes: 130561-131072

[root@localhost ~]# 

Inode bitmap:对应标识每个inode空闲与否的状态信息

  每个文件系统支持的单个文件的大小是不一样的

    目录:

        存储Inode号码和文件名

    尽可能让磁盘里面的文件使用连续的磁盘块,可以减少磁盘碎片,这样可以提升访问文件的速度

    创建分区会首先创建许多个块组

    块组:

        很多个小的逻辑分区,每个块组都有自己的块位图,Inode位图等信息

    Super block:

             保存全局信息,块组信息,inode信息

    block(块):一个大小一般为1024(1K),有的也为,2048(2K)或4096(4K)

    固态硬盘、U盘、光盘、软盘、硬件、磁带

23.2 链接文件

    链接文件:分为硬链接和符号连接

/etc/abc –à/usr/local/abc

    ln [-s -v] SRC DEST

-s代表软连接,不带任何选项代表硬链接,

-v(verbose)代表显示创建过程

    硬链接:直接指向同一个Inode的不同路径

    硬链接:

        1、只能对文件创建,不能应用于目录;

        2、不能跨文件系统;

        3、创建硬链接会增加文件被链接的次数(指向同一个inode的多个不同路径);

    符号连接:直接指向另一个文件的文件路径   

    符号链接:

        1、可应用于目录;

        2、可以跨文件系统,跨分区进行;

        3、不会增加被链接文件的链接次数;

        4、指向的是另一个文件的路径,其大小为指定的路径所包含的字符个数;

[root@localhost ~]# ln anaconda-ks.cfg a

[root@localhost ~]# ls -a

.   a                .bash_history  .bash_profile  .cshrc             .tcshrc

..  anaconda-ks.cfg  .bash_logout   .bashrc        .oracle_jre_usage  .viminfo

[root@localhost ~]# ll

total 8

-rw——-. 2 root root 1426 May 27 06:31 a

-rw——-. 2 root root 1426 May 27 06:31 anaconda-ks.cfg

[root@localhost ~]# ls -li

total 8

100663375 -rw——-. 2 root root 1426 May 27 06:31 a

100663375 -rw——-. 2 root root 1426 May 27 06:31 anaconda-ks.cfg

[root@localhost ~]# ln -s anaconda-ks.cfg b

[root@localhost ~]# ll -a

total 40

dr-xr-x—.  3 root root  194 Jul 21 21:46 .

dr-xr-xr-x. 17 root root  224 May 27 06:31 ..

-rw——-.  2 root root 1426 May 27 06:31 a

-rw——-.  2 root root 1426 May 27 06:31 anaconda-ks.cfg

lrwxrwxrwx.  1 root root   15 Jul 21 21:46 b -> anaconda-ks.cfg

-rw——-.  1 root root 4056 Jul 12 01:58 .bash_history

-rw-r–r–.  1 root root   18 Dec 28  2013 .bash_logout

-rw-r–r–.  1 root root  176 Dec 28  2013 .bash_profile

-rw-r–r–.  1 root root  176 Dec 28  2013 .bashrc

-rw-r–r–.  1 root root  100 Dec 28  2013 .cshrc

drwxr-xr-x.  2 root root   40 May 27 06:54 .oracle_jre_usage

-rw-r–r–.  1 root root  129 Dec 28  2013 .tcshrc

-rw——-.  1 root root 6448 May 31 02:46 .viminfo

[root@localhost ~]# ls -li

total 8

100663375 -rw——-. 2 root root 1426 May 27 06:31 a

100663375 -rw——-. 2 root root 1426 May 27 06:31 anaconda-ks.cfg

100663380 lrwxrwxrwx. 1 root root   15 Jul 21 21:46 b -> anaconda-ks.cfg

[root@localhost ~]# 

df :查看磁盘及文件系统占用

-h:human-readable

-i:ibodes instead of blocks

-P:以Posix兼容的格式输出

du:查看某目录总体空间占用状态:

-h:human-readable进行格式转换

-s:summary查看目录整体大小

[root@localhost ~]# df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   50G  2.6G   48G   6% /

devtmpfs                 3.9G     0  3.9G   0% /dev

tmpfs                    3.9G     0  3.9G   0% /dev/shm

tmpfs                    3.9G  8.7M  3.9G   1% /run

tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda1               1014M  143M  872M  15% /boot

/dev/mapper/centos-home   42G   33M   42G   1% /home

tmpfs                    781M     0  781M   0% /run/user/0

/dev/sdc2                 33M  782K   30M   3% /mydata

[root@localhost ~]# du -h

4.0K    ./.oracle_jre_usage

44K .

[root@localhost ~]# du -sh

44K .

[root@localhost ~]# 

23.3 设备文件:

    b(块设备): 按块为单位,随机访问的设备;

    c(字符设备):按字符为单位,线性设备;

    常见的设备

        b(块设备): 硬盘

        c(字符设备): 键盘

1、位置(/dev)

    [root@Daniel-R480 ~]# ls -lh /dev

    total 0

    drwxr-xr-x 1 root root     4.0K Jun 17 09:19 block

    lrwxrwxrwx 1 root root       13 Jun 17 09:19 fd -> /proc/self/fd

    crw-r–r– 1 root root   1,  11 Jun 17 09:19 kmsg

    crw-rw-rw- 1 root root  10,  50 Jun 17 09:19 lxss

    crw-rw-rw- 1 root root   1,   3 Jun 17 09:19 null

    crw-rw-rw- 1 root tty    5,   2 Jun 17 09:44 ptmx

    设备文件中间的两个数字为主设备号,次设备号,其无大小,存储主次设备号在inode中

        主设备号 (major number)

            标识设备类型

        次设备号 (minor number)

            标识同一种类型中不同设备

2、mknod(创建设备文件)

mknod [OPTION]… NAME TYPE [MAJOR MINOR]

    -m MODE指定权限

    [root@Daniel-R480 ~]# mknod -m 640 mydev2 c 66 0

    [root@Daniel-R480 ~]# ls -l

    total 32

    lrwxrwxrwx 1 root  root     1 Jun 17 10:42 abc -> a

    -rwxr-xr-x 1 root  root   230 Jun  9 14:50 addusers.sh

    -rwxr-xr-x 1 root  root   591 Jun 16 17:32 adminusers2.sh

    -rwxr-xr-x 1 root  root  1140 Jun 17 09:21 adminusers3.sh

    -rwxr-xr-x 1 root  root   559 Jun  9 15:21 adminusers.sh

    -rw——- 1 root  root  6921 Jan 29  2019 anaconda-ks.cfg

    -rw-r–r– 1 user2 root     0 Jun  9 17:32 b

    -rw-r–r– 1 root  root     0 Jun  9 17:32 c

    -rwxr-xr-x 1 root  root   106 Jun  9 10:01 calc.sh

    -rw-r–r– 1 root  root     0 Jun  9 17:32 d

    -rwxr-xr-x 1 root  root   173 Jun  9 14:55 delusers.sh

    -rwxr-xr-x 1 root  root   158 Jun 16 17:21 list2.sh

    -rwxr-xr-x 1 root  root   127 Jun 16 17:23 list.sh

    crw-r–r– 1 root  root 66, 0 Jun 17 11:01 mydev

    crw-r—– 1 root  root 66, 0 Jun 17 11:01 mydev2

    -rw——- 1 root  root  6577 Jan 29  2019 original-ks.cfg

    -rwxr-xr-x 1 root  root   250 Jun  9 09:43 quit.sh

    -rwxr-xr-x 1 root  root   562 Jun 17 09:37 showlogged.sh

    -rwxr-xr-x 1 root  root   198 Jun 16 17:31 sys.sh

    -rwxr-xr-x 1 root  root     0 Jun  8 17:50 test

    -rwxr-xr-x 1 root  root    87 Jun  9 10:36 testuser.sh

可以通过设备文件向某个设备直接传输数据

    [root@Daniel-R480 ~]# tty

    /dev/pts/0

    [root@Daniel-R480 ~]# echo hello >>/dev/pts/1

    [root@Daniel-R480 ~]# 

    #另一个终端下

    [root@Daniel-R480 ~]# tty

    /dev/pts/1

    [root@Daniel-R480 ~]# hello

3、硬盘设备的设备文件名:

    设备文件名和硬盘的接口类型有关

    IDE, ATA:hd

    SATA:sd

    SCSI: sd

    USB: sd

        a,b,c,…来区别同一种类型下的不同设备

    IDE: 一般PC机上只有两个IDE口,每个口上可以接两块盘

    分区方案

        第一个IDE口:主、从

                   /dev/hda, /dev/hdb

        第二个IDE口:主、从

                  /dev/hdc, /dev/hdd

    SATA/SCSI/USB分区方案

    sda, sdb, sdc, …

    hda: (IDE硬盘)

        hda1: 第一个主分区

        hda2: 

        hda3:

        hda4:

        hda5: 第一个逻辑分区(只能从hda5开始)

4、fdisk

(1)fdisk -l [/dev/to/some_device_file]

查看当前系统识别了几块硬盘:

[root@localhost dev]# fdisk -l

Disk /dev/sda: 1073 MB, 1073741824 bytes, 2097152 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x000acbe0

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1   *        2048     2099199     1048576   83  Linux

/dev/sdb2         2099200   209715199   103808000   8e  Linux LVM

Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-swap: 8455 MB, 8455716864 bytes, 16515072 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/nvme0n1: 1073 MB, 1073741824 bytes, 2097152 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/centos-home: 44.1 GB, 44149243904 bytes, 86228992 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@localhost dev]# 

(2)管理磁盘分区:

fdisk /dev/sda(对于一块硬盘来说,最多只能管理15分区)

    p: 显示当前硬件的分区,包括没保存的改动

    n: 创建新分区

        e: 扩展分区

        p: 主分区

    d: 删除一个分区

    w: 保存退出

    q: 不保存退出

    t: 修改分区类型

        L: 显示所有支持的分区类型

    l: 显示所支持的所有分区类型(在t命令里面用L)

[root@localhost ~]# fdisk /dev/sdc

Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

Command (m for help): p

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x06bd6860

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n

Partition type:

   p   primary (0 primary, 0 extended, 4 free)

   e   extended

Select (default p): p

Partition number (1-4, default 1): 1

First sector (2048-2097151, default 2048): 2048

Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): 1000000

Partition 1 of type Linux and of size 487.3 MiB is set

Command (m for help): p

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x06bd6860

   Device Boot      Start         End      Blocks   Id  System

/dev/sdc1            2048     1000000      498976+  83  Linux

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.

The kernel still uses the old table. The new table will be used at

the next reboot or after you run partprobe(8) or kpartx(8)

Syncing disks.

(3)查看内核是否已经识别新的分区

[root@localhost ~]# cat /proc/partitions | grep sdc

   8       32    1048576 sdc

   8       33     498976 sdc1

[root@localhost ~]# 

(4)partx:新版系统常用(通知内核重新读取硬盘分区表)

partx -a /dev/DEVICE

-n M:N(指定开始结束的位置,也可写为M:,:N)

kpartx -a /dev/DEVICE

-f:force(强制添加,风险比较大,尽量不使用)

CentOS 5

partprobe [/dev/device]:也可以用来修改分区 

5、判断文件状态

if [[ ! -s filename ]] <==如果文件存在且为空,-s代表存在不为空,!将他取反

then

ok

fi

-s 表示文件是否存在并且是否为非空

判断文件的参数如下

    -e 文件存在      

    -f file 是一个 regular 文件(不是目录或者设备文件)

    -s 文件长度不为 0

    -d 文件是个目录

    -b 文件是个块设备(软盘,cdrom 等等) 

    -c 文件是个字符设备(键盘,modem,声卡等等) 

     -p 文件是个管道

     -h 文件是个符号链接

    -L 文件是个符号链接

    -S 文件是个 socket

    -t 关联到一个终端设备的文件描述符,这个选项一般都用来检测是否在一个给定脚本中的 stdin[-t0]或[-t1]是一个终端

    -r 文件具有读权限(对于用户运行这个 test) 

     -w 文件具有写权限(对于用户运行这个 test) 

    -x 文件具有执行权限(对于用户运行这个 test)

6、文件操作

文件删除

文件复制

文件移动

练习:写一个脚本

通过命令行传递一个文件路径参数给脚本:

    如果参数多了或少了,报错;

    如果参数指定的路径对应的是目录而不是文件,报错;

而后,检查路径指定的文件是否为空或不存在,如果是,则新建此文件,并在文件中生成如下内容

#!/bin/bash

而后,使用vim编辑器打开此文件,并让光标处于这个文件的最后一行;

写个脚本,按如下方式执行:

mkscript.sh -v|–version VERSION -a|–author AUTHOR -t|–time DATETIME -d|–description DESCRIPTION -f|–file /PATH/TO/FILE -h|–help 

1、此脚本能创建或打开-f选项指向的文件/PATH/TO/FILE;如果其为空文件,能自动为其生成第一行;如果文件不空,且第一行不是#!/bin/bash,则中止此脚本,并报错“The file is not a bash script.”;

否则,则直接使用vim 打开此文件;

提示:/PATH/TO/FILE,要判断其目录是否存在;如果不存在,则报错;

2、如果为空文件,自动生成的第一行内容为:

#!/bin/bash

3、如果为空文件,且使用了-a选项,则在文件中添加“# Author: -a选项的参数”,比如:

# Author: Jerry

4、如果为空文件,且使用了-t选项,则在文件中添加“# Date: 脚本执行-t选项后指定的时间”,比如:

# Date: 2013-03-08 18:05

5、如果为空文件,且使用了-d选项,则在文件中添加“# Description: -d选项的内容”,比如:

# Description: Create a bash script file head.

6、如果为空文件,且使用了-v选项,则在文件添加“# Version: -v后跟的参数”,比如:

# Version: 0.1

6、-h选项只能单独使用,用于显示使用帮助;

7、其它选项,显示帮助信息;

说明:

这是一个用于创建脚本的脚本,它可以自动帮助创建一个bash脚本的文件头,这样,以后使用此脚本来创建其它脚本将变得比较高效。比如:

#!/bin/bash

# Author: Jerry(jerry@magedu.com)

# Date: 2013-03-08 18:05

# Description: Create a bash script file head.

# Version: 0.1

#

    #/bin/bash

    #

    #判断FILE是否存在

    FI=0

    #判断FILE是否为空

    FIL=0

    #添加作者

    AUT=0

    #date

    DAT=0

    #description

    DES=0

    #VERSION

    VER=0

    for I in `seq 0 $#`; do

      if [ $# -gt 0 ];then

       case $1 in

         -f|–file)

            FILE=$2

            if [ -e $FILE ];then

                   FI=1

               if [ -s $FILE ];then

                   FIL=1

               fi

            else

               echo -e “$FILE is no exist.\n mkscripts exitting…”

               exit 1

            fi

             shift 2;;

         -a)

            #if [ $FI -eq 1 ] && [ FIL -eq 0 ];then

               AUT=1

               AUTH=$2

            #fi

               shift 2;;

         -t)

            #if [ $FI -eq 1 ] && [ FIL -eq 0 ];then        

               DAT=1

               DATE=$2

            #fi

               shift 2;;

         -d)

            #if [ $FI -eq 1 ] && [ FIL -eq 0 ];then

               DES=1

               DESC=$2

            #fi

               shift 2;;

         -v)

            #if [ $FI -eq 1 ] && [ FIL -eq 0 ];then

               VER=1

               VERS=$2

           #fi

               shift 2;;

         -h)

            echo “Usage is :`basename $0` -v|–version VERSION -a|–author AUTHOR -t|–time DATETIME -d|–description DESCRIPTION -f|–file /PATH/TO/FILE -h|–help”

            exit 0;;

         *)

            echo “Usage is :`basename $0` -v|–version VERSION -a|–author AUTHOR -t|–time DATETIME -d|–description DESCRIPTION -f|–file /PATH/TO/FILE -h|–help”

            exit 2;;

       esac

      else

        break

      fi

    done

    #初始化配置

    if [ $FIL == 1 ];then

        if [ “`head -1 $FILE`” == “#!/bin/bash” ];then

          vim $FILE

          exit 0

        else

          echo “This is not a script.”

          exit 3

        fi

    else

       echo “#!/bin/bash” >> $FILE

    fi

    if [ $AUT == 1 ];then

        echo “#Auther:$AUTH” >> $FILE

    fi

    if [ $DAT == 1 ];then

        echo “#Date:$DATE” >> $FILE

    fi

    if [ $DES == 1 ];then

        echo “#Description:$DESC” >> $FILE

    fi

    if [ $VER == 1 ];then

        echo “#Version:$VERS” >> $FILE

    fi

22、bash脚本编程之五 case语句及脚本选项进阶

22.1 选择结构:

1、if语句

单分支、

    if: 

    if CONDITION; then

      statement

      …

    fi

    双分支、

    if CONDITION; then

      statement

      …

    else

      statement

      …

    fi

多分支

    if CONDITION1; then

      statement

      …

    elif CONDITION2; then

      statement

      …

    esle

      statement

      …

    fi

2、case语句:选择结构

    case SWITCH in 

    value1)

      statement

      …

      ;;

    value2)

      statement

      ..

      ;;

    *)

      statement

      …

      ;;

    esac

例1

    a-z

    A-Z

    0-9

    [abc]

    输出不同的对应结果

    #!/bin/bash

    #

    case $1 in

    [A-Z])

            echo “upper”;;

    [a-z])

            echo “lower”;;

    [0-9])

            echo “number”;;

    *)

            echo “wrong input”;;

    esac

例2

    只识别参数start,stop,restart,status其中之一

    #!/bin/bash

    #

    case $1 in

    start)

       echo start;;

    stop)

       echo stop;;

    restart)

       echo restart;;

    status)

       echo status;;

    *)

       echo “The usage is `basename $0` {start|stop|restart|status}”;;

    esac

例3

写一个脚本,可以接受选项及参数,而后能获取每一个参数,及选项的参数,并能根据选项做出特定的操作,比如

adminusers.sh –add tom.jerry –del tom,jerry -v|–verbose -h|–help

    #!/bin/bash

    #

    #调试信息

    DEBUG=0

    ADD=0

    DEL=0

    for I in `seq 0 $#`; do

      if [ $# -gt 0 ]; then

          case $1 in

          -v|–verbose)

            DEBUG=1

            shift ;;

          -h|–help)

            echo “Usage: `basename $0` –add USER_LIST –del USER_LIST -v|–verbose -h|–help”

            exit 0

            ;;

          –add)

            ADD=1

            ADDUSERS=$2

            shift 2

            ;;

          –del)

            DEL=1

            DELUSERS=$2

            shift 2

            ;;

          *)

            echo “Usage: `basename $0` –add USER_LIST –del USER_LIST -v|–verbose -h|–help”

            exit 7

            ;;

        esac

      fi

    done

    if [ $ADD -eq 1 ]; then

      for USER in `echo $ADDUSERS | sed ‘s@,@ @g’`; do

        if id $USER &> /dev/null; then

          [ $DEBUG -eq 1 ] && echo “$USER exists.”

        else

          useradd $USER

          [ $DEBUG -eq 1 ] && echo “Add user $USER finished.”

        fi

      done

    fi

    if [ $DEL -eq 1 ]; then

      for USER in `echo $DELUSERS | sed ‘s@,@ @g’`; do

        if id $USER &> /dev/null; then

          userdel -r $USER

         [ $DEBUG -eq 1 ] && echo “Delete $USER finished.”

        else

         [ $DEBUG -eq 1 ] && echo “$USER not exist.”

        fi

      done

    fi

例4

练习:写一个脚本showlogged.sh,其用法格式为:

showlogged.sh -v -c -h|–help

其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息;如

Logged users: 4. 

They are:

root     tty2         Feb 18 02:41

root     pts/1        Mar  8 08:36 (172.16.100.177)

root     pts/5        Mar  8 07:56 (172.16.100.177)

hadoop   pts/6        Mar  8 09:16 (172.16.100.177)

    #!/bin/bash

    #

    declare -i SHOWNUM=0

    declare -i SHOWUSERS=0

    for I in `seq 1 $#`; do

      if [ $# -gt 0 ]; then

        case $1 in

        -h|–help)

          echo “Usage: `basename $0` -h|–help -c|–count -v|–verbose”

          exit 0 ;;

        -v|–verbose)

          let SHOWUSERS=1

          shift ;;

        -c|–count)

          let SHOWNUM=1

          shift ;;

        *)

          echo “Usage: `basename $0` -h|–help -c|–count -v|–verbose”

          exit 8 ;;

        esac

      fi

    done

    if [ $SHOWNUM -eq 1 ]; then

      echo “Logged users: `who | wc -l`.”

      if [ $SHOWUSERS -eq 1 ]; then

        echo “They are:”

        who

      fi

    fi

21、文件系统访问控制列表FACL

练习:写一个脚本

写一个脚本,显示当前系统上shell为-s指定类型的用户,并统计其用户总数。-s选项后面跟的参数必须是/etc/shells文件中存在的shell类型,否则不执行此脚本。另外,此脚本还可以接受–help选项,以显示帮助信息。脚本执行形如:

./showshells.sh -s bash

显示结果形如:

BASH,3users,they are:

root,redhat,gentoo

#!/bin/bash

#

if [ $1 == ‘-s’ ]; then

  ! grep “${2}$” /etc/shells &> /dev/null && echo “Invalid shell.” && exit 7

elif [ $1 == ‘–help’ ];then

  echo “Usage: showshells.sh -s SHELL | –help”

  exit 0

else

  echo “Unknown Options.”

  exit 8

fi

NUMOFUSER=`grep “${2}$” /etc/passwd | wc -l`

SHELLUSERS=`grep “${2}$” /etc/passwd | cut -d: -f1`

SHELLUSERS=`echo $SHELLUSERS | sed ‘s@[[:space:]]@,@g’`

echo -e “$2, $NUMOFUSER users, they are: \n$SHELLUSERS”

${变量名}

21.1 文件系统访问控制列表:

tom:

    tom, tom基本组

jerry: other:r–

想让jerry访问tom创建的文件,并且不让其他人访问

FACL:Filesystem Access Control List(文件系统访问控制列表)

利用文件扩展保存额外的访问控制权限

jerry: rw-

21.1.1 FACL配置

(1)setfacl(设置FACL)

-m: 设定

u:UID:perm

g:GID:perm

-x:取消

u:UID

g:GID

(2)getfacl(查看FACL)

21.2 几个命令:

w:

查看当前登录到系统上的用户及其在处理的事情

who:

查看当前登录到系统上的用户及其登录信息

[root@Daniel-LASV ~]# who

root     pts/0        2021-06-10 01:58 (116.228.4.126)

[root@Daniel-LASV ~]# w

 01:59:05 up 215 days, 18:16,  1 user,  load average: 0.03, 0.01, 0.00

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     pts/0    116.228.4.126    01:58    1.00s  0.00s  0.00s w

[root@Daniel-LASV ~]# 

每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出;

sleep :

让进程延迟几秒钟

whoami:

当前系统的有效用户

last:

显示/var/log/wtmp文件,显示用户登录历史及系统重启历史

    -n #: 显示最近#次的相关信息

    [root@Daniel-R480 tmp]# last -4

    root     pts/1        localhost        Thu Jun 10 09:54   still logged in   

    root     pts/0        localhost        Thu Jun 10 09:03   still logged in   

    root     pts/1        localhost        Wed Jun  9 17:16 – 09:54  (16:37)    

    root     pts/0        localhost        Wed Jun  9 17:04 – 09:03  (15:59)    

    wtmp begins Wed Jun  9 14:30:27 2021

lastb:

/var/log/btmp文件,显示用户错误的登录尝试

-n #:

    [root@Daniel-SHSH ~]# lastb -3

    root     ssh:notty    65.78.170.48     Tue Jun  8 21:12 – 21:12  (00:00)    

    root     ssh:notty    65.78.170.48     Tue Jun  8 21:12 – 21:12  (00:00)    

    root     ssh:notty    65.78.170.48     Tue Jun  8 21:12 – 21:12  (00:00)    

    btmp begins Sat Jun  5 01:06:32 2021

lastlog: 

显示每一个用户最近一次的成功登录信息;

   -u USERNAME: 显示特定用户最近的登录信息

    [root@Daniel-R480 tmp]# lastlog -u daniel

    Username         Port     From             Latest

    daniel           pts/1                     Thu Jun 10 09:58:18 +0800 2021

basename:

    $0: 执行脚本时的脚本路径及名称

    [root@Daniel-R480 ~]# basename ./quit.sh 

    quit.sh

mail:

查看邮件

[root@Daniel-SHSH ~]# mail

No mail for root

hostname: 

       显示主机名

[root@Daniel-SHSH ~]# hostname

Daniel-SHSH

[root@Daniel-SHSH ~]# echo $HOSTNAME

Daniel-SHSH

[root@Daniel-R480 ~]# hostname test

[root@Daniel-R480 ~]# hostname

test

[root@Daniel-R480 ~]# su – root

Last login: Thu Jun 10 09:58:28 CST 2021 on tty1

[root@test ~]# 

如果当前主机的主机名不是www.magedu.com,就将其改为www.magedu.com

如果当前主机的主机名是localhost,就将其改为www.magedu.com

如果当前主机的主机名为空,或者为(none),或者为localhost,就将其改为www.magedu.com

[ -z `hostname` ] || [ `hostname` == ‘(none)’ o `hostname` == ‘localhost’ ] && hostname www.magedu.com

生成随机数

RANDOM: 0-32768

[daniel@Daniel-R480 ~]$ echo $RANDOM

20744

linux下的随机数生成器:熵池

/dev/random:

/dev/urandom:

终端类型:

console:控制台

pty:物理终端(通过VGA连接)

tty:虚拟终端(通过vga连接)

ttys:串行终端

pts/#:伪终端

写一个脚本,利用RANDOM生成10个随机数,并找出其中的最大值,和最小值;

#!/bin/bash

#

declare -i MAX=0

declare -i MIN=0

for I in {1..10}; do

  MYRAND=$RANDOM

  [ $I -eq 1 ] && MIN=$MYRAND

  if [ $I -le 9 ]; then

    echo -n “$MYRAND,”

  else

    echo “$MYRAND”

  fi

  [ $MYRAND -gt $MAX ] && MAX=$MYRAND

  [ $MYRAND -lt $MIN ] && MIN=$MYRAND

done

echo $MAX, $MIN

20、文件查找

grep, egrep, fgrep: 文本查找

20.1 命令

文件查找:

1、locate:

非实时,模糊匹配,查找是根据全系统文件数据库进行的;

# updatedb, 手动生成文件数据库

速度快

2、find:

实时,精确,支持众多查找标准

遍历指定目录中的所有文件完成查找,速度慢;

find +查找路径+查找标准+查找到以后的处理运作

查找路径:可省略默认为当前目录

查找标准:默认为指定路径下的所有文件

处理运作:默认为显示

匹配标准:

-name ‘FILENAME’:对文件名作精确匹配

文件名通配:

*:任意长度的任意字符

?

[]

-iname ‘FILENAME’: 文件名匹配时不区分大小写

-regex PATTERN:基于正则表达式进行文件名匹配

-user USERNAME: 根据属主查找

-group GROUPNAME: 根据属组查找

-uid UID: 根据UID查找

-gid GID: 根据GID查找

-nouser:查找没有属主的文件

-nogroup: 查找没有属组的文件

-type :根据文件类型来查找

f: 普通文件

d:目录

c:字符设备

b:块设备

l:链接文件,附加链接

p:管道设备

s:套接字设备

-size [+|-]:指定查找时的文件大小,不跟单位默认为字节,+代表大于,-代表小于,模糊统计,接近的数值都会被匹配

#k:表示kb

#M:表示M

#G:表示G

20.2 组合条件:

-a:与

-o:或

-not :非

/tmp目录,不是目录,并且还不能套接字类型的文件

/tmp/test目录下,属主不是user1,也不是user2的文件;

find ./ -not \( -user user1 -o -user user2 \)

find ./ -not -user user1 -a -not -user user2

-mtime:根据修改时间进行查找(默认为天)

-ctime:改变时间

-atime:访问时间

[+|-]#:(+)至少,(-)至多

-mmin:根据修改分钟进行查找

-cmin:改变分钟

-amin:访问分钟

[+|-]#:(+)至少,(-)至多

-perm MODE:精确匹配文件权限

/MODE: 任意一位匹配即满足条件

-MODE: 文件权限能完全包含此MODE时才符合条件

-644

644: rw-r–r–

755: rwxr-xr-x

750: rwxr-x—

find ./ -perm -001查找其他用户有执行权限的文件

20.3 运作:

-print: 显示(为默认)

-ls:类似ls -l的形式显示每一个文件的详细

-ok COMMAND {} \; 每一次操作都需要用户确认({}表示引用原先文件的文件名)

-exec COMMAND {} \;操作不需要用户确认

xargs命令比-exec更强大,更复杂

练习

1、查找/var目录下属主为root并且属组为mail的所有文件;

find /var -user root -group mail

2、查找/usr目录下不属于root,bin,或student的文件;

find /usr -not -user root -a -not -user bin -a -not -user student

find /usr -not \( -user root -o -user bin -o -user student \)

3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;

find /etc -mtime -7 -not \ ( -user root -o -user student \)

find /etc -mtime -7 -not -user root -a -not -user student

4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;

find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;

find /etc -size +1M >> /tmp/etc.largefiles

6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;

find /etc -not -perm /222 -ls        

19、vim编辑器

文本编辑器,字处理器

ASCII

简单的文本编辑器nano, sed

vi: Visual Interface

vim: VI iMproved(vi的增强版)

vimtutor:vim练习文档

vi为全屏编辑器,模式化编辑器

19.1 vim的模式及模式转换

    vim模式:

    编辑模式(命令模式):所有的命令作为编辑文档的操作

    输入模式:所有输入都默认用来直接输入为文本

    末行模式:可以输入很多编辑模式不支持的文件管理命令

    模式转换:

    编辑–>输入:

        i: 在当前光标所在字符的前面,转为输入模式;

        a: 在当前光标所在字符的后面,转为输入模式;

        o: 在当前光标所在行的下方,新建一行,并转为输入模式;

        I:在当前光标所在行的行首,转换为输入模式

        A:在当前光标所在行的行尾,转换为输入模式

        O:在当前光标所在行的上方,新建一行,并转为输入模式;

    输入–>编辑:

        ESC

    编辑–>末行:

        :

    末行–>编辑:

        ESC, ESC(一次或两次,有时需要敲两下)

19.2 打开及关闭文件

19.2.1打开文件

    # vim /path/to/somefile

        vim +# :打开文件,并定位于第#行 

        [root@Daniel-R480 ~]# vim +3 testuser.sh

        vim +:打开文件,定位至最后一行

        [root@Daniel-R480 ~]# vim + testuser.sh

        vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首

            [root@Daniel-R480 ~]# vim +/echo testuser.sh

        默认处于编辑模式

19.2.2 关闭文件(只能在编辑模式或者末行模式关闭)

1、末行模式关闭文件

                     :q  退出

                     :wq 保存并退出

                     :q! 不保存并退出

                     :w 保存

                     :w! 强行保存

                     :wq –> 😡

    2、编辑模式下退出

                      ZZ: 保存并退出

19.3 移动光标和翻屏

19.3.1 移动光标(编辑模式)

    1、逐字符移动:

        h: 左

        l: 右

        j: 下

        k: 上

     #h: 移动#个字符;

    2、以单词为单位移动

        w: 移至下一个单词的词首

        e: 跳至当前或下一个单词的词尾

        b: 跳至当前或前一个单词的词首

        #w: 移动至第#个单词的词首

    3、行内跳转:

        0: 绝对行首

        ^: 行首的第一个非空白字符

        $: 绝对行尾

    4、行间跳转

        #G:跳转至第#行;

        G:最后一行

        末行模式下,直接给出行号即可

19.3.2  翻屏

Ctrl+f: 向下翻一屏

Ctrl+b: 向上翻一屏

Ctrl+d: 向下翻半屏

Ctrl+u: 向上翻半屏

19.4 内容处理

19.4.1 删除单个字符

         x: 删除光标所在处的单个字符

         #x: 删除光标所在处及向后的共#个字符

19.4.2 删除命令: d

          d命令跟跳转命令组合使用;

          #dw, #de, #db

          dd: 删除当前光标所在行

         #dd: 删除包括当前光标所在行在内的#行;

    末行模式下:

    StartADD,EndADDd(起始地址到末地址加上d)

         .: 表示当前行

         $: 最后一行

         +#: 向下的#行

    删除的内容会被保存在缓冲区当中,可暂时保存

19.4.3 粘贴命令 p

    p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面;

    P: 如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面;

19.4.4 复制命令 y

    用法同d命令

    Vim中如何全选并复制?(区分大小写!!!)

    全部删除:按esc键后,先按gg(到达顶部),然后dG

    全部复制:按esc键后,先按gg,然后ggyG

    全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG

    单行复制:按esc键后,然后yy

    单行删除:按esc键后,然后dd

    粘贴:按esc键后,然后p

    From <https://zhuanlan.zhihu.com/p/51360394

19.4.5 修改:

先删除内容,再转换为输入模式

c: 用法同d命令

19.4.6 替换:r

R:进入替换模式

19.4.7 撤消编辑操作 u

u:撤消前一次的编辑操作(连续u命令可撤消此前的n次编辑操作)

#u: 直接撤消最近#次编辑操作

撤消最近一次的撤消操作:Ctrl+r

19.4.8 重复前一次编辑操作

.:输入.命令可直接实现

19.5 可视化模式及查找替换

19.5.1 可视化模式

v: 按字符选取

V:按矩形选取

19.5.2 查找

/PATTERN:从当前光标向文件尾部查找

?PATTERN:从当前光标向文件尾部查找

n:查看下一个

N:查看上一个

19.5.3 查找并替换

在末行模式下使用s命令

    ADDR1,ADDR2s@PATTERN@string@gi(起始结束地址+s@初始字符@要替换的字符@,其中@也可以用/替换)(g全局替换,i忽略大小写)

1,$:表示第一行到最后一行

%:表示全文

练习:

将/etc/yum.repos.d/server.repo文件中的ftp://instructor.example.com/pub替换为http://172.16.0.1/yum

%s/ftp:\/\/instructor\.example\.com\/pub/http:\/\/172.16.0.1\/yum/g

%s@ftp://instructor\.example\.com/pub@http://172.16.0.1/yum@g

文件内容如下:

# repos on instructor for classroom use

# Main rhel5 server

[base]

name=Instructor Server Repository

baseurl=ftp://172.16.0.1/pub/Server

gpgcheck=0

# This one is needed for xen packages

[VT]

name=Instructor VT Repository

baseurl=ftp://172.16.0.1/pub/VT

gpgcheck=0

# This one is needed for clustering packages

[Cluster]

name=Instructor Cluster Repository

baseurl=ftp://172.16.0.1/pub/Cluster

gpgcheck=0

# This one is needed for cluster storage (GFS, iSCSI target, etc…) packages

[ClusterStorage]

name=Instructor ClusterStorage Repository

baseurl=ftp://172.16.0.1/pub/ClusterStorage

gpgcheck=0

19.6 文件选择和显示方案

19.6.1 使用vim编辑多个文件

vim FILE1 FILE2 FILE3

:next 切换至下一个文件

:prev 切换至前一个文件

:last 切换至最后一个文件

:first 切换至第一个文件

退出

:qa 全部退出

19.6.2 分屏显示一个文件

Ctrl+w, s: 水平拆分窗口

Ctrl+w, v: 垂直拆分窗口

在窗口间切换光标:

Ctrl+w, ARROW        

:qa 关闭所有窗口

19.6.3 分窗口编辑多个文件

vim -o : 水平分割显示

vim -O : 垂直分割显示

19.6.4 将当前文件中部分内容另存为另外一个文件

末行模式下使用w命令

:w

:ADDR1,ADDR2w /path/to/somewhere

19.6.5 将另外一个文件的内容填充在当前文件中

:r /path/to/somefile

19.6.6 跟shell交互

:! COMMAND

19.7 高级操作

19.7.1 显示或取消显示行号

显示行号

:set number

:set nu

取消显示行号

    :set nonu

19.7.2 显示忽略或区分字符大小写

忽略

:set ignorecase

:set ic

区分

:set noic

19.7.3 设定自动缩进

设定

:set autoindent

:set ai

取消

:set noai

19.7.4 查找到的文本高亮显示或取消

显示

:set hlsearch

取消

:set nohlsearch

19.7.5 语法高亮

高亮

:syntax on

取消

:syntax off

19.8 配置文件

/etc/vimrc

~/.vimrc

18、bash脚本编程之四 字符串测试,组合测试及for循环

练习:

传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来。

18.1 字符(串)测试:

    ==:测试是否相等,相等为真,不等为假(等号两端必须要加空格)

    !=: 测试是否不等,不等为真,等为假

    >:测试一个字符串是否大于另外一个字符串

    <:测试一个字符串是否小于另外一个字符串

    -n string: 测试指定字符串是否为空,空则真,不空则假

    -z string: 测试指定字符串是否不空,不空为真,空则为假

    [root@Daniel-R480 ~]# A=hello

    [root@Daniel-R480 ~]# B=hi

    [root@Daniel-R480 ~]# [ “$A”==”B” ]

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]# [ “$A” == “B” ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]# [ “$A” = “$B” ]

    [root@Daniel-R480 ~]# echo $?

    1

    #‘’代表着直接对比A和B

    [root@Daniel-R480 ~]# [ ‘$A’ = ‘$B’ ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]# [ “$A” = “$B” ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# [ “$A” != “$B” ]

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]#

练习:写一个脚本

    传递一个参数(单字符就行)给脚本,如参数为q,就退出脚本;否则,就显示用户的参数;

练习:写一个脚本

    传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数;

    #!/bin/bash

    #

    if [ $1 = ‘q’ ];then

      echo “Quiting…”

      exit 1

    elif [ $1 = ‘Q’ ];then

      echo “Quiting…”

      exit 2  

    elif [ $1 = ‘quit’ ];then

      echo “Quiting…”

      exit 3 

    elif [ $1 = ‘Quit’ ];then

      echo “Quiting…”

      exit 4  

    else

      echo $1

    fi

18.2 组合测试条件

    -a: 与关系

    -o: 或关系

    !: 非关系

    if [ $# -gt 1 -a $# -le 3 ]

    if [ $# -gt 1 ] && [ $# -le 3 ]

    q, Q, quit, Quit

练习:

传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如:

./calc.sh 5 / 2

练习:

传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。

写一个脚本:

判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为AuthenticAMD,就显示其为AMD公司;

如果其生产商为GenuineIntel,就显示其为Intel公司;

否则,就说其为非主流公司;

写一个脚本:

给脚本传递三个整数,判断其中的最大数和最小数,并显示出来。

MAX=0

MAX -eq $1

MAX=$1

MAX -lt $2

MAX=$2

18.3 for循环

    循环:进入条件,退出条件

    for

    while

    until

    for 变量 in 列表; do

      循环体

    done

    for I in 1 2 3 4 5 6 7 8 9 10; do

      加法运算

    done

    遍历完成之后,退出;

如何生成列表:

(1){1..100}:直接通过数字列表

(2)`seq [起始数 [步进长度]] 结束数`:通过seq命令

    [root@Daniel-R480 ~]# seq 3

    1

    2

    3

    [root@Daniel-R480 ~]# seq 5 10

    5

    6

    7

    8

    9

    10

    [root@Daniel-R480 ~]# seq 2 2 10

    2

    4

    6

    8

    10

    [root@Daniel-R480 ~]#

    #!/bin/bash

    #

    declare -i SUM=0

    for I in {1..100};do

        let SUM=$[$SUM+$I]

    done

    echo “The sum is : $SUM”

    1,…,100

    declare -i SUM=0

        integer

        -x

写一个脚本:

1、设定变量FILE的值为/etc/passwd

2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:  

    Hello, root, your shell: /bin/bash

    [root@Daniel-R480 ~]# for I in `seq 1 $LINES`; do echo “Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`”; done

    Hello, root

    Hello, bin

    Hello, daemon

    Hello, adm

    Hello, lp

    Hello, sync

    Hello, shutdown

    Hello, halt

    Hello, mail

    Hello, operator

    Hello, games

    Hello, ftp

    Hello, nobody

    Hello, systemd-network

    Hello, dbus

    Hello, polkitd

    Hello, rpc

    Hello, rpcuser

    Hello, nfsnobody

    Hello, sshd

    Hello, postfix

    Hello, chrony

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

3、统计一共有多少个用户

    for I in `seq 1 $LINES`; do echo “Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`”; done

    只向默认shell为bash的用户问声好

写一个脚本:

1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加;

    #!/bin/bash

    #

    for I in {1..10};do

            if id user$I &>/dev/null; then

               echo “user$I exists.”

            else

               useradd user$I

               echo user$I | passwd –stdin user$I &> /dev/null

            fi

    done

    #!/bin/bash

    #

    for I in {1..10}; do

            if id user$I &>/dev/null; then

              userdel -r user$I

              echo “Delete user$I finished.”

            else

              echo “user$I not exist.”

            fi

    done

扩展:

接受一个参数:

add: 添加用户user1..user10

del: 删除用户user1..user10

其它:退出

    #!/bin/bash

    #

    if [ $# -lt 1 ];then

            echo “Usage; adminusers –ARG”

            exit 7

    fi

    if [ $1 == ‘–add’ ];then

      for I in {1..10}; do

            if id user$I &> /dev/null; then

              echo “user$I exists.”

            else

              useradd user$I

              echo user$I | passwd –stdin user$I &> /dev/null

              echo “Add user$I finished.”

            fi

       done

    elif [ $1 == ‘–del’ ]; then

       for I in {1..10};do

         if id user$I &> /dev/null;then

          userdel -r user$I

          echo “Delete user$I finished.”

         else

          echo “No user$I.”

         fi

       done

    else

       echo “Unknown ARG”

       exit 8

    fi

设置adminusers user1,user2,user3,hello,hi

    #!/bin/bash

    #

    if [ $1 == ‘–add’ ]; then

      for I in `echo $2 | sed ‘s/,/ /g’`;do

        if id $I &> /dev/null;then

          echo “$I exists.”

        else

          useradd $I

          echo $I | passwd –stdin $I &> /dev/null

          echo “add $I finished.”

         fi

       done

    elif [ $1 == ‘–del’ ]; then

      for I in `echo $2 | sed ‘s/,/ /g’`;do

        if id $I &> /dev/null;then

            userdel -r $I

            echo “Delete $I finished.”

        else

            echo “$I NOT exist.”

        fi

      done

    elif [ $1 == ‘–help’ ]; then

       echo “Usage:adminuser2.sh –add USER1,USER2,… | –del USER1,USER@@,…”

    else

      echo “Unknown options.”

    fi

写一个脚本:

计算100以内所有能被3整除的正整数的和;

取模,取余:%

3%2=1

100%55=45

写一个脚本:

计算100以内所有奇数的和以及所有偶数的和;分别显示之;

18.4 let命令和数据计算

    let命令

    let I=$[$I+1]

    SUM=$[$SUM+$I]和let SUM+=$I是一个意思

    let I+=1 相当于 let I++

    [root@Daniel-R480 ~]# I=3

    [root@Daniel-R480 ~]# let I++

    [root@Daniel-R480 ~]# echo $I

    4

    [root@Daniel-R480 ~]# let I++

    [root@Daniel-R480 ~]# echo $I

    5

    -=:表示=-相对应的数值

    let I-=1 相当于 let I–

    ++I, –I

    *=:表示=*相对应的数值

    /=:表示=/相对应的数值

    %=:表示=%(取余)相对应的数值

写一个脚本,

分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:

    BASH,3users,they are:

    root,redhat,gentoo

    NOLOGIN, 2users, they are:

    bin,ftp

    #!/bin/bash

    #

    NUMBASH=`grep “bash$” /etc/passwd | wc -l`

    BASHUSERS=`grep “bash$” /etc/passwd | cut -d: -f1`

    BASHUSERS=`echo $BASHUSERS | sed ‘s@[[:space:]]@,@g’`

    echo “BASH, $NUMBASH users, they are:”

    echo “$BASHUSERS

17、Sed命令及其用法

grep, sed(流编辑器/数据流编辑器), awk(报告文本生成器)    

17.1 sed基本用法:

sed: Stream Editor

    行编辑器 (全屏编辑器: vi)

sed: 模式空间

默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;

sed [options] ‘AddressCommand’ file …

    -n: 静默模式,不再默认显示模式空间中的内容

    -i: 直接修改原文件

    -e SCRIPT 可以同时执行多个脚本

               添加脚本到被执行的命令当中

    -f /PATH/TO/SED_SCRIPT

        sed -f /path/to/scripts  file

        添加脚本的内容到被执行的命令当中

    -r: 表示使用扩展正则表达式

17.2 Address制定方法:

1、StartLine,EndLine(起始行到结束行)

    比如1,100:第一行开始到第100行结束

    $:最后一行

    $-1:倒数第二行

2、/RegExp/(使用正则表达式来指定模式)

    /^root/

3、/pattern1/,/pattern2/

    第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行

4、LineNumber

    指定的行(指定精确某一行)

5、StartLine, +N

    从startLine开始,向后的N行,总共是N+1行

17.3 Command:

    d: 删除符合条件的行;

    p: 显示符合条件的行;

    a \string: 在指定的行后面追加新行,内容为string

        \n:可以用于换行

    i \string: 在指定的行前面添加新行,内容为string

    r FILE: 将指定的文件的内容添加至符合条件的行处

    w FILE: 将地址指定的范围内的行另存至指定的文件中; 

    s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串

        加修饰符(想要让所有的都替换的话要加修饰符)

        g: 全局替换

        i: 忽略字符大小写

    s///: s###, s@@@    效果都一样

        \(\), \1, \2,…      后向引用在这里也适用

    l..e: like–>liker

          love–>lover

          like–>Like

          love–>Love

    &: 引用模式匹配到的整个字符串

sed练习:

1、删除/etc/grub.conf文件中行首的空白符;

sed -r ‘s@^[[:spapce:]]+@@g’ /etc/grub.conf

[root@Daniel-R480 ~]# cat /etc/grub.conf

default=0

timeout=0

title CentOS Linux 7 (3.10.0-957.1.3.el7.x86_64)

        root (hd0)

        kernel /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d console=hvc0 LANG=en_US.UTF-8

        initrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img

[root@Daniel-R480 ~]# sed -r ‘s@^[[:space:]]+@@g’ /etc/grub.conf

default=0

timeout=0

title CentOS Linux 7 (3.10.0-957.1.3.el7.x86_64)

root (hd0)

kernel /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d console=hvc0 LANG=en_US.UTF-8

initrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img

[root@Daniel-R480 ~]#

2、替换/etc/inittab文件中”id:3:initdefault:”一行中的数字为5;

sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\15\2@g’ /etc/inittab

[root@Daniel-R480 ~]# cat /etc/inittab

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

id:3:initdefault:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

#

[root@Daniel-R480 ~]# sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\15\2@g’ /etc/inittab

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

id:5:initdefault:

3、删除/etc/inittab文件中的空白行;

sed ‘/^$/d’ /etc/inittab

[root@Daniel-R480 ~]# cat !$

cat /etc/inittab

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

id:3:initdefault:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

#

[root@Daniel-R480 ~]#

[root@Daniel-R480 ~]#

[root@Daniel-R480 ~]# sed ‘/^$/d’ /etc/inittab

# inittab is no longer used when using systemd.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

4、删除/etc/inittab文件中开头的#号; 

sed ‘s@^#@@g’ /etc/inittab

[root@Daniel-R480 ~]# sed ‘s@^#@@g’ /etc/inittab

 inittab is no longer used when using systemd.

 ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

 Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

 systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

id:3:initdefault:

 multi-user.target: analogous to runlevel 3

 graphical.target: analogous to runlevel 5

 To view current default target, run:

 systemctl get-default

 To set a default target, run:

 systemctl set-default TARGET.target

5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

sed -r ‘s@^#[[:space:]]+@@g’ /etc/inittab

[root@Daniel-R480 ~]# sed -r ‘s@^#[[:space:]]+@@g’ /etc/inittab

inittab is no longer used when using systemd.

#

ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

id:3:initdefault:

#

multi-user.target: analogous to runlevel 3

graphical.target: analogous to runlevel 5

#

To view current default target, run:

systemctl get-default

#

To set a default target, run:

systemctl set-default TARGET.target

#

6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#

sed -r ‘s@^[[:space:]]+#@@g’ /etc/inittab

7、取出一个文件路径的目录名称;

echo “/etc/rc.d/” | sed -r ‘s@^(/.*/)[^/]+/?@\1@g’  

基名:

echo “/etc/rc.d/” | sed -r ‘s@^/.*/([^/]+)/?@\1@g’  

#abc

# hello world

   # hi world

16、bash脚本编程之三 整数测试及特殊变量

16.1 算术运算方法

shell中如何进行算术运算:

A=3

B=6

1、let 算术运算表达式

        let C=$A+$B

2、$[算术运算表达式]

        C=$[$A+$B]

3、$((算术运算表达式))

        C=$(($A+$B))

4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

        C=`expr $A + $B`

16.2 测试方法:

[ expression ]

[[ expression ]]

test expression

bash中常用的条件测试有三种:

16.2.1 整数测试:

        -gt:大于

        -le:小于等于

        -ne:不等于

        -eq:等于

        -ge

        -lt

测试两个整数(只有进行整数测试时才能用[],其他情况一定不能加)

INT1=63

INT2=77

[ $INT1 -eq $INI2 ]

[[ $INT1 -eq $INT2 ]]

test $INT1 -eq $INT2  

16.2.2 文件测试: 

-e FILE:测试文件是否存在

-f FILE: 测试文件是否为普通文件

-d FILE: 测试指定路径是否为目录

-r FILE: 测试当前用户对指定文件是否有读取权限;

-w FILE: 测试当前用户对指定文件是否有写权限;

-x FILE: 测试当前用户对指定文件是否有执行权限;

例:

[ -e /etc/inittab ]

[ -x /etc/rc.d/rc.sysinit ]     

练习:写一个脚本

给定一个文件:

如果是一个普通文件,就显示之;

如果是一个目录,亦显示之;

否则,此为无法识别之文件;

16.3 定义脚本退出状态码

exit: 退出脚本

exit #

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;

测试脚本是否有语法错误:

bash -n 脚本(不能作为判断依据,只能用来参考)

bash -x 脚本:单步执行

16.4 bash变量的类型:

        (1)本地变量(局部变量)

        (2)环境变量

        (3)位置变量: 

                $1, $2, …(表示脚本的第n个参数)

                ./filetest.sh /etc/fstab /etc/inittab

                $1: /etc/fstab

                $2: /etc/inittab

                shift:轮换轮替

                [daniel@localhost tmp]$ vim shift.sh

                [daniel@localhost tmp]$ chmod +x shift.sh 

                [daniel@localhost tmp]$ ./shift.sh 

                [daniel@localhost tmp]$ ./shift.sh 1 2 3

                1

                2

                3

                [daniel@localhost tmp]$ help shift

                shift: shift [n]

                    Shift positional parameters.

                    Rename the positional parameters $N+1,$N+2 … to $1,$2 …  If N is

                    not given, it is assumed to be 1.

                    Exit Status:

                    Returns success unless N is negative or greater than $#.

                #!/bin/bash

                #

                echo $1

                shift

                echo $1

                shift

                echo $1

       (4)特殊变量:

                $?:上一条命令的退出状态码

                $#:参数的个数

                $*: 参数列表

                $@:参数列表

练习1:写一脚本

能接受一个参数(文件路径)

判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示”No such file.”

练习:写一个脚本

给脚本传递两个参数(整数);

显示此两者之和,之乘积;

#!/bin/bash

#

if [ $# -lt 2 ]; then

  echo “Usage: cacl.sh ARG1 ARG2”

  exit 8

fi

echo “The sum is: $[$1+$2].”

echo “The prod is: $[$1*$2].”

练习2:写一个脚本,完成以下任务

1、使用一个变量保存一个用户名;

2、删除此变量中的用户,且一并删除其家目录;

3、显示“用户删除完成”类的信息;

练习3:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行;

如果有,则显示其空白行数;否则,显示没有空白行。

#!/bin/bash

#grep “^$” /etc/inittab &> /dev/null

#TEST=$?

#if [ $TEST -eq 0 ];then

#    echo `grep “^$” /etc/inittab | wc -l`

#else

#    echo ” no blank lines”

#fi

###张帅

#!/bin/bash

#A=`grep ‘^$’ /etc/inittab | wc -l`

#if [ $A -gt 0 ]; then

# echo “$A”

#else

# echo “meiyoukongbaihang”

#fi

#脚本执行过程比较浪费,效率比较低,所以使用exit直接退出脚本

#!/bin/bash

FILE=/etc/inittab

if [ ! -e $FILE ]; then

  echo “No $FILE.”

  exit 8

fi

if grep “^$” $FILE &> /dev/null; then

  echo “Total blank lines: `grep “^$” $FILE | wc -l`.”

else

  echo “No blank line.”

练习4:写一个脚本

给定一个用户,判断其UID与GID是否一样

如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。

#!/bin/bash

USERNAME=user1

USERID=`id -u $USERNAME`

GROUPID=`id -g $USERNAME`

if [ $USERID -eq $GROUPID ]; then

  echo “Good guy.”

else

  echo “Bad guy.”

fi

进一步要求:不使用id命令获得其id号;

#!/bin/bash

#

USERNAME=user1

if ! grep “^$USERNAME\>” /etc/passwd &> /dev/null; then

  echo “No such user: $USERNAME.”

  exit 1

fi

USERID=`grep “^$USERNAME\>” /etc/passwd | cut -d: -f3`

GROUPID=`grep “^$USERNAME\>” /etc/passwd | cut -d: -f4`

if [ $USERID -eq $GROUPID ]; then

  echo “Good guy.”

else

  echo “Bad guy.”

fi

exit:退出脚本(用于定义执行状态及其结果)

exit +数值(0-255)0为正确,其他为错误

练习5:写一个脚本

给定一个用户,获取其密码警告期限;

而后判断用户密码使用期限是否已经小于警告期限;

提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

如果小于,则显示“Warning”;否则,就显示“OK”。

圆整:丢弃小数点后的所有内容(bash默认使用此种方式进行计算)

#!/bin/bash

W=`grep “student” /etc/shadow | cut -d: -f6`

S=`date +%s`

T=`expr $S/86400`

L=`grep “^student” /etc/shadow | cut -d: -f5`

N=`grep “^student” /etc/shadow | cut -d: -f3`

SY=$[$L-$[$T-$N]]

if [ $SY -lt $W ]; then

  echo ‘Warning’

else

  echo ‘OK’

fi

练习6:写一个脚本

判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”;否则显示“OK”。

15、bash脚本编程之二 条件判断及算术运算

15.1 条件判断:

        如果用户不存在

                添加用户,给密码并显示添加成功;

        否则

                显示如果已经没在,没有添加;

条件判断,控制结构:

1、单分支if语句

        if 判断条件; then

                statement1

                statement2

                …

        fi

        双分支的if语句:

        if 判断条件; then

                statement1

                statement2

                …

        else

                statement3

                statement4

                …

        fi

2、多分支的if语句:

        if 判断条件1; then

                statement1

                …

        elif 判断条件2; then

                statement2

                …

        elif 判断条件3; then

                statement3

                …

        else

                statement4

                …

        fi

15.2 bash中如何实现条件判断?

1、实现方法:

        1、查看状态返回值

2、条件测试类型:

        1、整数测试:判断整数是否正确

        2、字符测试

        3、文件测试

3、条件测试的表达式:

        1、[ expression ]

        2、[[ expression ]]

        3、test expression

4、整数比较:

        -eq: 测试两个整数是否相等;比如 $A -eq $B

        -ne: 测试两个整数是否不等;不等,为真;相等,为假;

        -gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;

        -lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;

        -ge: 大于或等于

        -le:小于或等于

        [root@Daniel-R480 ~]# A=3

        [root@Daniel-R480 ~]# B=6

        [root@Daniel-R480 ~]# [$A -eq $B]

        -bash: [3: command not found

        [root@Daniel-R480 ~]# [ $A -eq $B]

        -bash: [: missing `]’

        [root@Daniel-R480 ~]# [ $A -eq $B ]

        [root@Daniel-R480 ~]# echo $?

        1

        [root@Daniel-R480 ~]# [ $A -ne $B ]

        [root@Daniel-R480 ~]# echo $?

        0

        [root@Daniel-R480 ~]# [ $A -gt $B ]

        [root@Daniel-R480 ~]# echo $?

        1

        [root@Daniel-R480 ~]# [ $A -lt $B ]

        [root@Daniel-R480 ~]# echo $?

        0

        [root@Daniel-R480 ~]# [ $A -ge $B ]

        [root@Daniel-R480 ~]# echo $?

        1

        [root@Daniel-R480 ~]# [ $A -le $B ]

        [root@Daniel-R480 ~]# echo $?

        0

        [root@Daniel-R480 ~]#

5、命令的间逻辑关系:

        (1)逻辑与: &&

                第一个条件为假时,第二条件不用再判断,最终结果已经有;

                第一个条件为真时,第二条件必须得判断;

                [root@Daniel-R480 ~]# id user1 &>/dev/null && echo “hello student”

                hello student

                [root@Daniel-R480 ~]# id user3 &>/dev/null && echo “hello student”

                [root@Daniel-R480 ~]# useradd user3

                [root@Daniel-R480 ~]# id user3 &>/dev/null && echo “hello student”

                hello student

                [root@Daniel-R480 ~]#

        (2)逻辑或: ||

如果用户user6不存在,就添加用户user6

        ! id user6 && useradd user6

        id user6 || useradd user6

        [root@Daniel-R480 ~]# id user6 || useradd user6

        id: user6: no such user

        [root@Daniel-R480 ~]# id user6 || useradd user6

        uid=10019(user6) gid=10019(user6) groups=10019(user6)

        [root@Daniel-R480 ~]# id user6 || useradd user6

        uid=10019(user6) gid=10019(user6) groups=10019(user6)

        [root@Daniel-R480 ~]# id user6 &>/dev/null || useradd user6

        [root@DanielR480 ~]# (id user6 &>/dev/null || useradd user6)&& echo ‘hello user6’

        hello user6

        [root@Daniel-R480 ~]#

如果/etc/inittab文件的行数大于100,就显示好大的文件;

[ `wc -l /etc/inittab | cut -d’ ‘ -f1` -gt 100 ] && echo “Large file.”

6、变量名称定义规范:

        1、只能包含字母、数字和下划线,并且不能数字开头;

        2、不应该跟系统中已有的环境变量重名;

        3、最好做到见名知义;

如果用户存在,就显示用户已存在;否则,就添加此用户;

id user1 && echo “user1 exists.” || useradd user1

如果用户不存在,就添加;否则,显示其已经存在;

! id user1 && useradd user1 || echo “user1 exists.”

如果用户不存在,添加并且给密码;否则,显示其已经存在;

! id user1 && useradd user1 && echo “user1” | passwd –stdin user1      || echo “user1 exists.”

练习,写一个脚本,完成以下要求:

1、添加3个用户user1, user2, user3;但要先判断用户是否存在,不存在而后再添加;

2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;

3、最后显示当前系统上共有多少个用户;

练习,写一个脚本,完成以下要求:

给定一个用户:

        1、如果其UID为0,就显示此为管理员;

        2、否则,就显示其为普通用户;

如果其UID为0

  显示为管理员

否则

  显示为普通用户

        NAME=user16

        USERID=`id -u $NAME`

        if [ $USERID -eq 0 ]; then

        echo “Admin”

        else

        echo “common user.”

        fi

        NAME=user16

        if [ `id -u $NAME` -eq 0 ]; then

        echo “Admin”

        else

        echo “common user.”

        fi

        if id $NAME; then

练习:写一个脚本

判断当前系统上是否有用户的默认shell为bash;

   如果有,就显示有多少个这类用户;否则,就显示没有这类用户;

        #!/bin/bash

        #grep “bash$” /etc/passwd &> /dev/null

        grep “xsh$” /etc/passwd &> /dev/null

        RETVAL=$?

        if [ $RETVAL -eq 0 ];then

        #COUNT=`grep “bash$” /etc/passwd | wc -l`

        #echo $COUNT

        echo `grep “bash$” /etc/passwd | wc -l`

        else

        echo “There is no such users.”

        fi

        不能如此执行:if grep “bash$” /etc/passwd &> /dev/null; then

提示:“引用”一个命令的执行结果,要使用命令引用;比如: RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;

      使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如: if id user1一句中的id命令就一定不能加引号;

          如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id -u user1`;

      如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如

                id -u user1

                RETVAL=$?

                此句绝对不可以写为RETVAL=`id -u user1`;

练习:写一个脚本

判断当前系统上是否有用户的默认shell为bash;

   如果有,就显示其中一个的用户名;否则,就显示没有这类用户;

        #!/bin/bash

        grep “bash$” /etc/passwd &> /dev/null

        #grep “xsh$” /etc/passwd &> /dev/null

        RETVAL=$?

        if [ $RETVAL -eq 0 ];then

        #COUNT=`grep “bash$” /etc/passwd | wc -l`

        #echo $COUNT

        #echo `grep “bash$” /etc/passwd | wc -l`

        echo `grep “bash$” /etc/passwd | head -1 | cut -d’:’ -f1`

        else

        echo “There is no such users.”

        fi

        fi

14、bash脚本编程之一,变量和变量类型

14.1 shell编程:脚本编程基础

    编译器,解释器:将汇编语言或者是高级语言转换为机器语言的翻译设备或软件

    编程语言:机器语言、汇编语言、高级语言(符合人类的思考模式,而且能通过编译器转换为机器语言)

14.1.1 编程语言分类

    1、高级语言分类

        (1)静态语言:编译型语言

            强类型(变量类型)

            事先转换成可执行格式(不需要解释器就能执行)

            C、C++、JAVA、C#

        (2)动态语言:解释型语言, on the fly

            弱类型语言

            边解释边执行(必须要解释器才能正常执行)

            PHP、SHELL、python、perl

    2、根据执行情况分类

        面向过程(着眼点再解决问题本身):Shell, C

        面向对象(着眼点在于一个一个的对象): JAVA, Python, perl, C++

        变量:内存空间,命名,可以不断地更新内容

        内存:编址的存储单元

        进程:将数据临时放于内存当中

            1+100:

            1+1000000

            1

14.1.2 bash: 

    1、保存类型:

        (1)字符

        (2)数值

            (a)整型

            (b)浮点型: 11.23, 1.123*10^1, 0.1123*10^2

            2013/10/10, 存为字符串格式需要64bit

            99999: 存为数字格式需要24bit, 

        (3)真、假

            整型,8bit,保存256的话会发生溢出,导致部分程序运行不正常,称之为是缓冲区溢出

            逻辑运算

            逻辑:1+1>2

            逻辑运算:与、或、非、异或

                1: 真

                0: 假

        与

            1 & 0  = 0

            0 & 1 = 0

            0 & 0 = 0

            1 & 1 = 1

        或:

        非:

            ! 真 = 假

            ! 假 = 真

        异或

            操作数相同为假,不同则为真

14.2 变量及变量操作

        shell: 弱类型编程语言

14.2.1 变量类型:

    强:变量在使用前,必须事先声明,甚至还需要初始化;

    弱:变量用时声明,甚至不区分类型;(一般默认为字符串)

    变量类型:事先确定数据的存储格式和长度

    变量赋值:VAR_NAME=VALUE

1、bash变量类型:

    环境变量:作用域为当前shell进程及其子进程;

        export VARNAME=VALUE

        VARNAME=VALUE

        export VARNAME

            “导出”

    本地变量(局部变量):set VARNAME=VALUE: 作用域为整个bash进程;(set可省略)

    引用变量:${VARNAME} (会造成混淆时使用{}),{}有时可省略

    局部变量:local VARNAME=VALUE:作用域为当前代码段;

    位置变量:$1, $2, …

    特殊变量(系统变量):用于保存一些特殊数据

        $?: 上一个命令的执行状态返回值;

    程序执行,可能有两类返回值:

        (1)程序执行结果

        (2)程序状态返回代码(0-255)

            0: 正确执行

            1-255:错误执行,1,2,127系统预留;其他的返回值可以自己定义

    [root@Daniel-R480 ~]# clear

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]# ll

    total 16

    -rw——- 1 root   root 6921 Jan 29  2019 anaconda-ks.cfg

    -rw-r–r– 1 root   root    0 Jun  7 10:55 cut

    -rw-r–r– 1 root   root    0 Jun  7 09:47 hellosa

    -rwx—— 1 apache root  513 Jun  4 11:52 inittab

    -rw——- 1 root   root 6577 Jan 29  2019 original-ks.cfg

    -rw-r–r– 1 root   root   15 Jun  7 10:53 passwd.txt

    -rw-r–r– 1 root   root   91 Jun  7 13:43 test2.txt

    -rw-r–r– 1 root   root   12 Jun  7 14:43 test3.txt

    -rw-r–r– 1 root   root   46 Jun  7 11:49 test.txt

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]# ld

    ld: no input files

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# id student &> /dev/null

    [root@Daniel-R480 ~]# echo $?

    1

    dev/null: 软件设备(模拟的不存在的设备), bit bucket,数据黑洞(会吞掉所有接受到的数据) 

    echo $?,可用来判断用户是否存在

    输出重定向:

        >,>>,2>,2>>,&>

    撤消变量:

        unset VARNAME

    查看当shell中变量:

        set

    查看当前shell中的环境变量:

        printenv

        env

        export

    [root@Daniel-R480 ~]# ANIMALS=PIG

    [root@Daniel-R480 ~]# ANIMALS=$ANIMALS:GOAT

    [root@Daniel-R480 ~]# echo $ANIMALS

    PIG:GOAT

    [root@Daniel-R480 ~]# ANIMALS=$ANIMALS:SHEEP

    [root@Daniel-R480 ~]# echo $ANIMALS

    PIG:GOAT:SHEEP

    shell默认不进行数据的运算

14.3 BASH脚本

    脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序

1、shebang: 魔数(每个脚本的第一行)

    #!/bin/bash(#!+脚本的解释路径)

    # 注释行,不执行(正文里面的#作用)

    [root@Daniel-R480 ~]# vim first.sh

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# file /bin/ls

    /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped

    [root@Daniel-R480 ~]# file first.sh

    first.sh: ASCII text

    [root@Daniel-R480 ~]# vim first.sh

    [root@Daniel-R480 ~]# file first.sh

    first.sh: Bourne-Again shell script, ASCII text executable

    [root@Daniel-R480 ~]# ll first.sh

    -rw-r–r– 1 root root 35 Jun  7 17:44 first.sh

    [root@Daniel-R480 ~]# chmod +x first.sh

    [root@Daniel-R480 ~]# ./first.sh

    #

    # /etc/fstab

    # Created by anaconda on Mon Jan 28 20:51:49 2019

    #

    # 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

    #

    UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d /                       xfs     defaults        0 0

    adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp      yp

    cache  db     games  kerberos  local  log   nis   preserve  spool  var.out

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# chmod -x first.sh

    [root@Daniel-R480 ~]# ll

    total 16

    -rw——- 1 root   root 6921 Jan 29  2019 anaconda-ks.cfg

    -rw-r–r– 1 root   root    0 Jun  7 10:55 cut

    -rw-r–r– 1 root   root   35 Jun  7 17:44 first.sh

    -rw-r–r– 1 root   root    0 Jun  7 09:47 hellosa

    -rwx—— 1 apache root  513 Jun  4 11:52 inittab

    -rw——- 1 root   root 6577 Jan 29  2019 original-ks.cfg

    -rw-r–r– 1 root   root   15 Jun  7 10:53 passwd.txt

    -rw-r–r– 1 root   root   91 Jun  7 13:43 test2.txt

    -rw-r–r– 1 root   root   12 Jun  7 14:43 test3.txt

    -rw-r–r– 1 root   root   46 Jun  7 11:49 test.txt

    [root@Daniel-R480 ~]# bash first.sh

    #

    # /etc/fstab

    # Created by anaconda on Mon Jan 28 20:51:49 2019

    #

    # 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

    #

    UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d /                       xfs     defaults        0 0

    adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp      yp

    cache  db     games  kerberos  local  log   nis   preserve  spool  var.out

    [root@Daniel-R480 ~]#

2、脚本和环境关系

    脚本在执行时会启动一个子shell进程;

        命令行中启动的脚本会继承当前shell环境变量;

        系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;

练习:

    写一个脚本,完成以下任务

    1、添加5个用户, user1,…, user5

    2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;

    3、每个用户添加完成后,都要显示用户某某已经成功添加;

    #!/bin/bash

    #

    useradd user1

    echo !$ | passwd –stdin &>/dev/null

    echo “Add user1 successfully!”

    useradd user2

    echo !$ | passwd –stdin &>/dev/null

    echo “Add user2 successfully!”

    useradd user3

    echo !$ | passwd –stdin &>/dev/null

    echo “Add user3 successfully!”

    useradd user4

    echo !$ | passwd –stdin &>/dev/null

    echo “Add user4 successfully!”

    useradd user5

    echo !$ | passwd –stdin &>/dev/null

    echo “Add user5 successfully!”

    [root@Daniel-R480 ~]# ./aduser.sh

        Add user1 successfully!

        Add user2 successfully!

        Add user3 successfully!

        Add user4 successfully!

        Add user5 successfully!

        [root@Daniel-R480 ~]# tail -5 /etc/passwd

        user1:x:4008:4008::/home/user1:/bin/bash

        user2:x:4009:4009::/home/user2:/bin/bash

        user3:x:4010:4010::/home/user3:/bin/bash

        user4:x:4011:4011::/home/user4:/bin/bash

        user5:x:4012:4012::/home/user5:/bin/bash

    [root@Daniel-R480 ~]#

13、egrep和扩展的正则表达式

13.1 grep

    REGEXP:REGular EXPression(正则表达式)

    Pattern: (模式)

    1、正则表达式:

        Basic REGEXP:基本

        Extended REGEXP:扩展

    2、基本正则表达式:

        .: 任意词

        []: 括号中间的任意单个字符

        [^]:反向选取

    3、次数匹配:

        *: 其前的字符匹配任意次

        \?: 0或1次

        \{m,n\}:至少m次,至多n次;

        .*: 任意长度的任意字符

    4、锚定:

        ^:行首

        $:行尾

        \<, \b:单词首

        \>, \b:单词尾

        \(\):用于实现分组引用

            \1, \2, \3, …(引用前面第n个小括号里面的内容)

    grep:使用基本正则表达式定义的模式来过滤文本的命令(默认只支持基本正则表达式);

        -i:忽略大小写

        -v:反向搜索

        -o:只显示匹配到的字符串

        –color:显示颜色

        -E: 使用扩展正则表达式

        -A #: 显示匹配到的某一行后面的第n行

        -B #: 显示匹配到的某一行前面的第n行

        -C #:显示匹配到的某一行前后面各n行

    [root@Daniel-R480 ~]# grep -A 2 ‘^core id’ /proc/cpuinfo

    core id         : 0

    cpu cores       : 4

    apicid          : 0

    [root@Daniel-R480 ~]# grep -B 2 ‘^core id’ /proc/cpuinfo

    physical id     : 0

    siblings        : 8

    core id         : 0

    [root@Daniel-R480 ~]# grep -C 2 ‘^core id’ /proc/cpuinfo

    physical id     : 0

    siblings        : 8

    core id         : 0

    cpu cores       : 4

    apicid          : 0

    —

13.2 扩展正则表达式:

    字符前面默认不加\

    1、字符匹配:

        .

        []

        [^]

    2、次数匹配:

        *: 

        ?:

        +: 匹配其前面的字符至少1次

        {m,n}

    3、位置锚定:

        ^

        $

        \<

        \>

    4、分组:

        ():分组

        \1, \2, \3, …

    5、或者

        |: or

        C|cat: C或cat(匹配的是C或者cat,匹配左边或者右边的内容)

        (C|c)at:Cat或者cat

    [root@Daniel-R480 ~]# grep -E –color ‘C|cat’ test3.txt

    cat

    Cat

    C

    [root@Daniel-R480 ~]# grep -E ‘C|cat’ test3.txt

    cat

    Cat

    C

    [root@Daniel-R480 ~]# grep -E ‘(C|c)at’ test3.txt

    cat

    Cat

    [root@Daniel-R480 ~]# cat ./test3.txt

    cat

    Cat

    C

    c

    [root@Daniel-R480 ~]#

grep -E = egrep 

练习

    1、显示所有以数字结尾且文件名中不包含空白的文件;

        ls *[^[:space:]]*[0-9]   ?????????

        \.让元字符表示它本身的意义

    找出/boot/grub/grub.conf文件中1-255之间的数字;

    [root@Daniel-R480 ~]# egrep ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ /boot/grub/grub.conf

    title CentOS Linux 7 (3.10.0-957.1.3.el7.x86_64)

            kernel /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d console=hvc0 LANG=en_US.UTF-8

            initrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img

    [root@Daniel-R480 ~]# ifconfig | egrep ‘\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’

            inet 192.168.18.116  netmask 255.255.255.0  broadcast 192.168.18.255

            inet www.danios.com  netmask 255.0.0.0

    [root@Daniel-R480 ~]# ifconfig | egrep –color ‘(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’

            inet 192.168.18.116  netmask 255.255.255.0  broadcast 192.168.18.255

            inet www.danios.com  netmask 255.0.0.0

    [root@Daniel-R480 ~]# ifconfig |  egrep ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’

            inet 192.168.18.116  netmask 255.255.255.0  broadcast 192.168.18.255

            ether e8:6a:64:86:12:9f  (Ethernet)

    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 1500

            inet www.danios.com  netmask 255.0.0.0

            inet6 ::1  prefixlen 128  scopeid 0xfe<compat,link,site,host>

    [root@Daniel-R480 ~]# ifconfig | egrep –color -o ‘(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2

    [0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’

    192.168.18.116

    255.255.255.0

    192.168.18.255

    www.danios.com

    255.0.0.0

    2、只输出ifconfig里面的ip地址

        IPv4: 

            5类:A B C D E

            A:1-127

            B:128-191

            C:192-223

    只显示ip地址

    [root@Daniel-R480 ~]# ifconfig | egrep ‘\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]

    |1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>’

            inet 192.168.18.116  netmask 255.255.255.0  broadcast 192.168.18.255

            inet www.danios.com  netmask 255.0.0.0

    [root@Daniel-R480 ~]# ifconfig | egrep -o ‘\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0

    -9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>’

    192.168.18.116

    www.danios.com

    [root@Daniel-R480 ~]#

12、grep及正则表达式

12.1 grep

    egrep:扩展正则表达式

    fgrep(快速的搜索): 不支持正则表达式,直接搜索字符本身

    grep: 根据模式搜索文本,并将符合模式的文本行显示出来。

    Pattern(模式): 文本字符和正则表达式的元字符组合而成的匹配条件

    grep [options] PATTERN [FILE…]

        -i:忽略字母大小写

        –color:对于被选中的目标用颜色显示

        -v: 显示没有被模式匹配到的行

        -o:只显示被模式匹配到的字符串

12.2 正则表达式(REGular EXPerssion,REGEXP)

    通常使用的匹配的字符

    *: 匹配任意长度的任意字符

    ?: 任意单个字符

    []:指定范围内的内容

    [^]:制定范围外的内容

12.2.1 正则表达式的元字符:

    1、元字符

        .  : 匹配任意单个字符

        []: 匹配指定范围内的任意单个字符

        [^]:匹配指定范围外的任意单个字符

        字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]

    [root@Daniel-R480 ~]# grep ‘r..t’ /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    operator:x:11:0:operator:/root:/sbin/nologin

    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    [root@Daniel-R480 ~]#

    2、匹配次数(贪婪模式,尽可能多的匹配):

        *: 匹配其前面的字符任意次  

        a, b, ab, aab, acb, adb, amnb

        a*b:a出现任意次之后跟着b 

    [root@Daniel-R480 ~]# grep ‘a*b’ test.txt

    b

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    a?b:匹配a任意次,然后加上b

    [root@Daniel-R480 ~]# grep ‘a\?b’ test.txt

    b

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    a.*b:a开头,b结尾,中间跟任意字符

    [root@Daniel-R480 ~]# grep ‘a.*b’ test.txt

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    3、匹配规则

        .*: 任意长度的任意字符

        \?: 匹配其前面的字符1次或0次

        \{m,n\}:匹配其前面的字符至少m次,至多n次

            \{1,\}

            \{0,3\}

    [root@Daniel-R480 ~]# grep ‘a\{1,3\}b’ test.txt

    ab

    aab

    abb

    asdbsdabsfdab

    [root@Daniel-R480 ~]# grep ‘a.\{1,3\}b’ test.txt

    asb

    aab

    abb

    asdbsdabsfdab

    [root@Daniel-R480 ~]#

    4、位置锚定:

        ^: 锚定行首,此字符后面的任意内容必须出现在行首

        $: 锚定行尾,此字符前面的任意内容必须出现在行尾

        ^$: 空白行

        \<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现

        \>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

    [root@Daniel-R480 ~]# grep ‘r..t’ /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    operator:x:11:0:operator:/root:/sbin/nologin

    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    [root@Daniel-R480 ~]# grep ‘&r..t’ /etc/passwd

    [root@Daniel-R480 ~]# grep ‘^r..t’ /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    [root@Daniel-R480 tmp]# grep “root\>” ./test.txt

    This is root

    the user is mroot

    chroot is a command

    [root@Daniel-R480 tmp]# grep “\>root” ./test.txt

    [root@Daniel-R480 tmp]# grep “root\>” ./test.txt

    This is root

    the user is mroot

    chroot is a command

    [root@Daniel-R480 tmp]# grep “\<root” ./test.txt

    This is root

    rooter is a dog’s name

    [root@Daniel-R480 tmp]# grep “\<root\>” ./test.txt

    This is root

    [root@Daniel-R480 tmp]#

    5、分组:

    \(\):把内容分组

        \(ab\)*:ab可以出现任意次

        [root@Daniel-R480 ~]# cat test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]# grep “\(ab\)*” test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]# grep “\(ab\)\?” test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]#

    6、后向引用(被前面括号括起来的字符,可以在后面继续引用他)

        \1: 引用第一个左括号以及与之对应的右括号所包括的所有内容

        \2:引用第二个左括号以及与之对应的右括号所包括的所有内容

        \3:引用第三个左括号以及与之对应的右括号所包括的所有内容

    He love his lover.

    She like her liker.

    He like his lover.

    [root@Daniel-R480 ~]# vim test2.txt

    [root@Daniel-R480 ~]# grep ‘l..e’ test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker.

    [root@Daniel-R480 ~]# grep ‘l..e.*l..e’ test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker.

    [root@Daniel-R480 ~]# vim test2.txt

    [root@Daniel-R480 ~]# grep ‘l..e.*l..e’ test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker

    [root@Daniel-R480 ~]# grep ‘l..e.*\1’ test2.txt

    grep: Invalid back reference

    [root@Daniel-R480 ~]# grep ‘\(l..e\).*\1’ test2.txt

    He love his lover.

    She like her liker.

    l..e:l开头,e结尾

练习:

    1、显示/proc/meminfo文件中以不区分大小的s开头的行;

        [root@Daniel-R480 ~]# grep -i ‘^s’ /proc/meminfo

        SwapCached:            0 kB

        SwapTotal:      31018612 kB

        SwapFree:       31018612 kB

        Shmem:             17720 kB

        Slab:              13868 kB

        SReclaimable:       6744 kB

        SUnreclaim:         7124 kB

        [root@Daniel-R480 ~]# grep ‘^[sS]’ /proc/meminfo

        SwapCached:            0 kB

        SwapTotal:      31018612 kB

        SwapFree:       31018612 kB

        Shmem:             17720 kB

        Slab:              13868 kB

        SReclaimable:       6744 kB

        SUnreclaim:         7124 kB

        [root@Daniel-R480 ~]#

    2、显示/etc/passwd中以nologin结尾的行; 

        [root@Daniel-R480 ~]# grep ‘nologin$’ /etc/passwd

        bin:x:1:1:bin:/bin:/sbin/nologin

        daemon:x:2:2:daemon:/sbin:/sbin/nologin

        adm:x:3:4:adm:/var/adm:/sbin/nologin

        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

        mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

        operator:x:11:0:operator:/root:/sbin/nologin

        games:x:12:100:games:/usr/games:/sbin/nologin

        ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

        nobody:x:99:99:Nobody:/:/sbin/nologin

        systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

        dbus:x:81:81:System message bus:/:/sbin/nologin

        polkitd:x:999:998:User for polkitd:/:/sbin/nologin

        rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

        rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

        nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

        sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

        postfix:x:89:89::/var/spool/postfix:/sbin/nologin

        chrony:x:998:995::/var/lib/chrony:/sbin/nologin

        test3:x:10014:10014::/home/test3:/sbin/nologin

    取出默认shell为/sbin/nologin的用户列表

        [root@Daniel-R480 ~]# grep ‘nologin$’ /etc/passwd | cut -d: -f1

        bin

        daemon

        adm

        lp

        mail

        operator

        games

        ftp

        nobody

        systemd-network

        dbus

        polkitd

        rpc

        rpcuser

        nfsnobody

        sshd

        postfix

        chrony

        test3

        [root@Daniel-R480 ~]#

    取出默认shell为bash,且其用户ID号最小的用户的用户名

        [root@Daniel-R480 ~]# grep ‘bash$’ /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

        root

    3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

        [root@Daniel-R480 ~]# grep “^#[[:space:]]\{1,\}[^[:space:]]” /etc/inittab

        # inittab is no longer used when using systemd.

        # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

        # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

        # systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:

        # multi-user.target: analogous to runlevel 3

        # graphical.target: analogous to runlevel 5

        # To view current default target, run:

        # systemctl get-default

        # To set a default target, run:

        # systemctl set-default TARGET.target

        [root@Daniel-R480 ~]#

    4、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;

        [root@Daniel-R480 ~]# grep ‘^[[:space:]]\{1,\}’ /boot/grub/grub.conf

                root (hd0)

                kernel /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d console=hvc0 LANG=en_US.UTF-8

                initrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img

11、管道及I/O重定向

11.1 I/O以及I/O重定向

11.1.1 默认输入输出设备及程序运行流程简介

    管道和重定向:> < >> << 

    计算机5大部件:

        运算器、控制器: CPU

        存储器:RAM

        输入设备/输出设备

    程序:指令和数据(放于存储器中)

        控制器:读取指令,并读取需要的运算

        运算器:在控制器的控制线进行运算

        存储器:运算结果存储在存储器中

        三大总线:

            地址总线:内存寻址

            数据总线:传输数据

            控制总线:控制指令

    寄存器:CPU暂时存储器

    I/O设备(输入输出设备): 硬盘,键盘,鼠标

    程序运行时会使用默认的输入输出设备:INPUT设备,OUTPUT设备

    系统设定的默认输入输出设备

        默认输出设备:标准输出,STDOUT, 1

        默认输入设备:标准输入, STDIN, 0

        标准错误输出:STDERR, 2

    对于计算机来说:

        标准输入:键盘

        标准输出和错误输出:显示器(因为廉价,可以输出无限的东西)

    passwd –stdin(获取标准输入为密码)

11.1.2 I/O重定向

    I/O重定向:将默认的输入输出来源改变为自己设定的内容

    [root@Daniel-R480 ~]# ls /var

    adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp

    cache  db     games  kerberos  local  log   nis   preserve  spool  yp

    [root@Daniel-R480 ~]# ls /var >/var/var.out

    [root@Daniel-R480 ~]# vim /var/var.out

    [root@Daniel-R480 ~]# cat /var/var.out

    adm

    cache

    crash

    db

    empty

1、输出重定向

    Linux:

    (1)标准输出重定向

        >: 覆盖输出,覆盖原有的文件

        >>:追加输出

    set -C: 禁止对已经存在文件使用覆盖重定向;

        强制覆盖输出,则使用 >|

    set +C: 关闭上述功能

    (2)错误输出重定向

        2>: 重定向错误输出

        2>>: 追加方式

    [root@Daniel-R480 ~]# ls /varr > /tmp/var.out 2> /tmp/err.out

    [root@Daniel-R480 ~]# cat /tmp/err.out

    ls: cannot access /varr: No such file or directory

    [root@Daniel-R480 ~]#

    (3)标准和错误输出同时重定向

        &>: 重定向标准输出或错误输出至同一个文件

    [root@Daniel-R480 ~]# ls /varr &> /tmp/var.out

    [root@Daniel-R480 ~]# cat /tmp/var.out

    ls: cannot access /varr: No such file or directory

    [root@Daniel-R480 ~]#

2、输入重定向

    <:输入重定向

    <<:Here Document,在此处生成文档

    [root@Daniel-R480 ~]# cat << END

    > 123

    > 234

    > END

    123

    234

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# cat << EOF

    > 123

    > EOF

    123

    [root@Daniel-R480 ~]# cat >> ‘./test.txt’ << EOF

    > 123

    > 234

    > EOF

    [root@Daniel-R480 ~]# cat ./test.txt

    123

    234

    [root@Daniel-R480 ~]#

3、管道

    管道:前一个命令的输出,作为后一个命令的输入

        命令1 | 命令2 | 命令3 | …

    tee :既显示输入的内容,又保存到文件中

    [root@Daniel-R480 ~]# echo “hello world”| tee /tmp/hello.out

    hello world

    [root@Daniel-R480 ~]# cat /tmp/hello.out

    hello world

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# wc -l /etc/passwd

    32 /etc/passwd

    [root@Daniel-R480 ~]# wc -l /etc/passwd | cut -d’ ‘ -f1

    32

    [root@Daniel-R480 ~]#

练习:

    1、统计/usr/bin/目录下的文件个数;

    # ls /usr/bin | wc -l

    [root@Daniel-R480 ~]# ls -l /usr/bin | wc -l

    790

    [root@Daniel-R480 ~]# ls -l /usr/bin | head -1

    total 64504

    [root@Daniel-R480 ~]# ls -l /usr/bin | head -2

    total 64504

    -rwxr-xr-x 1 root root     41544 Oct 31  2018 [

    [root@Daniel-R480 ~]# ls -l /usr/bin | head -3

    total 64504

    -rwxr-xr-x 1 root root     41544 Oct 31  2018 [

    -rwxr-xr-x 1 root root    107848 Feb  3 00:33 a2p

    [root@Daniel-R480 ~]# ls -l /usr/bin | head -4

    total 64504

    -rwxr-xr-x 1 root root     41544 Oct 31  2018 [

    -rwxr-xr-x 1 root root    107848 Feb  3 00:33 a2p

    -rwxr-xr-x 1 root root     29200 Oct 30  2018 addr2line

    [root@Daniel-R480 ~]# ls -lh /usr/bin | head -1

    total 64M

    [root@Daniel-R480 ~]#

    2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;

    [root@Daniel-R480 ~]# cut -d: -f7 /etc/passwd | sort -u

    /bin/bash

    /bin/sh

    /bin/sync

    /sbin/halt

    /sbin/nologin

    /sbin/shutdown

    [root@Daniel-R480 ~]#

    3、思考:如何显示/var/log目录下每个文件的内容类型?

    [root@Daniel-R480 ~]# file /var/log/*

    /var/log/anaconda:           directory

    /var/log/audit:              directory

    /var/log/boot.log:           empty

    /var/log/btmp:               empty

    /var/log/chrony:             directory

    /var/log/cron:               empty

    /var/log/grubby_prune_debug: ASCII text

    /var/log/lastlog:            8086 relocatable (Microsoft)

    /var/log/maillog:            empty

    /var/log/messages:           empty

    /var/log/qemu-ga:            directory

    /var/log/rhsm:               directory

    /var/log/secure:             empty

    /var/log/spooler:            empty

    /var/log/tallylog:           empty

    /var/log/tuned:              directory

    /var/log/wtmp:               empty

    /var/log/yum.log:            ASCII text

    [root@Daniel-R480 ~]# file `ls /var/log`

    anaconda:           cannot open (No such file or directory)

    audit:              cannot open (No such file or directory)

    boot.log:           cannot open (No such file or directory)

    btmp:               cannot open (No such file or directory)

    chrony:             cannot open (No such file or directory)

    cron:               cannot open (No such file or directory)

    grubby_prune_debug: cannot open (No such file or directory)

    lastlog:            cannot open (No such file or directory)

    maillog:            cannot open (No such file or directory)

    messages:           cannot open (No such file or directory)

    qemu-ga:            cannot open (No such file or directory)

    rhsm:               cannot open (No such file or directory)

    secure:             cannot open (No such file or directory)

    spooler:            cannot open (No such file or directory)

    tallylog:           cannot open (No such file or directory)

    tuned:              cannot open (No such file or directory)

    wtmp:               cannot open (No such file or directory)

    yum.log:            cannot open (No such file or directory)

    [root@Daniel-R480 ~]# cd /var/log

    [root@Daniel-R480 log]# file `ls /var/log`

    anaconda:           directory

    audit:              directory

    boot.log:           empty

    btmp:               empty

    chrony:             directory

    cron:               empty

    grubby_prune_debug: ASCII text

    lastlog:            8086 relocatable (Microsoft)

    maillog:            empty

    messages:           empty

    qemu-ga:            directory

    rhsm:               directory

    secure:             empty

    spooler:            empty

    tallylog:           empty

    tuned:              directory

    wtmp:               empty

    yum.log:            ASCII text

    [root@Daniel-R480 log]#

    4、取出/etc/inittab文件的第6行;

    [root@Daniel-R480 ~]# head -6 /etc/inittab | tail -1

    #

    5、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;

    [root@Daniel-R480 ~]#  tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users

    user9:/bin/bash

    6、显示/etc目录下所有以pa开头的文件,并统计其个数;

    [root@Daniel-R480 ~]# ls -d /etc/pa* | wc -l

    3

    [root@Daniel-R480 ~]#

    7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;

    [root@Daniel-R480 ~]# echo “alias cls=clear” >> ~/.bashrc

    [root@Daniel-R480 ~]# cat ~/.bashrc

    # .bashrc

    # User specific aliases and functions

    alias rm=’rm -i’

    alias cp=’cp -i’

    alias mv=’mv -i’

    # Source global definitions

    if [ -f /etc/bashrc ]; then

            . /etc/bashrc

    fi

    alias cls=clear

    [root@Daniel-R480 ~]#

10、用户权限管理(基本权限及特殊权限SUID)

10.1 基本权限

10.1.1 权限分类

    权限分为r, w, x

    1、对于文件来说:

        r:可读,可以使用类似cat等命令查看文件内容;

        w:可写,可以编辑或删除此文件;

        x: 可执行,eXacutable,可以命令提示符下当作命令提交给内核运行;

    2、对于目录来说:

        r: 可以对此目录执行ls以列出内部的所有文件;

        w: 可以在此目录创建文件;

        x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息;

    3、rwx和数值对照关系

        rwx:

            r–:只读

            r-x:读和执行

            —:无权限

        0 000 —:无权限

        1 001 –x: 执行

        2 010 -w-: 写

        3 011 -wx: 写和执行

        4 100 r–: 只读

        5 101 r-x: 读和执行

        6 110 rw-: 读写

        7 111 rwx: 读写执行

        755:rwxr-xr-x

    4、对应三类用户:

        u: 属主  g: 属组 o: 其它用户

10.2 特殊权限(passwd中显示s的权限)

    10.2.1 特殊权限分类

    1、SUID:

         运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;

            chmod u+s FILE

            chmod u-s FILE

        如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;

    2、SGID:

        运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;

            chmod g+s FILE

            chmod g-s FILE

        组develop team,用户 hadoop, hbase, hive

        在/tmp/project/文件夹中给其分配SGID权限,则develop team里的所有用户都可以更改删除任何文件

                develop

    3、Sticky:

     在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;

        chmod o+t DIR

        chmod o-t DIR

    4、组合及对应数字

        SUID SGID Sticky

        000: 

        001: 

        …

        110: 

        111:

        chmod 5755 /backup/test(5表示特殊权限)

        umask 0022

        umask 

10.3 chown:

     改变文件属主(只有管理员可以使用此命令)

    # chown USERNAME file,…将后面文件的属主改为指定用户

        -R: 修改目录及其内部文件的属主

        –reference=/path/to/somefile file,…将文件的属主属组更改为和reference对应文件一样

    # chgrp GRPNAME file,…更改文件属组为指定的group

        -R

        –reference=/path/to/somefile file,…

        [root@Daniel-R480 tmp]# chown apache hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 apache root    0 Jun  4 18:30 hi

        -rwx—— 1 root   root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root   root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root   root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]# chown –reference=./yum.log ./hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 root root    0 Jun  4 18:30 hi

        -rwx—— 1 root root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]#

    chown USERNAME:GRPNAME file,…

    chown USERNAME.GRPNAME file,…

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 root root    0 Jun  4 18:30 hi

        -rwx—— 1 root root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]#

        [root@Daniel-R480 tmp]#

        [root@Daniel-R480 tmp]# chown apache:apache ./hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 apache apache    0 Jun  4 18:30 hi

        -rwx—— 1 root   root   4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root   root    836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root   root      0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]# chown :root /tmp/hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 apache root    0 Jun  4 18:30 hi

        -rwx—— 1 root   root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root   root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root   root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]# chown –reference=/tmp/yum.log ./hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 root root    0 Jun  4 18:30 hi

        -rwx—— 1 root root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]#

10.4 chmod: 

    修改文件的权限

    1、修改三类用户的权限:

        chmod MODE file,…

            -R修改目录及其内部文件的权限

            –reference=/path/to/somefile file,…

        [root@Daniel-R480 tmp]# ll

        total 12

        -rw-r–r– 1 root root    0 Jun  4 18:30 hi

        -rwx—— 1 root root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]# chmod 777 ./hi

        [root@Daniel-R480 tmp]# ll

        total 12

        -rwxrwxrwx 1 root root    0 Jun  4 18:30 hi

        -rwx—— 1 root root 4733 Jan 29  2019 ks-script-5qnQJp

        -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

        -rw——- 1 root root    0 Jan 29  2019 yum.log

        [root@Daniel-R480 tmp]#

    2、修改某类用户或某些类用户权限:

        u,g,o,a

        u: 属主  g: 属组 o: 其它用户

        chmod 用户类别=MODE file,…

    3、修改某类用户的某位或某些位权限:

        u,g,o,a

        chmod 用户类别+|-MODE file,…

        [root@Daniel-R480 ~]# chmod g-r inittab

        [root@Daniel-R480 ~]# chmod 777 inittab

        [root@Daniel-R480 ~]#

练习:

    1、新建一个没有家目录的用户openstack;

    # useradd -M openstack

    2、复制/etc/skel为/home/openstack;

    # cp -r /etc/skel /home/openstack

    3、改变/home/openstack及其内部文件的属主属组均为openstack;

    # chown -R openstack:openstack /home/openstack

    4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限

    # chmod -R go= /home/openstack

    chmod -R 700 /home/openstack

    [root@Daniel-R480 ~]# useradd -M openstack

    [root@Daniel-R480 ~]# cp -r /etc/skel /home/openstack

    [root@Daniel-R480 ~]# chown -R openstack:openstack /home/openstack

    [root@Daniel-R480 ~]# chmod -R go= /home/openstack

    [root@Daniel-R480 ~]# ll /home/openstack/

    total 0

    su – openstack(测试创建是否正常)

    实验:手动添加用户hive, 基本组为hive (5000),附加组为mygroup

    无密码无法登陆,但是可以用管理员账户su过去

    opensll:创建密码的密文的命令

    [root@Daniel-R480 ~]# groupadd -g 5000 hive

    [root@Daniel-R480 ~]# groupadd mygroup

    [root@Daniel-R480 ~]# useradd -g hive -G mygroup -M hive

    [root@Daniel-R480 ~]# su – hive

    su: warning: cannot change directory to /home/hive: No such file or directory

    -bash-4.2$

10.5 umask

    umask:遮罩码

        666-umask:创建文件的默认权限

        777-umask:创建文件夹的默认权限

    [hive@Daniel-R480 ~]$ umask

    0002

    [hive@Daniel-R480 ~]$ umask 0022

    [hive@Daniel-R480 ~]$ touch hellosa

    [hive@Daniel-R480 ~]$ ll

    total 0

    -rw-rw-r– 1 hive hive 0 Jun  7 09:50 hellosa

    [hive@Daniel-R480 ~]$

    文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限加1;

    例:umask: 023

        文件权限:666-023=643 X 

        目录权限:777-023=754

    [hive@Daniel-R480 ~]$

    [hive@Daniel-R480 ~]$ umask 023

    [hive@Daniel-R480 ~]$ touch hellosa

    [hiv1e@Daniel-R480 ~]$ mkdir test

    [hive@Daniel-R480 ~]$ ll

    total 0

    -rw-r–r– 1 hive hive    0 Jun  7 09:52 hellosa

    drwxr-xr– 1 hive hive 4096 Jun  7 09:52 test

    [hive@Daniel-R480 ~]$

    用户重新登陆以后umask会重新配置,恢复默认

10.6 SHELL

    站在用户登录的角度来说,SHELL的类型:

    1、登录式shell:(完全切换)

        正常通过某终端登录

        su – USERNAME 

        su -l USERNAME

    2、非登录式shell:(半切换)

        su USERNAME

        图形终端下打开命令窗口

        自动执行的shell脚本

10.7 bash的配置文件:

    1、全局配置文件

        /etc/profile, /etc/profile.d/*.sh, /etc/bashrc

    2、个人配置文件

        ~/.bash_profile, ~/.bashrc

        用户登录时优先使用个人配置文件

    3、profile类的文件:

        设定环境变量

        运行命令或脚本

    4、bashrc类的文件:

        设定本地变量

        定义命令别名

    5、shell如何读取配置文件?

        登录式

        /etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc

        非登录式

        ~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh

    设置用户登录时显示hello

</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;[root@Daniel-R480&nbsp;~]#&nbsp;vim&nbsp;./.bash_profile</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;&nbsp;&nbsp;[root@Daniel-R480&nbsp;~]#&nbsp;su&nbsp;-&nbsp;root</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;&nbsp;&nbsp;Last&nbsp;login:&nbsp;Mon&nbsp;Jun&nbsp;&nbsp;7&nbsp;10:03:01&nbsp;CST&nbsp;2021&nbsp;on&nbsp;tty1</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;&nbsp;&nbsp;hello</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;&nbsp;&nbsp;[root@Daniel-R480&nbsp;~]#</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>#&nbsp;.bash_profile</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>#&nbsp;Get&nbsp;the&nbsp;aliases&nbsp;and&nbsp;functions</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>if&nbsp;[&nbsp;-f&nbsp;~/.bashrc&nbsp;];&nbsp;then</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;~/.bashrc</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>fi</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>#&nbsp;User&nbsp;specific&nbsp;environment&nbsp;and&nbsp;startup&nbsp;programs</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>PATH=$PATH:$HOME/bin</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>export&nbsp;PATH</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>echo hello</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>

bash: 脚本解释器

9、管理用户和组

9.1 用户组管理常用命令和文件

9.1.1 常用命令

    用户管理:

        useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage

    组管理:

        groupadd, groupdel, groupmod, gpasswd

    权限管理:

        chown, chgrp, chmod, umask

9.1.3 常用文件及其内容

    /etc/passwd:

        用户名:密码:UID:GID:注释:家目录:默认SHELL

    [root@Daniel-R480 default]# cat /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    /etc/group:

        组名:密码:GID:以此组为其附加组的用户列表

    [root@Daniel-R480 default]# cat /etc/group

    root:x:0:

    bin:x:1:

    daemon:x:2:

    sys:x:3:

    adm:x:4:

    tty:x:5:

    disk:x:6:

    /etc/shadow:

    用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:

    [root@Daniel-R480 default]# cat /etc/shadow

    root:$6$PFQ4zANu$LyrKxl8kGT/lYge0N0zj1f1ltbuvXaJIFale65FJ4gA/llvFXABl6kOL9KvQTMJ01W6Jxu81GSLx9qIBnq4Sv1:18782:0:99999:7:::

    bin:*:17834:0:99999:7:::

    daemon:*:17834:0:99999:7:::

    adm:*:17834:0:99999:7:::

9.2 添加用户

    useradd  [options]  USERNAME 

            -u UID 指定UID

            -g GID(基本组)

            -G GID,…  (附加组)

            -c “COMMENT” 指定注释信息

            -d /path/to/directory 指定某个目录

            -s SHELL  指定shell路径(一定要在/etc/shells里面)

            -m -k 创建用户家目录并且将/etc/skel/下面的用户配置文件导过来

            -M 不为用户创建家目录

            -r: 添加系统用户

    /etc/login.defs:文件用于在Linux创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。

    [root@Daniel-R480 ~]# ueradd -u 1000 test

    -bash: ueradd: command not found

    [root@Daniel-R480 ~]# useradd -u 1000 test

    useradd: UID 1000 is not unique

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# useradd -u 10011 test

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    test:x:10011:10011::/home/test:/bin/bash

    [root@Daniel-R480 ~]# useradd -g hellosa test1

    useradd: group ‘hellosa’ does not exist

    [root@Daniel-R480 ~]# useradd -g mygroup test1

    useradd: group ‘mygroup’ does not exist

    [root@Daniel-R480 ~]# groupadd test

    groupadd: group ‘test’ already exists

    [root@Daniel-R480 ~]# useradd -g test test1

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    test1:x:10012:10011::/home/test1:/bin/bash

    [root@Daniel-R480 ~]# useradd -G test test2

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    test2:x:10013:10013::/home/test2:/bin/bash

    [root@Daniel-R480 ~]# useradd -s /sbin/nologin test3

    [root@Daniel-R480 ~]# su – test3

    This account is currently not available.

    [root@Daniel-R480 ~]# useradd -M test4

    [root@Daniel-R480 ~]# su – test4

    su: warning: cannot change directory to /home/test4: No such file or directory

    -bash-4.2$

    -bash-4.2$

    -bash-4.2$

    -bash-4.2$

    -bash-4.2$ pwd

    /root

    -bash-4.2$ exit

    logout

    环境变量:

        PATH

        HISTSIZE

        SHELL(保存当前用户的默认shell)

    /etc/shells:指定了当前系统可用的安全shell

9.3 用户删除

    userdel:删除用户

    userdel [option] USERNAME(默认不删除用户的家目录)

        -r: 同时删除用户的家目录

    id:查看用户的帐号属性信息,可直接加用户

        -u 查看UID

        -g 查看可用的GID

        -G 查看所有的GID

        -n 查看名称

    [root@Daniel-R480 ~]# id test

    uid=10011(test) gid=10011(test) groups=10011(test)

    [root@Daniel-R480 ~]# id -u test

    10011

    [root@Daniel-R480 ~]# id -g test

    10011

    [root@Daniel-R480 ~]# id -G test

    10011

    [root@Daniel-R480 ~]# id -u -n  test

    test

    [root@Daniel-R480 ~]# id -g -n  test

    test

    [root@Daniel-R480 ~]# id -G -n  test

    test

    finger: 查看用户帐号信息

    finger USERNAME

    [root@Daniel-R480 ~]# finger test

    Login: test                             Name:

    Directory: /home/test                   Shell: /bin/bash

    Never logged in.

    No mail.

    No Plan.

9.4 修改用户帐号属性:

    usermod

        -u UID 修改用户UID

        -g GID 修改用户GID

        -a -G GID:不使用-a选项,会覆盖此前的附加组;

        -c 使用注释信息

        -d -m:给用户创建新的家目录,并将之前家目录的文件拷贝到新的家目录中

        -s 修改用户shell

        -l loginname 修改用户登录名

        -L:锁定帐号

        -U:解锁帐号

    [root@Daniel-R480 ~]# id test

    uid=10011(test) gid=10011(test) groups=10011(test)

    [root@Daniel-R480 ~]# usermod -u 2002 test

    [root@Daniel-R480 ~]# id test

    uid=2002(test) gid=10011(test) groups=10011(test)

    chsh:

     修改用户的默认shell

    [root@Daniel-R480 ~]# finger test

    Login: test                             Name:

    Directory: /home/test                   Shell: /bin/bash

    Never logged in.

    No mail.

    No Plan.

    [root@Daniel-R480 ~]# id test

    uid=10011(test) gid=10011(test) groups=10011(test)

    [root@Daniel-R480 ~]# usermod -u 2002 test

    [root@Daniel-R480 ~]# id test

    uid=2002(test) gid=10011(test) groups=10011(test)

    [root@Daniel-R480 ~]# finger test

    Login: test                             Name:

    Directory: /home/test                   Shell: /bin/bash

    Never logged in.

    No mail.

    No Plan.

    [root@Daniel-R480 ~]# chsh test

    Changing shell for test.

    New shell [/bin/bash]: /bin/tcsh

    chsh: “/bin/tcsh” does not exist

    [root@Daniel-R480 ~]# cat /etc/shells

    /bin/sh

    /bin/bash

    /usr/bin/sh

    /usr/bin/bash

    [root@Daniel-R480 ~]# cat /etc/shells chsh test

    /bin/sh

    /bin/bash

    /usr/bin/sh

    /usr/bin/bash

    cat: chsh: No such file or directory

    cat: test: No such file or directory

    [root@Daniel-R480 ~]# chsh test

    Changing shell for test.

    New shell [/bin/bash]: /bin/sh

    Shell changed.

    [root@Daniel-R480 ~]# finger test

    Login: test                             Name:

    Directory: /home/test                   Shell: /bin/sh

    Never logged in.

    No mail.

    No Plan.

    [root@Daniel-R480 ~]#

    chfn:

           修改注释信息

    chage:

          改变密码过期信息

        -d: 最近一次的修改时间

        -E: 过期时间

        -I:非活动时间

        -m: 最短使用期限

        -M: 最长使用期限

        -W: 警告时间

9.5 密码管理:

    passwd [USERNAME]

        –stdin 用标准输入读取密码,可用来在脚本中创建用户账号及密码

        -l 锁定用户密码

        -u 解锁用户密码

        -d: 删除用户密码

        -n:设定密码最短使用期限

        -x:设定密码最长使用期限

    [root@Daniel-R480 ~]# echo “redhat”

    redhat

    [root@Daniel-R480 ~]# echo “redhat” | passwd –stdin test

    Changing password for user test.

    passwd: all authentication tokens updated successfully.

    [root@Daniel-R480 ~]# tail /etc/shadow

    nfsnobody:!!:17924::::::

    sshd:!!:17924::::::

    postfix:!!:17924::::::

    chrony:!!:17924::::::

    daniel:$6$e6rwtpqp$awkNfQl9GtXO7vJNrRrlyJfIE7OcxzOuJZBAR3OueOSBIPtK9ZyuJoBH1s9Ln666KZD8zr9pSnsRg90Wiupj7.:18782:0:99999:7:::

    test:$6$c5y8U2BO$7AFRriEzYrC2qiH7DeQrl9sMpswUCpFzJ4n/2wcwUifUhlwSKsZzWlv0l75WDEvSTKAeGi3kxzmkumgk0p1ZX0:18782:0:99999:7:::

    test1:!!:18782:0:99999:7:::

    test2:!!:18782:0:99999:7:::

    test3:!!:18782:0:99999:7:::

    test4:!!:18782:0:99999:7:::

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# passwd -d test

    Removing password for user test.

    passwd: Success

    [root@Daniel-R480 ~]# tail /etc/shadow

    nfsnobody:!!:17924::::::

    sshd:!!:17924::::::

    postfix:!!:17924::::::

    chrony:!!:17924::::::

    daniel:$6$e6rwtpqp$awkNfQl9GtXO7vJNrRrlyJfIE7OcxzOuJZBAR3OueOSBIPtK9ZyuJoBH1s9Ln666KZD8zr9pSnsRg90Wiupj7.:18782:0:99999:7:::

    test::18782:0:99999:7:::

    test1:!!:18782:0:99999:7:::

    test2:!!:18782:0:99999:7:::

    test3:!!:18782:0:99999:7:::

    test4:!!:18782:0:99999:7:::

    [root@Daniel-R480 ~]#

    pwck:(passwd check)检查用户帐号完整性

    [root@Daniel-R480 ~]# pwck

    user ‘ftp’: directory ‘/var/ftp’ does not exist

    user ‘test4’: directory ‘/home/test4’ does not exist

    pwck: no changes

    [root@Daniel-R480 ~]#

9.6 组管理:

    1、groupadd 创建组:

        -g GID指定gid

        -r:添加为系统组

    [root@Daniel-R480 ~]# useradd -r apache

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    apache:x:997:994::/home/apache:/bin/bash

    [root@Daniel-R480 ~]# groupadd -r nginx

    [root@Daniel-R480 ~]# tail -1 /etc/group

    nginx:x:993:

    [root@Daniel-R480 ~]#

    2、groupmod 修改组信息

        -g GID 修改GID

        -n GRPNAME 修改组名

    3、groupdel 删除组

    4、gpasswd:为组设定密码

    newgrp 为用户临时指定新的组

    [root@Daniel-R480 ~]# gpasswd test

    Changing the password for group test

    New Password:

    Re-enter new password:

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# newgrp test

    [root@Daniel-R480 ~]# su – apache

    su: warning: cannot change directory to /home/apache: No such file or directory

    -bash-4.2$

    -bash-4.2$

    -bash-4.2$ newgrp test

    Password:

    bash-4.2$ ginger

练习:

    1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux;

    [root@Daniel-R480 ~]# groupadd -g 3003 distro

    [root@Daniel-R480 ~]# groupadd linux

    [root@Daniel-R480 ~]# useradd -u 2002 -g distro -G linux mandriva

    [root@Daniel-R480 ~]# id mandriva

    uid=2002(mandriva) gid=3003(distro) groups=3003(distro),3004(linux)

    [root@Daniel-R480 ~]#

    2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh;

    [root@Daniel-R480 ~]# useradd -c “Fedora Community” -s /bin/tcsh fedora

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    fedora:x:2003:2003:Fedora Community:/home/fedora:/bin/tcsh

    [root@Daniel-R480 ~]#

    3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora;

    [root@Daniel-R480 ~]# usermod -u 4004 -g linux -G distro,fedora mandriva

    [root@Daniel-R480 ~]# id mandriva

    uid=4004(mandriva) gid=3004(linux) groups=3004(linux),3003(distro),2003(fedora)

    [root@Daniel-R480 ~]#

    4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天;

    [root@Daniel-R480 ~]# passwd -n 2 -x 50 fedora

    Adjusting aging data for user fedora.

    passwd: Success

    [root@Daniel-R480 ~]# tail -1 /etc/passwd

    fedora:x:2003:2003:Fedora Community:/home/fedora:/bin/tcsh

    [root@Daniel-R480 ~]# tail -1 /etc/shadow

    fedora:!!:18810:2:50:7:::

    [root@Daniel-R480 ~]#

    5、将mandriva的默认shell改为/bin/bash; 

    [root@Daniel-R480 ~]# usermod -s /bin/sh mandriva

    [root@Daniel-R480 ~]# usermod -s /bin/bash mandriva

    [root@Daniel-R480 ~]# tail -2 /etc/passwd

    mandriva:x:4004:3004::/home/mandriva:/bin/bash

    fedora:x:2003:2003:Fedora Community:/home/fedora:/bin/tcsh

    [root@Daniel-R480 ~]#

    6、添加系统用户hbase,且不允许其登录系统;

    [root@Daniel-R480 ~]# useradd -r -s /sbin/nologin hbase

    [root@Daniel-R480 ~]# su hbase

    This account is currently not available.

    [root@Daniel-R480 ~]#

8、Linux用户及权限

8.1 进程,库,用户,组,权限

    8.1.1 进程

    进程的安全上下文(secure context):

    进程代理进程的发起者调用所需的库在内存中进行运行,能访问哪些文件取决于发起进程的用户

    8.1.2 库

    库称之为共享库

    8.1.3 用户,组和权限

    linux的一切文件和硬件都称之为是计算资源

    用户:获取资源和服务的凭证,标识符

    组:关联用户和权限的容器,为了方便的指派权限,标识符

    权限:定义了资源和服务的访问能力)

    文件:被访问的对象

    文件的属主,属组和其他用户的访问权限

8.2 权限

8.2.1 权限分类

    权限分为r, w, x

    对于文件来说:

    r:可读,可以使用类似cat等命令查看文件内容;

    w:可写,可以编辑或删除此文件;

    x: 可执行,eXacutable,可以命令提示符下当作命令提交给内核运行;

    对于目录来说:

    r: 可以对此目录执行ls以列出内部的所有文件;

    w: 可以在此目录创建文件;

    x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息;

8.2.2 rwx和数值对应关系

    rwx:

        r–:只读

        r-x:读和执行

        —:无权限

    0 000 —:无权限

    1 001 –x: 执行

    2 010 -w-: 写

    3 011 -wx: 写和执行

    4 100 r–: 只读

    5 101 r-x: 读和执行

    6 110 rw-: 读写

    7 111 rwx: 读写执行

    755:rwxr-xr-x(常用权限,读和执行)

8.3 用户和组

8.3.1 UID,GID和shadow

    用户:UID(标识用户的代码), /etc/passwd

    组:GID(标识组的代码), /etc/group

    解析:将用户之类的信息转换为系统能识别出来的ID号

    影子口令(将用户的密码放在另一个安全的位置):

    用户密码放置位置:/etc/shadow

    组密码放置位置:/etc/gshadow

8.3.2 用户和组分类

    用户类别(大体上分为两个):

           管理员:ID号永远为0

           普通用户:ID号为caca 1-65535

               系统用户:1-499(专门用来运行系统服务的用户,不需要登录系统)

               一般用户:500-60000

    用户组类别1:

           管理员组:

           普通组:

              系统组:

              一般组:

    用户组类别2:

        私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户名同名的组,称之为是私有组

        基本组:用户的默认组(此组里面只有本用户一个用户)

        附加组,额外组:默认组以外的其它组

    进程:文件查看运行进程的用户,如果用户无权限访问,则查看此用户的组,如果组也无权限访问,则此进程无法正常运行

    对象:被访问的对象

8.3.3 passwd文件

    [root@Daniel-R480 ~]# cat /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    adm:x:3:4:adm:/var/adm:/sbin/nologin

    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    sync:x:5:0:sync:/sbin:/bin/sync

    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    halt:x:7:0:halt:/sbin:/sbin/halt

    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    games:x:12:100:games:/usr/games:/sbin/nologin

    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    nobody:x:99:99:Nobody:/:/sbin/nologin

    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    dbus:x:81:81:System message bus:/:/sbin/nologin

    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

    rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    chrony:x:998:995::/var/lib/chrony:/sbin/nologin

    passwd文件显示顺序

        account: 登录名

        password: 密码

        UID:用户的ID号

        GID:基本组ID

        comment: 注释,用户的全名等信息

        HOME DIR:家目录

        SHELL:用户的默认shell,配置为不合法的shell无法登陆或者有些用户直接设置不允许登陆

8.3.4 用户的shell

    查看合法shell

    [root@Daniel-R480 ~]# cat /etc/shells

    /bin/sh

    /bin/bash

    /usr/bin/sh

    /usr/bin/bash

8.3.5 shadow

    密码放置位置/etc/shadow

    [root@Daniel-R480 ~]# cat /etc/shadow

    root:!!:17924:0:99999:7:::

    bin:*:17834:0:99999:7:::

    daemon:*:17834:0:99999:7:::

    shadow每一位代表的内容

        account: 登录名

        encrypted password: 加密的密码

        1970年1月1日到密码上次更改的天数

        密码能使用的天数,0表示不限制

        密码快要过期的天数

        宽限的只能改密码的几天

8.4 数据加密

    数据加密方法:

        (1)对称加密:加密和解密使用同一个密码

        (2)公钥加密(非对称加密):每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key),一个用来加密,一个用来解密

        (3)单向加密,散列加密(可以由明文取得密文,但不能由密文取得明文):提取数据特征码,常用于数据完整性校验

    单向加密特点

        雪崩效应(蝴蝶效应):初始条件的微小改变会引起结果的巨大改变

        [root@Daniel-R480 ~]# cp /etc/inittab ./

        [root@Daniel-R480 ~]# md5sum inittab

        66a88d6c4d693170753ea3382f8bc150  inittab

        [root@Daniel-R480 ~]# vim inittab

        -bash: vim: command not found

        [root@Daniel-R480 ~]# vi inittab

        [root@Daniel-R480 ~]# md5sum inittab

        568c018aebe36cf208fc32c465e4b120  inittab

        定长输出

            MD5:Message Digest, 128位定长输出

            SHA1:Secure Hash Algorithm, 160位定长输出

        密码前面一般会有加上的杂质(salt),防止相同用户的密码显示的密文相同

7、bash及其特性

7.1 shell,用户,进程和程序

shell: 程序和内核交流的外壳

    GUI:Gnome, KDE, Xfce

    CLI: sh, csh, ksh, bash, tcsh, zsh

只有一个程序,但可以打开多个进程

进程是程序的副本,进程是程序执行的实例,在内存当中运行

进程:在每个进程看来,当前主机上只存在内核和当前进程

7.2 bash:

7.2.1 用户分类

    分为管理员用户和普通用户,用不同的字符标识

        root:         #

        普通用户:   $

7.2.2 shell和子shell

    shell当中包含着 shell,子shell,可以同时打开多个shell,还可以交互打开

    父shell和子shell,并不知道彼此的存在

    bash–bash

    [root@Daniel-R480 ~]# su daniel

    [daniel@Daniel-R480 root]$

7.2.3 bash:特点及功能

    1、命令历史、命令补全

    2、管道、重定向

    3、命令别名

    4、命令行编辑

    5、命令行展开

    6、文件名通配

    7、变量

    8、编程

7.2.4 命令行编辑:

1、光标跳转:

    Ctrl+a:跳到命令行首

    Ctrl+e:跳到命令行尾

    (图形界面可使用Ctrl+左右键跳到行首和行尾)

    Ctrl+d:删除对应的后面的字符

    Ctrl+u: 删除光标至命令行首的内容

    Ctrl+k: 删除光标至命令行尾的内容

    Ctrl+l: 清屏

2、命令历史:

    查看命令历史:history

        -c:清空命令历史

        -d OFFSET [n]: 删除指定位置的命令

        [daniel@localhost ~]$ history -d 459

        [daniel@localhost ~]$ history -d 460 10

        -w:保存命令历史至历史文件中

        用户退出后命令会从缓存转移到家目录下的.bash_history当中

    PATH:命令搜索路径

    HISTSIZE: 命令历史缓冲区大小

    [daniel@localhost ~]$ echo $HISTSIZE

    1000

    命令历史的使用技巧:

        !n:执行命令历史中的第n条命令;

        !-n:执行命令历史中的倒数第n条命令; 

        !!: 执行上一条命令;

        !string:执行命令历史中最近一个以指定字符串开头的命令

    引用前一个命令的最后一个参数; 

        !$

        Esc+ .

        Alt+.   (本地支持,远程不支持)

    [root@Daniel-R480 ~]# cat calc.sh 

    #!/bin/bash

    #

    declare -i SUM=0

    for I in {1..100};do

        let SUM=$[$SUM+$I]

    done

    echo “The sum is : $SUM”

    [root@Daniel-R480 ~]# du !$

    du calc.sh

    0   calc.sh

    [root@Daniel-R480 ~]#

3、命令和路径补全:

    Linux 最小化安装时,是没有 tab 命令补全的,需要自己手动安装。

    # 安装

$ yum -y install bash-completion

    # 重新登录生效 

    PATH:环境变量路径正常,即可进行补全

    输入相应的开头,随后点击tab

    命令补全:搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于一个,两次tab,可以给出列表;否则将直接补全;

    路径补全:搜索我们给出的起始路径下的每个文件名,并试图补全;

4、命令别名和命令替换

    在shell中定义的别名仅在当前shell生命周期中有效;别名的有效范围仅为当前shell进程;

        alias newname=oldname

        alias CMDALIAS=’COMMAND [options] [arguments]’

    [root@Daniel-R480 ~]# alias cl=clear

    [root@Daniel-R480 ~]# cl

    撤销别名,unalias +命令别名

        ualias CMDALIAS

    [root@Daniel-R480 ~]# unalias cl

    [root@Daniel-R480 ~]# cl

    -bash: cl: command not found

    [root@Daniel-R480 ~]# 

    \CMD(转义字符)

    \+命令可以取消命令别名

    命令替换: $(COMMAND), 反引号:`COMMAND`

        把命令中某个子命令替换为其执行结果的过程

    file-2013-02-28-14-53-31.txt

    [daniel@localhost ~]$ touch file-$(date +%F-%H-%M-%S)

    [daniel@localhost ~]$ touch file-$(date +%F-%H-%M-%S)

    [daniel@localhost ~]$ ls

    a  file-2021-06-03-03-00-26  file-2021-06-03-03-00-31  heloy  m  test  test2  x

    [daniel@localhost /]$ echo “the current directory is $(pwd).”

    the current directory is /.

    [daniel@localhost /]$ cd /opt

    [daniel@localhost opt]$ !-2

    echo “the current directory is $(pwd).”

    the current directory is /opt.

    [daniel@localhost opt]$ 

    bash支持的引号:

        “: 命令替换

        “”: 弱引用,可以实现变量替换

        ”: 强引用,不完成变量替换

5、文件名通配, globbing

    *: 可匹配任意长度的任意字符

    [daniel@localhost ~]$ touch a asd adcs dfvsf fde dedas wdwa qwd

    [daniel@localhost ~]$ ls a*

    a  adcs  asd

    [daniel@localhost ~]$ ls a*d

    asd

    ?:可匹配任意单个字符

    []:匹配指定范围内的任意单个字符

        [abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]

    [:space:]:空白字符

    [:punct:]:标点符号

    [:lower:]:小写字母

    [:upper:]: 大写字母

    [:alpha:]: 大小写字母

    [:digit:]: 数字

    [:alnum:]: 数字和大小写字母

        # man 7 glob可以查看这些列表

    [^]: 匹配指定范围之外的任意单个字符

    [root@localhost daniel]# ls [[:alpha:]]*[[:alpha:]]

    a b  adcs  asd  dedas  dfvsf  fde  heloy  qwd  test  wdwa

练习:

1、创建a123, cd6, c78m, c1 my, m.z, k 67, 8yu, 789等文件;注意,以上文件是以逗号隔开的,其它符号都是文件名的组成部分;

    [root@Daniel-R480 test1]# touch {a123,cd6,c78m,”c1 my”,”m.z”,”k 67″,8yu,789}

    [root@Daniel-R480 test1]# ls

    789  8yu  a123  c1 my  c78m  cd6  k 67  m.z

2、显示所有以a或m开头的文件;

    [root@Daniel-R480 test1]# ls [am]*

    a123  m.z

    [root@Daniel-R480 test1]# 

3、显示所有文件名中包含了数字的文件;

    [root@Daniel-R480 test1]# ls *[0-9]* 

    789  8yu  a123  c1 my  c78m  cd6  k 67

    [root@Daniel-R480 test1]# ls *[[:digit:]]*

    789  8yu  a123  c1 my  c78m  cd6  k 67

    [root@Daniel-R480 test1]# 

4、显示所有以数字结尾且文件名中不包含空白的文件;

    [root@Daniel-R480 test1]# ls *[^[:space:]]*[0-9] 

    789  a123  cd6  k 67

    [root@Daniel-R480 test1]# 

5、显示文件名中包含了非字母或数字的特殊符号的文件;

    [root@Daniel-R480 test1]# ls *[^[:alnum:]]*

    c1 my  k 67  m.z

6、常用文本处理命令

6.1 知识回顾

    做一件事

    2-3年:专家

    5年以上:权威

    操作系统功能

    运行程序,设备管理,软件管理,进程管理,网络管理

    目录管理:

        ls、cd、pwd、mkdir、rmdir、tree

    文件管理:

        touch、stat、file、rm、cp、mv、nano

    日期时间:

        date、clock、hwclock、cal

6.2 文本处理

6.2.1 查看文本:

cat、tac、more、less、head、tail

1、cat

连接并显示从首部到尾部(tac显示从尾部到首部)

    -n:显示行数

    -E:显示行结束符(linux行结束符号为$,windows行结束符号为enter+$)

    [root@Daniel-R480 ~]# cat calc.sh 

    #!/bin/bash

    #

    declare -i SUM=0

    for I in {1..100};do

        let SUM=$[$SUM+$I]

    done

    echo “The sum is : $SUM”

    [root@Daniel-R480 ~]# tac calc.sh 

    echo “The sum is : $SUM”

    done

        let SUM=$[$SUM+$I]

    for I in {1..100};do

    declare -i SUM=0

    #

    #!/bin/bash

    [root@Daniel-R480 ~]# cat -n calc.sh 

         1  #!/bin/bash

         2  #

         3  declare -i SUM=0

         4  for I in {1..100};do

         5      let SUM=$[$SUM+$I]

         6  done

         7  

         8  echo “The sum is : $SUM”

    [root@Daniel-R480 ~]# cat -E calc.sh 

    #!/bin/bash$

    #$

    declare -i SUM=0$

    for I in {1..100};do$

        let SUM=$[$SUM+$I]$

    done$

    $

    echo “The sum is : $SUM”$

Ctrl+c终止当前任务,或者终止当前输入命令的动作

shift + pageup/pagedown 来上下翻页

2、分屏显示:more、less file

    more: 向后翻(空格翻一页,enter翻一行)

    less(man里面用less来打开文本): k键向前翻

3、查看文本的前几行或者后几行(head tail)

    (1)head:查看前n行 

        [daniel@localhost ~]$ head -n 2 /etc/inittab 

        # inittab is no longer used when using systemd.

    (2)tail:查看后n行

        [daniel@localhost ~]$ tail -2 /etc/inittab 

        # systemctl set-default TARGET.target

    head,tail不加任何选项默认为10行

    tail -f: 查看文件尾部,不退出,等待显示后续追加至此文件的新内容;

6.2.2 文本处理:

cut、join、sed、awk

database:数据库(存放数据的库)

mysql:管理数据库的软件

关系型数据库:

表:二维表

文本文件:用:来分隔

Tom:23:male:2013/05/06

1、cut:

    -d: 指定字段分隔符,默认是空格

    -f: 指定要显示的字段

        -f 1,3

        -f 1-3

    [daniel@localhost ~]$ cut -d : -f1 /etc/passwd

    root

    bin

    daemon

    adm

    lp

2、sort(不影响源文件的次序,只影响现实的次序)

    sort:文本排序(默认不按数值大小排序)

        -n:数值排序

        -r: 降序

        -t: 字段分隔符

        -k: 以哪个字段为关键字进行排序

        -u: 排序后相同的行只显示一次

        -f: 排序时忽略字符大小写

    [daniel@localhost ~]$ sort -t : -k3 -n /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    bin:x:1:1:bin:/bin:/sbin/nologin

    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    adm:x:3:4:adm:/var/adm:/sbin/nologin

    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    sync:x:5:0:sync:/sbin:/bin/sync

    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    halt:x:7:0:halt:/sbin:/sbin/halt

    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    games:x:12:100:games:/usr/games:/sbin/nologin

    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    tcpdump:x:72:72::/:/sbin/nologin

    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    dbus:x:81:81:System message bus:/:/sbin/nologin

    postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    nobody:x:99:99:Nobody:/:/sbin/nologin

    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    chrony:x:998:996::/var/lib/chrony:/sbin/nologin

    polkitd:x:999:997:User for polkitd:/:/sbin/nologin

    daniel:x:1000:1000:daniel:/home/daniel:/bin/bash

3、uniq: 报告重复的行,或者是略过重复的行

        -c: 显示文件中行重复的次数

        -d: 只显示重复的行中的一个

        -D:显示重复的行的所有内容

        [daniel@localhost ~]$ uniq -d test

        78

        [daniel@localhost ~]$ uniq -D test

        78

        78

        [daniel@localhost ~]$ uniq -c test

              3 

              1 1212

              1 23

              1 4234

              1 324234

              1 3242

              1 123

              1 3444

              1 5656

              1 89

              2 78

4、wc文本统计

    wc (word count)输出为行数 单词数 字节数

        -l只显示行

        -w只显示单词数

        -c只显示字节

        -L最长的一行包含的字符数

    [daniel@localhost ~]$ wc /etc/fstab 

     12  60 541 /etc/fstab

    [daniel@localhost ~]$ wc -w /etc/fstab 

    60 /etc/fstab

    [daniel@localhost ~]$ wc -l /etc/fstab 

    12 /etc/fstab

    [daniel@localhost ~]$ wc -c /etc/fstab 

    541 /etc/fstab

    [daniel@localhost ~]$ wc -L /etc/fstab 

    93 /etc/fstab

5、tr-字符处理命令

    tr —— 转换或删除字符

    tr [OPTION]… SET1 [SET2]

    [daniel@localhost ~]$ tr ‘ab’ ‘AB’

    abcd^H

    ABcd

    able

    ABle

    acount

    Acount

    [daniel@localhost ~]$ tr ‘ab’ ‘AB’ < /etc/passwd

    root:x:0:0:root:/root:/Bin/BAsh

    Bin:x:1:1:Bin:/Bin:/sBin/nologin

    dAemon:x:2:2:dAemon:/sBin:/sBin/nologin

    Adm:x:3:4:Adm:/vAr/Adm:/sBin/nologin

    lp:x:4:7:lp:/vAr/spool/lpd:/sBin/nologin

    sync:x:5:0:sync:/sBin:/Bin/sync

    shutdown:x:6:0:shutdown:/sBin:/sBin/shutdown

    hAlt:x:7:0:hAlt:/sBin:/sBin/hAlt

    mAil:x:8:12:mAil:/vAr/spool/mAil:/sBin/nologin

    operAtor:x:11:0:operAtor:/root:/sBin/nologin

    gAmes:x:12:100:gAmes:/usr/gAmes:/sBin/nologin

    ftp:x:14:50:FTP User:/vAr/ftp:/sBin/nologin

    noBody:x:99:99:NoBody:/:/sBin/nologin

    systemd-network:x:192:192:systemd Network MAnAgement:/:/sBin/nologin

    dBus:x:81:81:System messAge Bus:/:/sBin/nologin

    polkitd:x:999:997:User for polkitd:/:/sBin/nologin

    postfix:x:89:89::/vAr/spool/postfix:/sBin/nologin

    sshd:x:74:74:Privilege-sepArAted SSH:/vAr/empty/sshd:/sBin/nologin

    chrony:x:998:996::/vAr/liB/chrony:/sBin/nologin

    dAniel:x:1000:1000:dAniel:/home/dAniel:/Bin/BAsh

    tcpdump:x:72:72::/:/sBin/nologin

    [daniel@localhost ~]$ tr ‘a-z’ ‘A-Z’ < /etc/passwd

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

    DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN

    ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN

    LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN

    SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC

    SHUTDOWN:X:6:0:SHUTDOWN:/SBIN:/SBIN/SHUTDOWN

    HALT:X:7:0:HALT:/SBIN:/SBIN/HALT

    MAIL:X:8:12:MAIL:/VAR/SPOOL/MAIL:/SBIN/NOLOGIN

    OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN

    GAMES:X:12:100:GAMES:/USR/GAMES:/SBIN/NOLOGIN

    FTP:X:14:50:FTP USER:/VAR/FTP:/SBIN/NOLOGIN

    NOBODY:X:99:99:NOBODY:/:/SBIN/NOLOGIN

    SYSTEMD-NETWORK:X:192:192:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN

    DBUS:X:81:81:SYSTEM MESSAGE BUS:/:/SBIN/NOLOGIN

    POLKITD:X:999:997:USER FOR POLKITD:/:/SBIN/NOLOGIN

    POSTFIX:X:89:89::/VAR/SPOOL/POSTFIX:/SBIN/NOLOGIN

    SSHD:X:74:74:PRIVILEGE-SEPARATED SSH:/VAR/EMPTY/SSHD:/SBIN/NOLOGIN

    CHRONY:X:998:996::/VAR/LIB/CHRONY:/SBIN/NOLOGIN

    DANIEL:X:1000:1000:DANIEL:/HOME/DANIEL:/BIN/BASH

    TCPDUMP:X:72:72::/:/SBIN/NOLOGIN

    tr -d: 删除出现在字符集中的所有字符

    [daniel@localhost ~]$ tr -d ‘ab’

    abcd

    cd

    adsde

    dsde

5、linux文件系统和常用文件管理命令

5.1 linux文件系统

5.1.1 file命令及其用法

          file + 文件或目录:查看文件类型

       可执行二进制文件格式: 

          Windows: PE

          Linux: ELF

5.1.2 Linux文件系统

          1、Linux文件系统的一些概念

                    rootfs: 根文件系统(每个文件系统都必须是根文件系统内的路径) 

                    FHS(文件系统层级标准):Linux

          2、Linux文件系统目录及各目录作用

           (1)/boot: 

                   系统启动相关的文件,如内核、initrd,以及grub(bootloader)

             [daniel@localhost share]$ ls /boot

                     config-3.10.0-693.el7.x86_64

                     efi

                      grub(引导加载器)

                      grub2

                     initramfs-0-rescue-35642350c74f4b3287a0e5a8634f72ea.img

                      initramfs-3.10.0-693.el7.x86_64.img(系统启动的系统文件)

                     initramfs-3.10.0-693.el7.x86_64kdump.img

                     initrd-plymouth.img

                      symvers-3.10.0-693.el7.x86_64.gz

                     System.map-3.10.0-693.el7.x86_64

                     vmlinuz-0-rescue-35642350c74f4b3287a0e5a8634f72ea

                     vmlinuz-3.10.0-693.el7.x86_64(内核)

           (2)/dev: 设备文件

        设备文件:

            块设备:随机访问,可以随机访问任意位置的数据,数据块

            字符设备:线性访问,按字符为单位(鼠标和显示器)

            特殊设备没有大小,只有设备号

            设备号:主设备号(major)和次设备号(minor)

    (3)/etc:配置文件

        大多数程序的配置文件都放在此目录或者此目录的子目录

    (4)/home:用户的家目录

        每一个用户的家目录通常默认为/home/USERNAME

    (5)/root:管理员的家目录;

    (6)/lib:库文件

        静态库,  .a,便于程序单个运行使用

        动态库, .dll, .so (shared object),可以共享使用节省空间

        /lib/modules:内核模块文件

    (7)/media:挂载点目录

        挂载移动设备

    (8)/mnt:挂载点目录

        额外的临时文件系统

    (9)/opt:可选目录

        早期第三方程序的安装目录,现在通常放于/usr/local中

    (10)/proc:伪文件系统

        内核映射文件

    (11)/sys:伪文件系统

        跟硬件设备相关的属性映射文件

    (12)/tmp:临时文件

         /var/tmp,另外一个临时目录

    (13)/var:可变化的文件

        /bin: 可执行文件, 用户命令

        /sbin:管理命令

    (14)/usr:shared, read-only:全局共享的只读文件

        /usr/bin:系统启动之后运行正常系统功能的需要的文件

        /usr/sbin

        /usr/lib

        /usr/local:第三方软件的安装路径

            /usr/local/bin

            /usr/local/sbin

            /usr/local/lib

5.1.3 命名规则

    命名规则:

        1、长度不能超过255个字符;

        2、不能使用/当文件名

        3、严格区分大小写

    绝对路径:相对于根节点的路径

    相对路径:相对于当前位置的路径

5.1.4 操作系统功能

    操作系统:

        运行程序

        设备管理

        软件管理

        进程管理

        网络管理

5.1.5 文件管理

    1、文件创建和删除

        (1)touch

            # touch 主要作用修改文件时间戳,也可用来创建文件(linux同一个目录下不能创建名称相同的文件夹和文件)

            -a 只改变访问时间

            -m 只改变修改时间

            -t 指定修改的时间

            -c 若文件不存在也不创建新文件

            stat file显示文件的状态信息

而文件夹确实是类似文本文件的方式存储的,文件夹可以看做文件inode:文件名组成的文本文件 (文件的属性信息存在inode的元信息中,可以用stat file查看)。只要文件夹内未发生文件的新增、删除、软链或文件夹内文件的inode (也称为索引节点)未改变,文件夹 (代表文件夹的文本文件)的时间戳就不会发生变化。

From <https://cloud.tencent.com/developer/article/1520817>

        [daniel@localhost ~]$ touch -m -t 201212121212 x

        [daniel@localhost ~]$ stat x

          File: ‘x’

          Size: 15          Blocks: 0          IO Block: 4096   directory

        Device: fd02h/64770d    Inode: 33554496    Links: 3

        Access: (0775/drwxrwxr-x)  Uid: ( 1000/  daniel)   Gid: ( 1000/  daniel)

        Context: unconfined_u:object_r:user_home_t:s0

        Access: 2021-06-01 12:55:16.734391633 -0400

        Modify: 2012-12-12 12:12:00.000000000 -0500

        Change: 2021-06-01 12:57:12.073157790 -0400

         Birth: –

                创建文件也可以使用文件编辑器来创建

                     word为字处理器,不是文本编辑器,处理的不仅仅是文本

        (2)ASCII码

             ASCII: 美国国家标准信息交换代码

            128不同的字符要存储在计算机上:

             计算机只能保存二进制:

            2^6=0,63  64个数字

            2^7=0,127 128个数字

            000 0000 – 111 1111

            ASCII:通过不同的位数变化来表示某个字符

            2^16: 65536

           字符标准:GB18030, GBK, GB2312(国标),Unicode(全球统一标准)

            0000 1001 0000 1110:上, 卫(它为ASCII码还是字符取决于使用的字符转换器)

                           linux文本剪辑器:nano

        (3)rm

        删除文件

            -i:删除前询问

            -f:强行删除,不接受提示

            -r:递归删除目录下所有文件

        rm -rf /

                    (ROOT用户可以通过此命令清理所有文件)

        任何操作之前确认一下,再操作

       (4)cp

        复制和移动文件cp

        cp: copy只有最后一个是目标,前面的都是源,默认只复制文件,不复制目录

        cp SRC DEST

            -r:递归复制目录和目录下的文件(不能覆盖文件)

            -p:保存用户原有的属主,属组和时间戳

            -P:保持文件自有的链接属性

            -a:归档复制,常用于备份

        cp file1 file2 file3

        可复制一个文件到一个文件

        也可复制多个文件到一个目录

            cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp/

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息

参数:

     -a 或 –archive     此参数的效果和同时指定”-dpR”参数相同

     -b 或 –backup      删除、覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或目录。假如没有加上这个参数,在复制过程中若遇到符号链接,则会直接复制源文件或目录

     -f 或 –force       强行复制文件或目录, 不论目的文件或目录是否已经存在

     -i 或 –interactive 覆盖文件之前先询问用户

     -l 或 –link        对源文件建立硬链接,而非复制文件

     -p 或 –preserve    保留源文件或目录的属性,包括所有者、所属组、权限与时间

     -P 或 –parents     保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经丰在

     -r                  递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

     -R 或 –recursive   递归处理,将指定目录下的文件及子目录一并处理

     -s 或 –symbolic-link  对源文件建立符号链接,而非复制文件

     -S <备份字尾字符串> 或 –suffix=<备份字尾字符串> 用”-b”参数备份目的文件后,备份文件的字尾会被加上一个备份字符串。默认的备份字尾符串是符号”~”

     -u 或 –update      使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相互对应的目的文件并不存在,才复制文件

     -v 或 –verbose     显示执行过程

     -V <备份方式> 或 –version-control=<备份方式>  指定当备份文件时,备份文件名的命名方式,有以下3种:

                         1.numbered或t, 将使用备份编号,会在字尾加上~1~字符串,其数字编号依次递增

                         2.simple或never 将使用简单备份,默认的备份字尾字符串是~, 也可通过-S来指定

                         3.existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份

     -x 或 –one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不复制,亦不处理位于其他分区的文件

     –help              显示在线帮助

     –sparse=<使用时机>  设置保存希疏文件的时机

     –version           显示版本

示例:

    .复制文件,只有源文件较目的文件的修改时间新时,才复制文件

     cp -u -v file1 file2

    .将文件file1复制成文件file2

     cp file1 file2

    .采用交互方式将文件file1复制成文件file2

     cp -i file1 file2

    .将文件file1复制成file2,因为目的文件已经存在,所以指定使用强制复制的模式

     cp -f file1 file2

    .将目录dir1复制成目录dir2

     cp -R file1 file2

    .同时将文件file1、file2、file3与目录dir1复制到dir2

cp -R file1 file2 file3 dir1 dir2

    .复制时保留文件属性

     cp -p a.txt tmp/

    .复制时保留文件的目录结构

     cp   –parents   /var/tmp/a.txt  ./temp/

    .复制时产生备份文件

     cp -b a.txt tmp/

    .复制时产生备份文件,尾标 ~1~格式

     cp -b -V t   a.txt /tmp    

    .指定备份文件尾标    

     cp -b -S _bak a.txt /tmp

        (5)mv: move

        移动文件

        mv SRC DEST

            mv -t DEST SRC将多个源文件复制到同一个目标

            mv -f DEST SRC 强制覆盖

        mv abc mn:将abc移动到当前目录,并且更改名称为mn

        (6)install

            install SRC DEST:可用来复制文件

                 -d 指定DIRECOTRY … :可用于创建目录

                 install -t DIRECTORY SRC…:把多个文件复制到同一个目录

5.1.6 目录管理

1、查看目录

                   ls

                   cd

                   pwd

2、mkdir

    mkdir:创建空目录,只有路径中的最后一个点才是要创建的目录

        -p:循环创建目录

        -v: verbose详细信息,显示创建过程

    例:mkdir /root/x/y/z

    创建多个目录

        /mnt/test/x/m,y

        (1)mkdir -pv /mnt/test/x/m /mnt/test/y

        (2)mkdir -pv /mnt/test/{x/m,y}

3、展开

    (1)波浪线展开

             ~USERNAME (波浪线展开):cd自动转换到用户家目录

       (2)命令行展开(花括号展开):

        /mnt/test/

        创建如下几个目录a_b, a_c, d_b, d_c

        类似于(a+d)(b+c)=ab+ac+db+dc

        所以可以写为{a,d}_{b,c}

        [root@Daniel-R480 ~]# mkdir -pv /mnt/test/{a,d}_{b,c}

        mkdir: created directory ‘/mnt/test/a_b’

        mkdir: created directory ‘/mnt/test/a_c’

        mkdir: created directory ‘/mnt/test/d_b’

        mkdir: created directory ‘/mnt/test/d_c’

        [root@Daniel-R480 ~]# ls /mnt/test/

        a_b  a_c  d_b  d_c

4、tree

    # tree:查看目录树

    [daniel@localhost ~]$ tree /mnt/test

    test

    ├── a_c

    ├── a_d

    ├── b_c

    └── b_d

5、rmdir

    删除目录:rmdir (remove directory)

        默认只能删除空目录

        -p:循环删除空文件夹

    [root@Daniel-R480 ~]# rmdir /mnt/test/

    rmdir: failed to remove ‘/mnt/test/’: Directory not empty

练习:

    1、创建目录

        (1)在/mnt下创建boot和sysroot;

        [root@Daniel-R480 ~]# mkdir /mnt/{boot,sysroot}

        [root@Daniel-R480 ~]# ls /mnt

        boot  c  d  etst  sysroot  test

        [root@Daniel-R480 ~]# 

        (2)在/mnt/boot下创建grub;

        [root@Daniel-R480 ~]# mkdir /mnt/boot/grub

        [root@Daniel-R480 ~]# ls /mnt/boot/

        grub

        (3)在/mnt/sysroot下创建proc, sys, bin, sbin, lib, usr, var, etc, dev, home, root, tmp

            a)在/mnt/sysroot/usr下创建bin, sbin, lib

            b)在/mnt/sysroot/lib下创建modules

            c)在/mnt/sysroot/var下创建run, log, lock

            d)在/mnt/sysroot/etc下创建init.d

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/{proc,sys,bin,sbin,lib,usr,var,etc,dev,home,root,tmp}

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/usr/{bin,sbin,lib}

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/lib/modules

            [root@Daniel-R480 ~]# mkdir /mnt/sysroot/var/{run,log,lock}

            [root@Daniel-R480 ~]# touch /mnt/sysroot/etc/init.d

            [root@Daniel-R480 ~]# tree /mnt/sysroot/

            [root@Daniel-R480 ~]# tree /mnt/sysroot/

            /mnt/sysroot/

            ├── bin

            ├── dev

            ├── etc

            │   └── init.d

            ├── home

            ├── lib

            │   └── modules

            ├── proc

            ├── root

            ├── sbin

            ├── sys

            ├── tmp

            ├── usr

            │   ├── bin

            │   ├── lib

            │   └── sbin

            └── var

                ├── lock

                ├── log

                └── run

 作业1:

    1、创建目录/backup

        # mkdir -v /backup

    2、复制目录/etc至/backup目录中,并重命名为“etc-当前日期”,如etc-2013-02-26;要求保留文件原来的属性,保持链接文件;

        cp

            -r 

            -p

            -d

        # cp -a /etc /backup/etc-2013-02-28

命令替换

    3、复制文件/etc/inittab为/tmp/inittab.new,并删除inittab.new文件的后两行;

        # cp /etc/inittab  /tmp/inittab.new

        # nano /tmp/inittab.new

作业2:

    1、思考:ls命令是否可以显示某目录的整体大小,即包括其内部的所有文件的整体大小?

    [root@Daniel-R480 tmp]# ls -lht

    total 516K

    -rw-r–r– 1 root root   18 Jun 18 18:01 b

    -rw-r–r– 1 root root   12 Jun 18 17:36 a

    -rwxr-xr-x 1 root root    0 Jun 10 09:47 test

    -rw——- 1 root root 248K Jun  8 18:01 yum_save_tx.2021-06-08.18-01.yIzI_S.yumtx

    -rw——- 1 root root 256K Jun  8 17:08 yum_save_tx.2021-06-08.17-08.qKUX5n.yumtx

    -rwx—— 1 root root  836 Jan 29  2019 ks-script-QveTmi

    -rwx—— 1 root root 4.7K Jan 29  2019 ks-script-5qnQJp

    -rw——- 1 root root    0 Jan 29  2019 yum.log

    2、通过帮助手册,学习使用du命令;

        # du 估计文件空间使用情况

            -s (summarize,显示总计情况)

            -h(显示大小)

        [root@Daniel-R480 tmp]# du

        0   ./.font-unix

        0   ./.ICE-unix

        0   ./.Test-unix

        0   ./.X11-unix

        0   ./.XIM-unix

        516 .

        [root@Daniel-R480 tmp]# du -h

        0   ./.font-unix

        0   ./.ICE-unix

        0   ./.Test-unix

        0   ./.X11-unix

        0   ./.XIM-unix

        516K    .

        [root@Daniel-R480 tmp]# du -s

        516 .

        [root@Daniel-R480 tmp]# du -sh

        516K    .

        [root@Daniel-R480 tmp]# 

    3、通过帮助,学习read命令;

        变量:内存空间,有名称

        变量赋值:

        变量替换

作业3:

    描述GPL, BSD, Apache三个开源协定的大体联系及区别。

作业4:

    1、如何获取Linux当前最新的内核版本号?

        www.kernel.org

    2、列出你所了解的Linux发行版,并说明其跟Linux内核的关系。

        Linux, GNU: GNU/Linux, 以源代码发布

        在源代码编译之后形成发行版:Fedora, RedHat(CentOS), SUSE, Debian(Ubuntu, Mint), Gentoo, LFS(Linux From Scratch)

        编译:将源代码编译成可以在对应的硬件平台上安装运行的版本

        C程序

             Tom,在AMD上编译

            Jerry在intel上编译

        RedHat: 通用格式

            奔腾:

        性能配置最好的状态,在本机上编译,进行安装

4、date,cal,hwclock,man命令详解

4.1 时间管理

4.1.1 date

       时间管理(系统时间)

            Linux: rtc(硬件时间,实时时钟)

         ntp:网络时间协议,网络时间服务器

    硬件时钟:系统硬件自动运行的时间

    系统时钟:操作系统开机以后会自动计算出来接下来经过的时间

练习:

    使用date单独获取系统当前的年份、月份、日、小时、分钟、秒

    [root@Daniel-R480 ~]# date

    Mon Jun 28 14:40:18 CST 2021

    [root@Daniel-R480 ~]# date +%y

    21

    [root@Daniel-R480 ~]# date +%m

    06

    [root@Daniel-R480 ~]# date +%d

    28

    [root@Daniel-R480 ~]# date +%s

    1624862439

    [root@Daniel-R480 ~]#

4.1.2 hwclock

显示硬件时钟

    hwclock

        -w: 设置硬件时钟为系统时钟

        -s: 设置系统时钟为硬件时钟

    [root@Daniel-SHSH ~]# hwclock

    Mon 28 Jun 2021 02:42:43 PM CST  -0.885496 seconds

    [root@Daniel-SHSH ~]# hwclock -w

    [root@Daniel-SHSH ~]# hwclock -s

3、cal

    日历

    cal: calendar

    后面可加年份,月份

    cal 6 2021

    [root@Daniel-SHSH ~]# cal

          June 2021     

    Su Mo Tu We Th Fr Sa

           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

    [root@Daniel-SHSH ~]# cal 3 2021

         March 2021     

    Su Mo Tu We Th Fr Sa

        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

    [root@Daniel-SHSH ~]# 

4.2 命令帮助

4.2.1 内部命令:

    help COMMAND

    [root@Daniel-SHSH ~]# help cd

    cd: cd [-L|[-P [-e]]] [dir]

        Change the shell working directory.

        Change the current directory to DIR.  The default DIR is the value of the

        HOME shell variable

4.2.2 外部命令:

    COMMAND –help

    [root@Daniel-SHSH ~]# ls –help

    Usage: ls [OPTION]… [FILE]…

    List information about the FILEs (the current directory by default).

    Sort entries alphabetically if none of -cftuvSUX nor –sort is specified.

4.2.3 命令手册(几乎所有命令都有):manual

          1、man COMMAND

                    查看用户手册

          2、whatis COMMAND

               查看命令出现的章节

          3、MAN分章节:

            (1)用户命令(/bin, /usr/bin, /usr/local/bin)

            (2)系统调用

            (3)库用户

            (4)特殊文件(设备文件)

            (5)文件格式(配置文件的语法)

            (6)游戏

            (7)杂项(Miscellaneous)

            (8)管理命令(/sbin, /usr/sbin, /usr/local/sbin,需要管理员权限才能使用)

          4、注释符含义

                  <>:必选

                    []:可选

                   …:可以出现多次

                     |:多选一

                     {}:分组

            5、MAN的输出内容

            NAME:命令名称及功能简要说明

            SYNOPSIS:用法说明,包括可用的选项

            DESCRIPTION:命令功能的详尽说明,可能包括每一个选项的意义

            OPTIONS:说明每一个选项的意义

            FILES:此命令相关的配置文件

            BUGS:

            EXAMPLES:使用示例

            SEE ALSO:另外参照

      6、一些基本操作

             (1) 翻屏

                    向后翻一屏:SPACE

                    向前翻一屏:b

                    向后翻一行:ENTER

                    向前翻一行:k

             (2)查找

                               /KEYWORD: 向后

                                n: 下一个

                                N:前一个 

                               ?KEYWORD:向前

                               q: 退出

             (3)在线文档

                               info COMMAND

             (4)文档

                       /usr/share/doc

                    首选文档: 一般软件或者项目都有着官方在线说明,

                                      比如apache, hadoop

练习:

               1、echo是内部命令还是外部命令?

                 [root@Daniel-R480 ~]# help echo

                 echo: echo [-neE] [arg …]

                             Write arguments to the standard output.

               2、其作用?

                  Write arguments to the standard output.

               3、如何显示“The year is 2013. Today is 26.”为两行?

                        echo -e “This year is 2013.\nToday is 26.”

\转义符

转义,逃逸

练习:

              1、printf是内部命令还是外部命令?                  

               [root@Daniel-R480 ~]# help printf

                     printf: printf [-v var] format [arguments]

                            Formats and prints ARGUMENTS under control of the FORMAT.

              2、其作用?

                  Formats and prints ARGUMENTS under control of the FORMAT.

              3、如何显示“The year is 2013. Today is 26.”为两行?

                       printf “The year is 2013.\nToday is 26.\n”

3、Linux基础理论,ls,cd,type命令

3.1 Linux的基本原则:

1、由目的单一的小程序组成;

组合小程序完成复杂任务;

2、一切皆文件;

把几乎所有的资源都整合为文件形式

3、尽量避免跟用户交互;

目标:实现脚本编程,以自动完成某些功能

4、配置文件保存为纯文本格式;

目标:一款文本编辑器即可实现系统配置

3.2 Shell及命令格式

    GUI接口:图形化的人机交互接口

    CLI接口:

    命令提示符,prompt, bash(shell)

        [root@localhost ~]# : root

        [daniel@localhost ~]$: 普通用户

    命令:输入命令,按enter之后命令送入内核,随后内核判断能否执行

         命令格式:

        命令  选项  参数

        选项:修改命令的执行方式

            短选项: –

                短选项多个选项可以组合:-a -b = -ab

            长选项: —

        参数:命令的作用对象(多个参数由空格隔开)

         使用凭证:验证用户身份和权限

         严格区分大小写,root为默认管理员用户,一般不可以修改

         虚拟终端(terminal):Ctrl+Alt+F1-F6,切换虚拟终端,模拟有多个用户,多个显示器

         右键open terminal:可打开模拟终端

            Linux GUI:

         Gnome: C

         KDE: C++

         XFace:简洁的轻量级的桌面,多用于嵌入式平台

           CLI:

        sh

        bash:最广泛,功能最强大

        csh

        zsh

        ksh

        tcsh

3.3 用户和密码管理

3.31 用户切换

               root, student, vistor

              su: switch user(切换用户)

              # su [-l] 用户名

              su -l 完全切换

              su 用户名:半切换

              # passwd

3.32 密码复杂性规则

          六位密码:

          纯数字:10^6

          数字+字母:36^6

          数字+大小写字母:62^6

          所有字符:100^6

             Linuxedu@126.com

                    1、使用4种类别字符中至少3种;

                    2、足够长,大于7位;

                    3、使用随机字符串;

                    4、定期更换;

                    5、循环周期足够大;

3.4 Shell和库

3.41 shell

RHCE+RHCA+shell编程+MySQL+Web集群+NoSQL+Hadoop+Hbase+Openstack

GNU: GNU is Not Unix.

GPL: General Public License,通用公共许可证,版权

    Copyright, Copyleft

    开源协定

LGPL:lesser

GPLv2

GPLv3

Shell:(用户交互界面)

            GUI: Graphic User Interface(图形用户界面)

             Windows

             X-Window

           Gnome

           KDE

           Xface

            CLI: Command Line Interface

             sh

             bash

             csh

             ksh

             zsh

             tcsh

           Google:

                    linux filetype:pdf

                    linux site:ibm.com

            google hack

3.42 库

            IDE:程序员开发时用到的集成开发环境

         库文件

                  Windows:DLL:动态链接库(库文件)(Dynamic Link Library)

                  Linux:so:库文件(shared object)

3.5 用户和常用命令

3.51 用户和认证机制

              login:

          用户名:用户ID(用户标识符)

          认证机制:Authentication鉴别用户就是他所声称的那个人

          授权:Authorization

          审计:Audition (日志)

              prompt,命令提示符:

           命令:

                   magic number: 魔数

                   shebang

3.52 命令格式

             #!/bin/bash

             # command  options…  arguments…

         选项(修改命令的执行参数,有些选项是可以带参数的):

             短选项

             长选项

          参数:指定命令的作用对象

3.53 ls

   list: ls

          列出,列表

          目录:也是文件,路径映射文件

          路径:从指定起始点到目的地所经过位置

          文件系统:file system(实现层次化文件管理的机制)

          列出指定路径下的文件

          我们处在的目录:working directory, current directory

             绝对路径:相对于根节点的路径

          相对路径:相对于当前位置的路径

              pwd: Printing Working directory,显示当前目录

ls

    -l:长格式,输出的内容依次如下

    [root@Daniel-R480 ~]# ls -l

    total 36

    -rw-r–r– 1 root  root    1 Jun 21 14:38 a

    -rw-r–r– 1 root  root   87 Jun 21 14:30 aa

    lrwxrwxrwx 1 root  root    1 Jun 17 10:42 abc -> a

        1、文件类型(1位):

            -:普通文件 (f)

            d: 目录文件

            b: 块设备文件 (block)

            c: 字符设备文件 (character)

            l: 符号链接文件(symbolic link file)

            p: 命令管道文件(pipe)

            s: 套接字文件(socket)

        2、文件权限:9位,每3位一组,每一组:rwx(读,写,执行), r–

        3、文件硬链接的次数

        4、文件的属主(owner)

        5、文件的属组(group)

        6、文件大小(size),单位是字节

        7、时间戳(timestamp):最近一次被修改的时间

            (1)访问:access

            (2)修改:modify,文件内容发生了改变

            (3)改变:change,metadata,元数据(文件的属性数据 )

    -h(human):做单位转换

    -a: 显示以.开头的隐藏文件

        . 表示当前目录

        .. 表示父目录

    -A

    -d: 显示目录自身属性

    -i: index node, inode(文件的索引节点号)

    -r: 逆序显示

    -R: 递归(recursive)显示

3.54 cd

cd: change directory,切换目录

    cd不加任何参数,直接回到用户的家目录,主目录, home directory(用户有所有的权限)

    [root@Daniel-R480 opt]# cd

    [root@Daniel-R480 ~]#

    cd ~USERNAME: 进入指定用户的家目录

    [root@Daniel-R480 ~]# cd ~daniel

    [root@Daniel-R480 daniel]#

    cd -:在当前目录和前一次所在的目录之间来回切换

    [root@Daniel-R480 daniel]# cd –

    /root

    [root@Daniel-R480 ~]# cd –

    /home/daniel

    [root@Daniel-R480 daniel]# cd –

    /root

    [root@Daniel-R480 ~]#

3.55 type

           type: 显示指定命令属于哪种类型

    [root@Daniel-R480 ~]# type cd

    cd is a shell builtin

    [root@Daniel-R480 ~]# type ls

    ls is aliased to `ls –color=auto’

    [root@Daniel-R480 ~]# type pwd

    pwd is a shell builtin

    [root@Daniel-R480 ~]# type bash

    bash is /usr/bin/bash

    [root@Daniel-R480 ~]#

         命令类型:

           内置命令(shell内置),内部,内建

           外部命令:在文件系统的某个路径下有一个与命令名称相应的可执行文件

3.56 环境变量和缓存

环境变量:命名的内存空间

    变量赋值(在这个内存空间里面放置数据)

        NAME=Jerry

    PATH: 使用冒号分隔的路径,能运行的命令必须在path的路径中,不然必须要添加完整路径

    hash为O(1)类型:无论表多长,瞬间能找到对应的数据

        hash:缓存为王,速度慢了可以通过加缓存来解决

2、Linux发展史

2.1 操作系统的发展及Linux的出现

2.11  Linux优势及目前常用的Linux

         Linux 内核非常庞大,超过 600 万行的代码。所以我们介绍 Linux 内核,也不可能每一行代码去分析,但是我会提炼其中的重点出来。我们不管学习什么,最关键的是学会其中的思想。

       虽然 Linux 内核非常庞大,但是横向对比计算机的发展史, Linux 的历史非常的简短,计算机出现的时候,还没有什么花里胡哨的包装,都是光着身子跑,用技术的语言说就是它只能执行一个任务,执行一个进程,也可以叫“裸跑”,或者称之为是批处理执行任务。学习计算机的同学应该很快明白什么是裸机程序,裸机程序只可以让一个进程使用硬件资源,一次只能完成一个任务,这无形上是对硬件资源的浪费。一开始硬件性能弱的时候这样也没什么问题,但是随着硬件不断地迭代发展,批处理对于硬件的浪费的问题就越来越凸显出来。

      可以拿我们的手机来比喻,裸机的话,我们玩王者荣耀的时候,有人打电话进来的话,王者荣耀是要被终止的,后来就有了操作系统,操作系统可以保证多任务执行,同样的 CPU 芯片,有了操作系统,我可以开微信,QQ ,还同时做其他很多事情。

       下面是关于几个比较有特色的linux嵌入式操作系统的简单介绍

1、 VxWorks

          VxWorks 是美国 WindRiver 公司的产品,是市场占有率比较高的嵌入式操作系统。

          VxWorks 实时操作系统由 400 多个相对独立、短小精悍的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统,具有优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,符合 POSIX (可移植操作系统接口)规范的内存管理,多处理器控制程序,并且具有简明易懂的用户接口,在核心方面甚至町以微缩到 8 KB。

       这个操作系统因为稳定性太好了,也被应用到了航空,卫星,军事等各个领域,实用性非常强,所以很多培训机构也针对这个操作系统开了培训课程。

2、 μC/OS-II

          μC/OS-II是在μC-OS的基础上发展起来的,是美国嵌入式系统专家 Jean J.Labrosse 用 C 语言编写的一个结构小巧、支持抢占式的多任务实时内核。

        μC/OS-II 能管理 64 个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

3、μClinux

         μClinux 是一种优秀的嵌入式 Linux 版本,其全称为 micro-control Linux,从字面意思看是指微控制 Linux。

       同标准的 Linux 相比,μClinux 的内核非常小,但是它仍然继承了 Linux 操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的 API,以及 TCP/IP 网络协议等。因为没有 MMU 内存管理单元,所以其多任务的实现需要一定技巧。

4、eCos

          eCos(embedded Configurable operating system),即嵌入式可配置操作系统。它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。

        最大特点是配置灵活,采用模块化设计,核心部分由小同的组件构成,包括内核、C 语言库和底层运行包等。每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用 eCos 提供的配置工具可以很方便地配置,并通过不同的配置使得 eCos 能够满足不同的嵌入式应用要求。

2.12 UNIX 的诞生

生日:UNIX 在 1969 年出生。

他的父亲和母亲:是 Dennis Ritchie 和 Ken Thompson 两个人擦出了灵感的火花创造出来的。

出生户籍地址:贝尔实验室

贝尔实验室图片

贝尔实验室的logo

出生具体流程:

               VAX –> vms(专用系统,只在自己的硬件上使用)

                           ken开发的简单的系统Unics        –> Unix

                            B语言(引入静态变量)–>C语言

                    贝尔实验室的toms和rich最后用C语言重写了整个Unix,性能比使用汇编慢了很多,但是适用性更广

         1965 年,贝尔实验室要做一个项目,这个项目叫PDP-7计算机计划,发起人是通用电气和麻省理工学院,要用汇编语言编写一个替换批处理的系统。

       他们给这个操作系统起了一个漂亮的名字叫做「MULTICS 操作系统」(”Multiplexed Information and Computing Service”的缩写)。这个操作系统的目标是实现多个人同时使用,按照我们现在的人来说就是多用户系统,多任务,多层次等等。

        但是一直到了1969 年,还没有做出来,发起人觉得这个项目进度太慢了,本来想早点制造出来我们好用来玩电脑游戏的,结果你们这几个科学家整了这么久还是没整出来,那只好停掉了这个项目,停掉了投资方就不再提供后备的资源了,留下的东西就自己瞎整吧,投资方也不管了。

       计划被停下来了,但是Ken Thompson当时还在调试一个程序,这个程序名字叫做 “星级旅游”( Space Travel),这个程序一开始运行在一个叫做 GE-635 的机器上面,但是因为这个机器的硬件设备比较落后,运行速度非常慢,这让Ken Thompson感觉非常不爽,然后他发现之前做「PDP-7计算机计划」项目的时候还剩了一台PDP-7计算机,这个计算机就是图片下面的那个计算机,然后他们就把 GE-635 程序移植到 PDP-7 计算机上面。

PDP-7计算机(当时应该没有人想到计算机可以做到这么小)

       到了1970年,PDP-7 可以运行 GE-635程序了,但是却只能支持两个用户,当时 Brian Kernighan 就开玩笑的称他们的系统是 “UNiplexed Information and Computing Service”,这个缩写就是 UNICS,再后来,大家就取谐音,称为 UNIX。所以1970 年可以称为 UNIX元年。

 Dennis Ritchie 和 Ken Thompson

2.13 BSD操作系统

       kein toms 1976年去加州大学伯克利分校任教,伯克利软件套件(英语:Berkeley Software Distribution,缩写为 BSD ),也被称为伯克利UNIX(Berkeley UNIX),是一个操作系统的名称。衍生于UNIX(类UNIX)。19世纪70年代由伯克利加州大学的学生比尔·乔伊(Bill Joy)研发出来,也被用来代表其衍生出的各种套件。

       BSD 常被当作工作站级别的 UNIX 系统,这得归功于 BSD 用户许可证非常地宽松,许多 1980 年代成立的计算机公司,不少都从 BSD 中获益。比较著名的例子如 DEC 的 Ultrix,以及 Sun 公司的 SunOS等等。1990 年代,BSD 很大程度上被 System V 4.x 版以及 OSF/1 系统所取代,但其开源版本被采用,促进了因特网的开发。BSD 比 Linux 早出现,稳定性和安全性都在 Linux 之上,甚至 Windows 和 OS X 都有来自 BSD 的代码,但是现在一提到开源自由软件,人们首先想到的是Linux,而不是资格更老的BSD。

         UNIX创始人之一的 Ken Thompson 曾如此评价 Linux:”Linux不过是反微软思潮下的产物。“这个家伙觉得 Linux 不可能有多大的成就,非常自信的觉得 BSD 在任何时候都可以击败 Linux,甚至觉得Linux 是一个低端和下流的操作系统内核。

       但是事实证明,Linux 赢得了这场战争,有实力,也有些运气。 贝尔实验室自有的的操作系统称之为System V,后来贝尔实验室被收购,就开始销售Unix,4万美元一套,贝尔和BSD进行竞争,打官司,Unix发展陷入停止。而在Linux发展的时候,BSD 当时正被官司缠上,没有多余的心思应战 Linux,而BSD腹背受敌的原因很明显是因为他们的商业化,而Linux正是因为开源而更受全世界开发者的青睐。

       一个事情的成功,90% 是由他的领导者决定的,就好像一个球队能走多远,队长和教练可以决定它的深度,Linux 也一样,Linus Torvalds 是位杰出的领袖人物,他成功的让一群性格迥异的、绝非泛泛之辈的黑客共同合作开发,而没有如其他开源项目一般分崩离弃。还有一点,Linux 的硬件支持比 BSD 好,这在各种终端设备上来说简直就是一种惊喜,随着PC不断被边缘化,移动端的产品急需找到一款适合他们的操作系统,Linux 是最好不过的人选了。GNU 的许可证与 BSD 不兼容,因此 Linux 的出现让两者完美结合,所以现在Linux 全名叫 GNU/Linux。

       BSD后续发展

                  FreeBSD:世界上第一个能运行在PC机上的Unix(Apple核心)

                  OpenBSD:安全

                  NetBSD

2.14 Microsoft和APPLE

        81左右Unix开始销售,IBM,康柏公司开始销售PC兼容机(3万美元一套),使用intel CPU,丑陋性能低,Unix     开发者不愿意适配

        Microsoft:卖Unix(起名叫Xenix),

      有一位教授开发了CP/M(3万美元一套)–>DOS(Desk Operation System)(比尔盖茨5万美元买断,改名为DOS,卖给IBM,开始卖license)

         jobs:创建Apple,开发强大的PC机系统,使用强大的硬件,Apple I,

         Xerox: 复印机

             PARK实验室,研究出来世界上第一个鼠标和图形化操作系统(施乐领导不喜欢,卖给了乔布斯,后来又被比尔盖茨偷走,研发出了一个新的Windows系统)

         Windows NT Server(基于DEC的vms开发的新的Windows,稳定性好了一点)

2.15 GNU计划的产生

理查·斯托曼

       因为 UNIX 操作系统的商业化,原来的 UNXI 系统已经不能再被随意的使用,很多人都希望能有一款免费好用的操作系统,因为并不是每个人都很有钱,也不是每个人都有能力自己去写操作系统,此时,理查·斯托曼在麻省理工学院人工智能实验室发起 GNU 计划,希望发展出一套完整的开放源代码操作系统来取代 UNIX,计划中的操作系统,名为 GNU(GNU is Not Unix)。

         1983年9月27日,理查·斯托曼在 net.UNIX-wizards 和 net.usoft 新闻组中公布这项计划。在此项计划中,开发出了很多我们现在熟悉的常用的工具,包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及 GNU 核心工具组(coreutils)。另外也是 GNU 除错器(GDB)、GNU 二进制实用程序(binutils)的 GNU Cash shell中 和 GNOME 桌面环境,(但是软件还是基于Unix内核的)。

      当然,GNU计划的目的还是开发出一款自由传播的操作系统,这个操作系统的名字叫 Hurd。

      但是由于对操作系统的要求过高,以至于 Hurd 一直处于测试阶段,本意是一个好事情,但是能力有限啊,开发的东西老是出bug,再好的创意那也是徒劳了。

       不过 Linus 大神通过 GNU 发布了自己的 Linux 系统后,就火起来了,真的就一发不可收拾,GNU软件开始全面迁移到linux上,    后来GNU/Linux正式出现,不过现在大家一般叫它Linux。

开源协议

2.16 Linux和MINIX的出现

MINIX启动界面

       在 UNIX 产生后,版权在 AT&T 手里,在 Version 7 UNIX 发布之后,发布新的授权条款,将UNIX 源码私有化,在大学不得再使用 UNIX 源码。

       荷兰阿姆斯特丹自由大学计算机科学系的塔能鲍姆教授(Andrew Stuart “Andy” Tanenbaum)为了教学,自己写了一个类 UNIX 的小系统,命名为 MINIX(意为mini-UNIX)。

       大家可能都不知道什么是“宏内核”和“微内核”,但是这个家伙和 Linus 的辩论轰动一时,不管怎么说,Linux 应该是现在的胜利者,最直接的原因是开源,让更多的开发者可以使用 Linux 内核移植到自己的设备上,包括 ARM 设备。

林纳斯 托瓦兹(Linus Torvalds)

         1991年,林纳斯·托瓦兹在赫尔辛基大学上学时,对操作系统很好奇。由于当时 386BSD 还没有出来。可是他不喜欢他的 386 电脑上的 MS-DOS 操作系统,所以就安装了 Minix,可他对 Minix 只允许在教育上使用很不满(在当时 Minix 不允许被用作任何商业使用),于是他便开始写他自己的操作系统。

         Linux 的第一个版本在 1991 年 9 月被大学 FTP server 管理员 Ari Lemmke 发布在 Internet上。最初 Torvalds 称这个内核的名称为 「Freax」,意思是自由「free」和奇异「freak」的结合字,并且附上「X」这个常用的字母,以配合所谓的类 UNIX 的系统。但是 FTP 服务器管理员嫌原来的命名「Freax」的名称不好听,把内核的称呼改成Linux。当时仅有 10000 行代码,仍必须运行于Minix操作系统之上,而且必须使用硬盘开机,随后在10月份第二个版本(0.02版)发布,与此同时这位芬兰赫尔辛基的大学生在 comp.os.minix 上发布了这样一则公告

         Hello everybody out there using minix- I’m doing a (free) operation system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones.

          1994 年 3 月,Linux1.0 版正式发布。为了让 Linux 可以在商业上使用,林纳斯·托瓦兹决定更改他原来的协议(这个协议会限制商业使用),以 GNU GPL 协议来代替。之后许多开发者致力融合 GNU 元素到 Linux 中,做出一个有完整功能的、自由的操作系统。

80386 的芯片

80386的电脑

       如果单凭林纳斯一个人的力量,Linux 不可能发展到这个程度。他当时做了一个非常正确的决定,就是「开源」,让世界上更多的优秀程序员加入到他的事业当中。为了让更多的人同步开发,林纳斯还写了 GIT ,这个让很多协作开发者为之兴奋的工具。

2.17 Linux的标志物

          Linux 的标志和吉祥物是一只名字叫做 Tux 的企鹅,标志的由来是因为 Linus 在澳洲时曾被一只动物园里的企鹅咬了一口,便选择企鹅作为 Linux的标志。更容易被接受的说法是:企鹅代表南极,而南极又是全世界所共有的一块陆地。这也就代表 Linux 是所有人的 Linux。

       曾经有一个笑话说林纳斯被企鹅咬了之后,因为咬过的伤口会发炎,发炎的时候伤口会有点疼。晚上写代码想打瞌睡,但是就是因为这个炎症的疼痛感刺激着自己。当然了,这个只是个传说,传说是否是真的,哪天大神心情好了可能会揭晓答案。

2.18 Linux的现状及其优势

       今天在 Linus Torvalds 带领下,众多开发者共同参与开发和维护 Linux 内核。

       理查德·斯托曼领导的自由软件基金会,继续提供大量支持 Linux 内核的 GNU 组件。

       一些个人和企业开发的第三方的非 GNU 组件也在提供对 Linux 内核的支持,这些第三方组件包括大量的作品,有内核模块和用户应用程序和库等内容。

         Linux 社区或企业都会推出一些重要的 Linux发行版,包括 Linux内核、GNU组件、非GNU组件,以及其他形式的的软件包管理系统软件。

         Linux 内核现在覆盖的领域非常广,手机、平板、路由器等等,就大家非常喜欢的苹果操作系统,底层内核也是有 Linux的影子,Linux 的普及毋庸置疑,学习 Linux 应该作为每个技术人员的标配。学习完 Linux 内核你会对整个计算机体系有一个更深刻的认知,作为一个开发者,不管你从事的是驱动开发,应用开发,还是后台开发,你都需要理解计算机操作系统和内核的运行机制,才可能更好的编写你的代码,出现更少的错误。作为开发人员,不应该只局限在自己的小领域,因为你设计的模块,看起来非常小,但是你不了解进程的调用机制,不知道进程会阻塞,就绪,执行几个状态,你怎么可能编写好一个低容错率的代码呢?

 2.19 Linux后续发展

        源代码: C –> 编译成二进制 (交叉编译)

          ABI:Application Binary Interface(应用二进制接口,每个CPU支持的不一定一样)

       Release:将linux内核编译打包形成一个能在通用计算机平台上运行的系统,这些团体被称之为是发行商(release):

         比较著名的发行商:

RedHat:1993年美国,不卖版权费,卖软件维护服务

rhel:redhat enterprise linux每18个月发行一个新版本

SLS(slackware):1991

Debian:1992年德国,目前唯一一个不受商业组织支持的系统,最先进,最难用,由爱好者维护

SUSE(基于SLS发展) –> Novell (Netware), OpenSUSE           

Ubuntu: Mint(基于Ubuntu二次发行),基于Debian二次发行,主要基于PC机使用

CentOS: Community ENTerprise OS(社区企业操作系统),社区版的redhat

Fedora: 更改红帽个人版,引入新功能,更改bug,半年一更新,更新的新特性会引入redhat企业版

Mandriva:桌面版红帽

软件管理:

Debian, dpt(软件管理器)

RedHat, rpm(模仿dpt创建了rpm)                        

Archlinux

Gentoo

LFS:Linux from scratch

Androd:linux kernel + busybox+java虚拟机

Linux内核版本: 0.1, 1.0, 2.0, 2.2, 2.4, 2.6, 3.0, 3.7,…,5.12.8

RHEL发行版的版本: 3.0, 4.0, 5.0, 6.0,7.0,8.0

程序包管理器:

rpm:

RHEL,Fedora,S.u.S.E,CentOS

dpt:

Debian,Ubuntu

系统下载:

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)

Index of / (sohu.com)

欢迎访问网易开源镜像站 (163.com)

1、计算机体系结构

1.1 计算机体系结构:

1.11 CPU=运算器+控制器

运算器:进行指令的运算 

控制器:控制运算和指令的放置

1.12 存储器,内存,编址:放置指令和文件

1.13输出设备

1.14输入设备

1.15各部件特点及一些术语

CPU频率一般比内存高很多,可以通过缓存来提速

可编程控制器与CPU相连,控制器再与其他的设备互联 

南桥:早期用来连接IO设备的芯片

北桥:连接南桥,CPU和其他的控制设备

系统加速:可直接将硬盘等设备连接在北桥上进行提速

POST:BIOS加电自检

1.2 软件系统运行

1.21 中断:interrupt

按键或者动鼠标时CPU中断当前的任务来读取按键或者是鼠标的信息

1.22 自举

1.23 程序:指令+数据

1.24 编译器:

将人容易识别的汇编语言转换为机器语言的设备

1.25汇编语言和高级语言

(1)汇编语言

微码(汇编语言)-编译器

系统中某些与硬件相关的特有代码,驱动程序开发

(2)高级语言c,c++(快,但是复杂)

高级语言-汇编语言-机器语言来实现工作

系统及应用、驱动程序

(3)高级语言java,python,php(简单,但是慢)

应用程序

1.26 API(Application Programing Interface)和ABI(Application Binary Interface)

API(应用软件接口)为高级语言-汇编语言的中间层

ABI(应用二进制接口)

1.27 RAM和ROM

RAM:

ROM:

1.28 USERSPACE和SYSTEMSPACE

USERSPACE:用户空间

SYSTEMSPACE:系统空间

1.3 硬件架构:

1.31 CPU架构

(1) ARM

(2)x86

(3)x64(AMD)

(4)安腾(intel)

(5)alpha(HP)

(6)UltraSparc(sun)

(7)Power(IBM)

(8)M68000, M68K(摩托罗拉)

(9)PowerPC(apple,ibm,摩托罗拉)

1.32 OS: 

(1)Windows

(2)Linux

(3)Unix

HP-UX(HP)

Solaris(SUN)

AIX(IBM)

SCO UNIX

Unixware

(4)OS/2

1.33 内核,程序和进程

(1)批处理

(2)多任务 

(3)程序和进程

程序放在硬盘里面就一直在,进程在内存中运行一段时间就消失

(4)kernel(内核)

kernel:系统内核,程序和硬件之间的实现系统调用的系统

内核功能:

进程管理

内存管理

文件系统

网络功能

硬件驱动

安全机制

(5)库(library,API)

不可以直接执行,但是可以被调用执行(call),将底层系统调用综合起来的更高级的接口

(6)shell

人机交互接口,分为GUI和CLI

systemcall(Syscall):系统调用

(7)POS:Portable Operating System

POSIX:可移植操作系统,定义了不同的系统使用同一个API(编程接口)

但ABI不一定相同:

运行程序格式:

Windows:EXE,dll(dynamic link library)

Linux:ELF,so(shared object)

程序:算法+数据结构

程序:指令(只读)+数据(读写)