From 67fa030df34affb9130fda78c5bde013e167e265 Mon Sep 17 00:00:00 2001 From: BingmingWong Date: Sun, 17 Feb 2019 15:26:17 +0800 Subject: [PATCH 001/334] add some files --- source/c04/c04_13.md | 339 +++++++++++++++++++++++++++++++++++++++++++ source/c07/c07_01.md | 72 ++++++++- source/c07/c07_02.md | 17 ++- source/c08/c08_01.md | 52 ++++++- 4 files changed, 472 insertions(+), 8 deletions(-) create mode 100644 source/c04/c04_13.md diff --git a/source/c04/c04_13.md b/source/c04/c04_13.md new file mode 100644 index 0000000..1119bce --- /dev/null +++ b/source/c04/c04_13.md @@ -0,0 +1,339 @@ +# 4.13 命令行解析工具:argparse + +Python 做为一个脚本语言,可以很方便地写各种工具。当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现)。 + +如果要以命令行执行,那你需要解析一个命令行参数解析的模块来帮你做这个苦力活。 + +Python 本身就提供了三个命令行参数解析模块,我这里罗列一下它们的大致情况供你了解。 + +- `getopt`,只能简单的处理命令行参数 +- `optparse`,功能强大,易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。(Python2.7以后弃用,不会继续发展) +- `argparse`,使其更加容易的编写用户友好的命令行接口。它所需的程序进程了参数定义,argparse将更好的解析sys.argv。同时argparse模块还能自动生成帮助及用户输入错误参数时的提示信息。 + +很多初学者可能会使用`getopt`,上手简单功能也简单。比如说`optget`无法解析一个参数多个值的情况,如 `--file file1 file2 file3`,而 `optparse` 实际上我没有用过,但是考虑到它在Python2.7后已经不再维护,我们通常也不会使用它。 + +接下来只剩下 `argparse` 这一神器,它几乎能满足我对命令解析器的所有需求。它支持解析一参数多值,可以自动生成help命令和帮助文档,支持子解析器,支持限制参数取值范围等等功能。 + +## 0. HelloWorld + +不管学习什么东西,首先第一步都应该是掌握它的大体框架。 + +而 使用 argparse 前,框架很简单,你只需要记住这三行。 + +```python +# mytest.py +import argparse +parser = argparse.ArgumentParser(description="used for test") + +args = parser.parse_args() +``` + +现在可以尝试一下 + +```python +[root@localhost ~]# python mytest.py -h +usage: mytest.py [-h] + +used for test + +optional arguments: + -h, --help show this help message and exit +[root@localhost ~]# +[root@localhost ~]# +[root@localhost ~]# python mytest.py +[root@localhost ~]# +``` + +已经可以使用了。 + +## 1. 入门配置 + +这里先讲一下,比较常用的参数配置。 + +- 调试:debug +- 版本号:version + +```python +import argparse +parser = argparse.ArgumentParser() + +parser.add_argument('--version', '-v', action='version', + version='%(prog)s version : v 0.01', help='show the version') + +parser.add_argument('--debug', '-d', action='store_true', + help='show the version', + default=False) + +args = parser.parse_args() +print("=== end ===") +``` + +上面debug处的配置,需要讲一下的是 `action='store_true'` 和 `default = False` 的作用和区别 + +- `store_true`:一旦指定了 -d 或者 --debug ,其值就为 True,store_false则相反 +- `default=False`:未指定 -d 或者 --debug,其值就默认为False + +当我们执行 `python mytest.py -v`,就会打印 version 里的内容。 + +```python +[root@localhost ~]# python mytest.py -v +mytest.py version : v 0.01 +[root@localhost ~]# +``` + +一旦执行时,指定了参数 -v ,执行到 parser.parse_args() 就会退出程序,不会打印最后的 `=== end ===` + +## 2. 参数种类 + +参数可分为 必选参数(positional arguments) 和 可选参数(optional arguments)。 + +在argsparse 里如何实现呢? + +**必选参数** + +用单词做参数,默认就为必选参数 + +```python +# mytest.py +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("name") + +args = parser.parse_args() + +print(args.name) +``` + +不指定name参数运行一下:`python mytest.py` + +```python +[root@localhost ~]# python mytest.py +usage: mytest.py [-h] name +mytest.py: error: too few arguments +[root@localhost ~]# +``` + +如预期一样,报错了,说缺少参数。那我们指定一下:`python mytest.py name wangbm` + +```python +[root@localhost ~]# python mytest.py wangbm +wangbm +[root@localhost ~]# +``` + +**可选参数** + +有两种方式: + +1. 单下划线 - 来指定的短参数,如`-h`; +2. 双下划线 `--` 来指定的长参数,如`--help` + +```python +# mytest.py +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("-v", "--verbosity", help="increase output verbosity") + +args = parser.parse_args() + +if args.verbosity: + print("verbosity turned on") +else: + print("verbosity turned off") +``` + +试着运行一下 `python mytest.py`,不会报错。 + +```python +[root@localhost ~]# python mytest.py +verbosity turned off +[root@localhost ~]# +``` + +## 3. 参数类型 + +有的参数,是字符串,有的参数,是数值。 + +为了对命令行中的参数进行有效的约束,我们可以事先对参数的类型进行声明。argparse 会对参数进行校验,不通过时,会直接抛出错误。 + +```python +# mytest.py +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("name") +parser.add_argument("age", type=int) + +args = parser.parse_args() + +print(args.name) +print(args.age) +``` + +测试一下唄。 + +```python +[root@localhost ~]# python mytest.py wangbm eighteen +usage: mytest.py [-h] name age +mytest.py: error: argument age: invalid int value: 'eighteen' +[root@localhost ~]# +[root@localhost ~]# python mytest.py wangbm 18 +wangbm +18 +[root@localhost ~]# +``` + +你看,写 `eighteen` 就不行,提示类型不合法,只有写 `18` 才行。 + +## 4. 互斥参数 + +有些参数,是互斥的,有你无我。比如,性别。 + +在 argparse 中如何实现? + +```python +import argparse + +parser = argparse.ArgumentParser() +group = parser.add_mutually_exclusive_group() +group.add_argument("-m", "--male", action="store_true") +group.add_argument("-f", "--female", action="store_true") +args = parser.parse_args() +``` + +如果同时指定了这两个参数,就会报错。 + +```python +[root@localhost ~]# python mytest.py -f +[root@localhost ~]# python mytest.py -m +[root@localhost ~]# python mytest.py -m -f +usage: mytest.py [-h] [-m | -f] +mytest.py: error: argument -f/--female: not allowed with argument -m/--male +[root@localhost ~]# +``` + +## 5. 可选值 + +如果是性别,可以像上面那样放在两个参数里然后用互斥组来约束,也可以放在一个参数里,在argparse里限制再在外层做判断。 + +```python +# mytest.py +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("-g", "--gender", default='male', + choices=['male', 'female']) + +args = parser.parse_args() +print(args.gender) +``` + +试着执行一下,发现性别只能是男或女,不能为人妖。 + +```python +[root@localhost ~]# python mytest.py --gender male +male +[root@localhost ~]# python mytest.py --gender female +female +[root@localhost ~]# +[root@localhost ~]# +[root@localhost ~]# python mytest.py --gender other +usage: mytest.py [-h] [-g {male,female}] +mytest.py: error: argument -g/--gender: invalid choice: 'other' (choose from 'male', 'female') +[root@localhost ~]# +``` + +## 6. 指定文件 + +经常会有那种要在脚本中指定配置文件或者其他文件的需求。可以使用下面的配置 + +```python +import argparse +parser = argparse.ArgumentParser() + +parser.add_argument('--file', '-f', action='append', + dest='files', + help=('additional yaml configuration files to use'), + type=argparse.FileType('rb')) + +args = parser.parse_args() +``` + +`dest=files`,是说将命令行中,`--file` 的参数值赋值给变量files,你可以用args.files访问。 + +`action=append`,由于我们会有指定多个文件的需求,那就指定多次`--file` ,argparse会将其放在一个list里。 + +`type=argparse.FileType('rb')`,既然是指定文件,那么参数应该为路径,并指定打开模式为rb,如果如果要取得文件内容,可以用 `args.files[0].read()` + +## 7. 子解析器 + +如果你对命令行,有过足够多的接触,就会知道有些情况下会有子解析器。 + +这里我以自己工作中,碰到的例子来举个例子。 + +``` +cloud-init --debug single -name mymodule +``` + +其中 single 后面是一个子解析器。 + +```python +# cloud-init.py + +def main_single(name, args): + print("name: ", name) + print("args: ", args) + print("I am main_single") + +# 添加一个子解析器 +subparsers = parser.add_subparsers() + +parser_single = subparsers.add_parser('single',help='run a single module') + +# 对single 子解析器添加 action 函数。 +parser_single.set_defaults(action=('single', main_single)) + +# require=True,是说如果命令行指定了single解析器,就必须带上 --name 的参数。 +parser_single.add_argument("--name", '-n', action="store", + help="module name to run", + required=True) + +args = parser.parse_args() + +(name, functor) = args.action +if name in ["single"]: + functor(name, args) +``` + +执行命令`cloud-init single -name mymodule`,输出如下 + +```python +name: single +args: Namespace(action=('single', ), debug=False, file=None, name='mymodule') +I am main_single +``` + +## 8. cloudinit 笔记 + +### 8.1 顶层参数 + +``` +'--version', '-v' +'--file', '-f' +'--debug', '-d' +'--force' +``` + +### 8.2 子解析器 + +``` +init,可跟可选参数 "--local", '-l',处理函数:main_init +modules, "--mode", '-m',只可选'init', 'config', 'final'处理函数:main_modules +query, "--name", '-n',处理函数:main_query +single,"--name", '-n',--frequency,module_args,处理函数:main_single +``` + + + diff --git a/source/c07/c07_01.md b/source/c07/c07_01.md index 5229245..5e209e1 100644 --- a/source/c07/c07_01.md +++ b/source/c07/c07_01.md @@ -799,6 +799,12 @@ $ fdisk /dev/vdb 然后再按d,w mount -o remount,rw / ``` +格化化分区 + +``` +mkfs.ext4 /dev/sdb1 +``` + ### 2.3 进程管理 @@ -1116,7 +1122,7 @@ $ at -c $ atrm ``` #### 例行性任务(crontab) -参考以下文字 +参考以下文章 1. [每天一个linux命令(50):crontab命令](http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html) 2. [鸟哥的私房菜](http://linux.vbird.org/linux_basic/0430cron.php) @@ -1141,6 +1147,20 @@ $ crontab -r [-u user] ``` +除了以上,例行性任务还有可能在 /etc/cron.daily/ ,/etc/cron.hourly/, /etc/cron.monthly/, /etc/cron.weekly/ 下面。 + +如果messages 不能正常回滚,可以考虑加个参数 `-f` + +``` +/usr/sbin/logrotate -f /etc/logrotate.conf +``` + +如果还不行,检查一下 `/etc/logrotate.d/syslog` + +``` +chmod 644 /etc/logrotate.d/syslog +``` + ## 三、用户/权限管理 ### 3.1 用户管理 @@ -1300,7 +1320,16 @@ s: 保密性地删除文件或目录,即硬盘空间被全部收回。 u: 与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion. ``` +切换用户执行命令 + +``` +$ su - zabbix -s /bin/bash + +# 退出的话,使用exit +``` + ## 四、网络管理 + ### 4.1 iptables 命令格式 ``` @@ -1355,7 +1384,16 @@ rules 规则,可以说是匹配规则。 2. [netfilter/iptables全攻略](http://www.linuxso.com/linuxpeixun/10332.html) 3. [iptables详解](http://blog.chinaunix.net/uid-26495963-id-3279216.html) -### 4.2 开放端口 +### 4.2 端口相关 + +查询端口占用情况 + +``` +lsof -i:10051 +``` + +开放端口 + ``` # 在filter表里添加规则 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8500 -j ACCEPT @@ -1370,7 +1408,8 @@ $ nc -lp 8500 & $ netstat -tunl|grep 8500 ``` -### 4.3 端口转发 +端口转发 + ``` # 按开放端口配置好后才可转发。 # 假设我们现在要将36.250.x.x的8500端口转发到192.168.2.55的80端口上 @@ -1385,6 +1424,33 @@ $ netstat -tunl|grep 8500 # 就可以看到我们的内容了。 ``` +### 4.3 路由相关 + +路由转发:snat + +``` + +# 1、开启转发 +# vim /etc/sysctl.conf,sysctl -p 该命令可以查看是否修改成功 +net.ipv4.ip_forwaed=1 + +# 或者可以执行下面这两条命令其中一条 +echo 1 > /proc/sys/net/ipv4/ip_forward +sysctl -w net.ipv4.ip_forward=1 + +# 2、在网关节点的 /etc/sysconfig/iptables 加上规则。 +*nat +:PREROUTING ACCEPT [4730:370403] +:INPUT ACCEPT [501:29436] +:OUTPUT ACCEPT [3563:214910] +:POSTROUTING ACCEPT [3564:214973] +-A POSTROUTING -s 172.20.20.0/24 -o eth0 -j SNAT --to-source 58.xx.xx.xx +COMMIT + +# 重启iptables +systemctl restart iptables +``` + ### 4.4 ip 命令 ``` diff --git a/source/c07/c07_02.md b/source/c07/c07_02.md index c20a567..08af42b 100644 --- a/source/c07/c07_02.md +++ b/source/c07/c07_02.md @@ -245,10 +245,23 @@ zabbix ALL=NOPASSWD: ALL - ## 七、监控数据获取 -### 7.1 自定义脚本获取 +### 7.1 系统自带监控项 + +#### 7.1.1 agent失联 + +第一个条件:5分钟没有数据 + +第二个条件:上一次有数据 + +``` +{$host:agent.ping.nodata(5m)}=1 and {$host:agent.ping.prev()}=1 +``` + + + +### 7.2 自定义脚本获取 自定义监控项,需要有一些脚本支持获取数据。 diff --git a/source/c08/c08_01.md b/source/c08/c08_01.md index 441b369..d9feb7e 100644 --- a/source/c08/c08_01.md +++ b/source/c08/c08_01.md @@ -37,8 +37,9 @@ $ nova boot \ --security-groups default \ --nic net-id=,v4-fixed-ip= \ --image \ ---min-count 2 \ --config-drive True \ +--min-count 2 \ +--user-data [user-data-file-path] \ [--num-instances 2] [--snapshot ] [--block-device-mapping vda=a9c7816b-0046-4aa9-9c82-cb881a969bdd:snapshot:300:delete-on-terminate --availability-zone nova:LX-OS-node13 --poll] @@ -151,7 +152,7 @@ glance镜像存放:/var/lib/image https://docs.openstack.org/project-install-guide/baremetal/draft/configure-glance-images.html # 上传镜像 (具体看哪glance help image-create) -$ glance image-create --name ws_openstack2.qcow2 --visibility public --disk-format qcow2 --container-format bare --file /home/openstack/ws_openstack.qcow2 +$ glance image-create --name centos6.5-old --visibility public --disk-format qcow2 --container-format bare --property ws:predownload=True --file /home/ ``` ### 1.4 keystone @@ -278,6 +279,9 @@ $ lvremove /dev/ssd-volume/* -y # 查看可用块设备列表 $ lsblk + +# 将pv从vg移除 +$ vgreduce --removemissing --force hdd-volumes ``` ### 1.3 QEMU命令 @@ -290,7 +294,7 @@ $ qemu-img create -f qcow2 openstack-name.qcow2 100G ``` -## 三、数据库 +## 三、集群相关 --- @@ -304,8 +308,50 @@ $ mysql -e 'show status like "wsrep_%"' -ppasswd|grep wsrep_cluster_size|awk '{ $ mariadbClusterCheck ``` +### 3.2 RabbitMQ + +先在一台节点启动 `service rabbitmq-server restart` + +启动后,会生成 `/var/lib/rabbitmq/.erlang.cookie` 文件,为了实现节点间的通信加密,需要将这个文件拷贝至其他两个节点。拷贝时,注意生意授予权限。 + +``` +chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie +``` + +然后启动一下后面两台的服务。 + +``` +service rabbitmq-server restart +``` + + + +以上都准备好了,现在好开始构建集群了。 + +分别在后面两个节点执行如下操作。 + +``` +rabbitmqctl stop_app + +rabbitmqctl join_cluster --ram rabbit@ws_controller01(ws_controller01为节点1的hostname) + +rabbitmqctl start_app +``` + +执行完成后,可以查看一下集群状态。 + +``` +rabbitmqctl cluster_status +``` +有了集群后,如果要(openstack)使用,还要创建一下用户 + +``` +rabbitmqctl add_user openstack openstack12#$ +rabbitmqctl set_permissions -p / openstack ".*" ".*" ".*" +rabbitmqctl set_user_tags openstack administrator +``` --- ![关注公众号,获取最新干货!](https://ws1.sinaimg.cn/large/8f640247gy1fyi60fxos4j20u00a8tdz.jpg) \ No newline at end of file From 5ecc71d2ca38b56aea70fde8ac9a1ce2c0acf2bd Mon Sep 17 00:00:00 2001 From: BingmingWong Date: Sun, 17 Feb 2019 20:26:30 +0800 Subject: [PATCH 002/334] add c04_13 --- source/c04/c04_13.rst | 364 ++++++++++++++++++++++++++++++++++++++++++ source/c05/c05_03.rst | 2 +- source/c07/c07_01.rst | 79 ++++++++- source/c07/c07_02.rst | 16 +- source/c08/c08_01.rst | 56 ++++++- source/c08/c08_04.md | 45 ++++++ source/c08/c08_04.rst | 56 +++++++ 7 files changed, 608 insertions(+), 10 deletions(-) create mode 100644 source/c04/c04_13.rst create mode 100644 source/c08/c08_04.md create mode 100644 source/c08/c08_04.rst diff --git a/source/c04/c04_13.rst b/source/c04/c04_13.rst new file mode 100644 index 0000000..f662595 --- /dev/null +++ b/source/c04/c04_13.rst @@ -0,0 +1,364 @@ +4.13 命令行解析工具:argparse +============================= + +Python +做为一个脚本语言,可以很方便地写各种工具。当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现)。 + +如果要以命令行执行,那你需要解析一个命令行参数解析的模块来帮你做这个苦力活。 + +Python +本身就提供了三个命令行参数解析模块,我这里罗列一下它们的大致情况供你了解。 + +- ``getopt``\ ,只能简单的处理命令行参数 +- ``optparse``\ ,功能强大,易于使用,可以方便地生成标准的、符合Unix/Posix + 规范的命令行说明。(Python2.7以后弃用,不会继续发展) +- ``argparse``\ ,使其更加容易的编写用户友好的命令行接口。它所需的程序进程了参数定义,argparse将更好的解析sys.argv。同时argparse模块还能自动生成帮助及用户输入错误参数时的提示信息。 + +很多初学者可能会使用\ ``getopt``\ ,上手简单功能也简单。比如说\ ``optget``\ 无法解析一个参数多个值的情况,如 +``--file file1 file2 file3``\ ,而 ``optparse`` +实际上我没有用过,但是考虑到它在Python2.7后已经不再维护,我们通常也不会使用它。 + +接下来只剩下 ``argparse`` +这一神器,它几乎能满足我对命令解析器的所有需求。它支持解析一参数多值,可以自动生成help命令和帮助文档,支持子解析器,支持限制参数取值范围等等功能。 + +0. HelloWorld +------------- + +不管学习什么东西,首先第一步都应该是掌握它的大体框架。 + +而 使用 argparse 前,框架很简单,你只需要记住这三行。 + +.. code:: python + + # mytest.py + import argparse + parser = argparse.ArgumentParser(description="used for test") + + args = parser.parse_args() + +现在可以尝试一下 + +.. code:: python + + [root@localhost ~]# python mytest.py -h + usage: mytest.py [-h] + + used for test + + optional arguments: + -h, --help show this help message and exit + [root@localhost ~]# + [root@localhost ~]# + [root@localhost ~]# python mytest.py + [root@localhost ~]# + +已经可以使用了。 + +1. 入门配置 +----------- + +这里先讲一下,比较常用的参数配置。 + +- 调试:debug +- 版本号:version + +.. code:: python + + import argparse + parser = argparse.ArgumentParser() + + parser.add_argument('--version', '-v', action='version', + version='%(prog)s version : v 0.01', help='show the version') + + parser.add_argument('--debug', '-d', action='store_true', + help='show the version', + default=False) + + args = parser.parse_args() + print("=== end ===") + +上面debug处的配置,需要讲一下的是 ``action='store_true'`` 和 +``default = False`` 的作用和区别 + +- ``store_true``\ :一旦指定了 -d 或者 –debug ,其值就为 + True,store_false则相反 +- ``default=False``\ :未指定 -d 或者 –debug,其值就默认为False + +当我们执行 ``python mytest.py -v``\ ,就会打印 version 里的内容。 + +.. code:: python + + [root@localhost ~]# python mytest.py -v + mytest.py version : v 0.01 + [root@localhost ~]# + +一旦执行时,指定了参数 -v ,执行到 parser.parse_args() +就会退出程序,不会打印最后的 ``=== end ===`` + +2. 参数种类 +----------- + +参数可分为 必选参数(positional arguments) 和 可选参数(optional +arguments)。 + +在argsparse 里如何实现呢? + +**必选参数** + +用单词做参数,默认就为必选参数 + +.. code:: python + + # mytest.py + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("name") + + args = parser.parse_args() + + print(args.name) + +不指定name参数运行一下:\ ``python mytest.py`` + +.. code:: python + + [root@localhost ~]# python mytest.py + usage: mytest.py [-h] name + mytest.py: error: too few arguments + [root@localhost ~]# + +如预期一样,报错了,说缺少参数。那我们指定一下:\ ``python mytest.py name wangbm`` + +.. code:: python + + [root@localhost ~]# python mytest.py wangbm + wangbm + [root@localhost ~]# + +**可选参数** + +有两种方式: + +1. 单下划线 - 来指定的短参数,如\ ``-h``\ ; +2. 双下划线 ``--`` 来指定的长参数,如\ ``--help`` + +.. code:: python + + # mytest.py + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("-v", "--verbosity", help="increase output verbosity") + + args = parser.parse_args() + + if args.verbosity: + print("verbosity turned on") + else: + print("verbosity turned off") + +试着运行一下 ``python mytest.py``\ ,不会报错。 + +.. code:: python + + [root@localhost ~]# python mytest.py + verbosity turned off + [root@localhost ~]# + +3. 参数类型 +----------- + +有的参数,是字符串,有的参数,是数值。 + +为了对命令行中的参数进行有效的约束,我们可以事先对参数的类型进行声明。argparse +会对参数进行校验,不通过时,会直接抛出错误。 + +.. code:: python + + # mytest.py + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("name") + parser.add_argument("age", type=int) + + args = parser.parse_args() + + print(args.name) + print(args.age) + +测试一下唄。 + +.. code:: python + + [root@localhost ~]# python mytest.py wangbm eighteen + usage: mytest.py [-h] name age + mytest.py: error: argument age: invalid int value: 'eighteen' + [root@localhost ~]# + [root@localhost ~]# python mytest.py wangbm 18 + wangbm + 18 + [root@localhost ~]# + +你看,写 ``eighteen`` 就不行,提示类型不合法,只有写 ``18`` 才行。 + +4. 互斥参数 +----------- + +有些参数,是互斥的,有你无我。比如,性别。 + +在 argparse 中如何实现? + +.. code:: python + + import argparse + + parser = argparse.ArgumentParser() + group = parser.add_mutually_exclusive_group() + group.add_argument("-m", "--male", action="store_true") + group.add_argument("-f", "--female", action="store_true") + args = parser.parse_args() + +如果同时指定了这两个参数,就会报错。 + +.. code:: python + + [root@localhost ~]# python mytest.py -f + [root@localhost ~]# python mytest.py -m + [root@localhost ~]# python mytest.py -m -f + usage: mytest.py [-h] [-m | -f] + mytest.py: error: argument -f/--female: not allowed with argument -m/--male + [root@localhost ~]# + +5. 可选值 +--------- + +如果是性别,可以像上面那样放在两个参数里然后用互斥组来约束,也可以放在一个参数里,在argparse里限制再在外层做判断。 + +.. code:: python + + # mytest.py + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("-g", "--gender", default='male', + choices=['male', 'female']) + + args = parser.parse_args() + print(args.gender) + +试着执行一下,发现性别只能是男或女,不能为人妖。 + +.. code:: python + + [root@localhost ~]# python mytest.py --gender male + male + [root@localhost ~]# python mytest.py --gender female + female + [root@localhost ~]# + [root@localhost ~]# + [root@localhost ~]# python mytest.py --gender other + usage: mytest.py [-h] [-g {male,female}] + mytest.py: error: argument -g/--gender: invalid choice: 'other' (choose from 'male', 'female') + [root@localhost ~]# + +6. 指定文件 +----------- + +经常会有那种要在脚本中指定配置文件或者其他文件的需求。可以使用下面的配置 + +.. code:: python + + import argparse + parser = argparse.ArgumentParser() + + parser.add_argument('--file', '-f', action='append', + dest='files', + help=('additional yaml configuration files to use'), + type=argparse.FileType('rb')) + + args = parser.parse_args() + +``dest=files``\ ,是说将命令行中,\ ``--file`` +的参数值赋值给变量files,你可以用args.files访问。 + +``action=append``\ ,由于我们会有指定多个文件的需求,那就指定多次\ ``--file`` +,argparse会将其放在一个list里。 + +``type=argparse.FileType('rb')``\ ,既然是指定文件,那么参数应该为路径,并指定打开模式为rb,如果如果要取得文件内容,可以用 +``args.files[0].read()`` + +7. 子解析器 +----------- + +如果你对命令行,有过足够多的接触,就会知道有些情况下会有子解析器。 + +这里我以自己工作中,碰到的例子来举个例子。 + +:: + + cloud-init --debug single -name mymodule + +其中 single 后面是一个子解析器。 + +.. code:: python + + # cloud-init.py + + def main_single(name, args): + print("name: ", name) + print("args: ", args) + print("I am main_single") + + # 添加一个子解析器 + subparsers = parser.add_subparsers() + + parser_single = subparsers.add_parser('single',help='run a single module') + + # 对single 子解析器添加 action 函数。 + parser_single.set_defaults(action=('single', main_single)) + + # require=True,是说如果命令行指定了single解析器,就必须带上 --name 的参数。 + parser_single.add_argument("--name", '-n', action="store", + help="module name to run", + required=True) + + args = parser.parse_args() + + (name, functor) = args.action + if name in ["single"]: + functor(name, args) + +执行命令\ ``cloud-init single -name mymodule``\ ,输出如下 + +.. code:: python + + name: single + args: Namespace(action=('single', ), debug=False, file=None, name='mymodule') + I am main_single + +8. cloudinit 笔记 +----------------- + +8.1 顶层参数 +~~~~~~~~~~~~ + +:: + + '--version', '-v' + '--file', '-f' + '--debug', '-d' + '--force' + +.. _子解析器-1: + +8.2 子解析器 +~~~~~~~~~~~~ + +:: + + init,可跟可选参数 "--local", '-l',处理函数:main_init + modules, "--mode", '-m',只可选'init', 'config', 'final'处理函数:main_modules + query, "--name", '-n',处理函数:main_query + single,"--name", '-n',--frequency,module_args,处理函数:main_single diff --git a/source/c05/c05_03.rst b/source/c05/c05_03.rst index 051b50d..5a5db14 100755 --- a/source/c05/c05_03.rst +++ b/source/c05/c05_03.rst @@ -163,5 +163,5 @@ B 可以读取和更改用户 A 的信息,这无疑带来了很大的安全隐 :alt: 关注公众号,获取最新干货! -.. |image0| image:: image.python-online.cn/20190112181126.png +.. |image0| image:: http://image.python-online.cn/20190112181126.png diff --git a/source/c07/c07_01.rst b/source/c07/c07_01.rst index 4e0fa6a..719d59b 100755 --- a/source/c07/c07_01.rst +++ b/source/c07/c07_01.rst @@ -894,6 +894,19 @@ Linux的分区的过程经历以下几个步骤 # 删除分区前,先确认有没有挂载点,有的话需要先umount卸载 $ fdisk /dev/vdb 然后再按d,w +挂载分区 fstab + +:: + + # 当fstab的根分区被注释后,所有的文件都是只读的。连fstab文件也是,无法取消注释 + mount -o remount,rw / + +格化化分区 + +:: + + mkfs.ext4 /dev/sdb1 + 2.3 进程管理 ~~~~~~~~~~~~ @@ -1229,7 +1242,7 @@ Linux上,硬件的设备驱动(如硬盘)和特殊设备文件(如\ ``/d 例行性任务(crontab) ^^^^^^^^^^^^^^^^^^^^^ -参考以下文字 1. +参考以下文章 1. `每天一个linux命令(50):crontab命令 `__ 2. `鸟哥的私房菜 `__ @@ -1254,6 +1267,21 @@ Linux上,硬件的设备驱动(如硬盘)和特殊设备文件(如\ ``/d # 删除任务(当前用户),当然也可以指定用户 $ crontab -r [-u user] +除了以上,例行性任务还有可能在 /etc/cron.daily/ ,/etc/cron.hourly/, +/etc/cron.monthly/, /etc/cron.weekly/ 下面。 + +如果messages 不能正常回滚,可以考虑加个参数 ``-f`` + +:: + + /usr/sbin/logrotate -f /etc/logrotate.conf + +如果还不行,检查一下 ``/etc/logrotate.d/syslog`` + +:: + + chmod 644 /etc/logrotate.d/syslog + 三、用户/权限管理 ----------------- @@ -1417,6 +1445,14 @@ CentOS s: 保密性地删除文件或目录,即硬盘空间被全部收回。 u: 与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion. +切换用户执行命令 + +:: + + $ su - zabbix -s /bin/bash + + # 退出的话,使用exit + 四、网络管理 ------------ @@ -1478,9 +1514,17 @@ CentOS 3. `iptables详解 `__ -4.2 开放端口 +4.2 端口相关 ~~~~~~~~~~~~ +查询端口占用情况 + +:: + + lsof -i:10051 + +开放端口 + :: # 在filter表里添加规则 @@ -1495,8 +1539,7 @@ CentOS # 检测是否开启完成 $ netstat -tunl|grep 8500 -4.3 端口转发 -~~~~~~~~~~~~ +端口转发 :: @@ -1512,6 +1555,34 @@ CentOS # 测试一下,在浏览器输入 36.250.x.x:8500 # 就可以看到我们的内容了。 +4.3 路由相关 +~~~~~~~~~~~~ + +路由转发:snat + +:: + + + # 1、开启转发 + # vim /etc/sysctl.conf,sysctl -p 该命令可以查看是否修改成功 + net.ipv4.ip_forwaed=1 + + # 或者可以执行下面这两条命令其中一条 + echo 1 > /proc/sys/net/ipv4/ip_forward + sysctl -w net.ipv4.ip_forward=1 + + # 2、在网关节点的 /etc/sysconfig/iptables 加上规则。 + *nat + :PREROUTING ACCEPT [4730:370403] + :INPUT ACCEPT [501:29436] + :OUTPUT ACCEPT [3563:214910] + :POSTROUTING ACCEPT [3564:214973] + -A POSTROUTING -s 172.20.20.0/24 -o eth0 -j SNAT --to-source 58.xx.xx.xx + COMMIT + + # 重启iptables + systemctl restart iptables + 4.4 ip 命令 ~~~~~~~~~~~ diff --git a/source/c07/c07_02.rst b/source/c07/c07_02.rst index 4bd309b..f362254 100755 --- a/source/c07/c07_02.rst +++ b/source/c07/c07_02.rst @@ -272,7 +272,21 @@ server 端独立于所有集群之外。 七、监控数据获取 ---------------- -7.1 自定义脚本获取 +7.1 系统自带监控项 +~~~~~~~~~~~~~~~~~~ + +7.1.1 agent失联 +^^^^^^^^^^^^^^^ + +第一个条件:5分钟没有数据 + +第二个条件:上一次有数据 + +:: + + {$host:agent.ping.nodata(5m)}=1 and {$host:agent.ping.prev()}=1 + +7.2 自定义脚本获取 ~~~~~~~~~~~~~~~~~~ 自定义监控项,需要有一些脚本支持获取数据。 diff --git a/source/c08/c08_01.rst b/source/c08/c08_01.rst index e214529..c3ed604 100755 --- a/source/c08/c08_01.rst +++ b/source/c08/c08_01.rst @@ -42,8 +42,9 @@ --security-groups default \ --nic net-id=,v4-fixed-ip= \ --image \ - --min-count 2 \ --config-drive True \ + --min-count 2 \ + --user-data [user-data-file-path] \ [--num-instances 2] [--snapshot ] [--block-device-mapping vda=a9c7816b-0046-4aa9-9c82-cb881a969bdd:snapshot:300:delete-on-terminate --availability-zone nova:LX-OS-node13 --poll] @@ -161,7 +162,7 @@ aggregate管理 https://docs.openstack.org/project-install-guide/baremetal/draft/configure-glance-images.html # 上传镜像 (具体看哪glance help image-create) - $ glance image-create --name ws_openstack2.qcow2 --visibility public --disk-format qcow2 --container-format bare --file /home/openstack/ws_openstack.qcow2 + $ glance image-create --name centos6.5-old --visibility public --disk-format qcow2 --container-format bare --property ws:predownload=True --file /home/ 1.4 keystone ~~~~~~~~~~~~ @@ -294,6 +295,9 @@ aggregate管理 # 查看可用块设备列表 $ lsblk + # 将pv从vg移除 + $ vgreduce --removemissing --force hdd-volumes + 1.3 QEMU命令 ~~~~~~~~~~~~ @@ -305,8 +309,8 @@ aggregate管理 # 创建qcow2文件 $ qemu-img create -f qcow2 openstack-name.qcow2 100G -三、数据库 ----------- +三、集群相关 +------------ -------------- @@ -321,6 +325,50 @@ aggregate管理 # 查看该节点MariaDB是否启动 $ mariadbClusterCheck +3.2 RabbitMQ +~~~~~~~~~~~~ + +先在一台节点启动 ``service rabbitmq-server restart`` + +启动后,会生成 ``/var/lib/rabbitmq/.erlang.cookie`` +文件,为了实现节点间的通信加密,需要将这个文件拷贝至其他两个节点。拷贝时,注意生意授予权限。 + +:: + + chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie + +然后启动一下后面两台的服务。 + +:: + + service rabbitmq-server restart + +以上都准备好了,现在好开始构建集群了。 + +分别在后面两个节点执行如下操作。 + +:: + + rabbitmqctl stop_app + + rabbitmqctl join_cluster --ram rabbit@ws_controller01(ws_controller01为节点1的hostname) + + rabbitmqctl start_app + +执行完成后,可以查看一下集群状态。 + +:: + + rabbitmqctl cluster_status + +有了集群后,如果要(openstack)使用,还要创建一下用户 + +:: + + rabbitmqctl add_user openstack openstack12#$ + rabbitmqctl set_permissions -p / openstack ".*" ".*" ".*" + rabbitmqctl set_user_tags openstack administrator + -------------- .. figure:: https://ws1.sinaimg.cn/large/8f640247gy1fyi60fxos4j20u00a8tdz.jpg diff --git a/source/c08/c08_04.md b/source/c08/c08_04.md new file mode 100644 index 0000000..c186bca --- /dev/null +++ b/source/c08/c08_04.md @@ -0,0 +1,45 @@ +# 8.4 虚拟化入门概念 + +## 8.4.1 虚拟化分类 + +### 8.4.1.1 全虚拟化 + +**全虚拟化(英语:Full virtualization)**是硬件虚拟化的一种,允许**未经修改**的客操作系统(英语:Guest OS)隔离运行。在全虚拟化环境中,任何可以运行在裸机上的软件(通常是操作系统)都可以未经修改地运行在虚拟机中。 + +虽然适应性较强,但是由于完全依赖软件模拟硬件接口,性能较低,不如半虚拟化。 + +代表:VMWare(1998年) + +### 8.4.1.2 全虚拟化 + +半虚拟化(英语:**Paravirtualization**)是另一种类似于全虚拟化的热门技术。它在HOST上使用Hpervisor(虚拟机管理程序)提供便利的接口,使得Guest OS能够调用接口访问虚拟硬件。而条件是,Guest OS 内部需要部署安装相应的驱动和软件逻辑,需要对操作系统进行修改。 + +半虚拟化系统性能可以接近在裸机上的性能。 + +代表:Xen(2006) + +- Xen是一款虚拟化软件,支持半虚拟化和完全虚拟化。它在不支持VT技术的cpu上也能使用,但是只能以半虚拟化模式运行。 +- 半虚拟化的意思是需要修改被虚拟系统的内核,以实现系统能被完美的虚拟在Xen上面。完全虚拟化则是不需要修改系统内核则可以直接运行在Xen上面。 +- VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化的高。半虚拟化系统性能可以接近在裸机上的性能。 +- Xen是由一个后台守护进程维护的,叫做xend,要运行虚拟系统,必须先将它开启。 +- Xen的配置工具有许多,我使用的是virt-manager(GUI)、virt-install和xm。第一个用于管理和安装系统,第二个只用于安装系统,第三个用于启动系统。 + +### 8.4.1.3 硬件辅助虚拟化 + +硬件辅助虚拟化(英语:**Hardware-assisted virtualization**),直接从硬件层面开始支持虚拟化。由硬件支持并提供多个虚拟硬件设备接口,这些设备由虚拟机内核驱动传递给虚拟机使用。使用这种方式,虚拟机能获得和宿主机一样的硬件功能,性能也和宿主机相近,同时原生操作系统本来就支持这项技术,因此无需对操作系统进行修改。 + +缺点就是,硬件要支持虚拟化功能,但是随着虚拟化技术的发展,越来越多的硬件都已经支持虚拟化,成本也越来越低,所以硬件辅助虚拟化是目前最流行,使用最广泛的虚拟化技术。 + +代表:KVM(2009) + +以上是三种常见的虚拟化方式,但是要注意的是,一个虚拟化软件不一定会只采用一种虚拟化方式,比如KVM通常使用**硬件辅助虚拟化**实现cpu、内存的虚拟化,**而使用半虚拟化**的virtio接口实现硬盘,网卡等io设备的虚拟化。 + +kvm 的 内核模块: + +- kvm.ko +- Kvm_intel.ko 或者 kvm_amd.ko + +需要安装的软件 + +- qemu-kvm + diff --git a/source/c08/c08_04.rst b/source/c08/c08_04.rst new file mode 100644 index 0000000..ba3ab79 --- /dev/null +++ b/source/c08/c08_04.rst @@ -0,0 +1,56 @@ +8.4 虚拟化入门概念 +================== + +8.4.1 虚拟化分类 +---------------- + +8.4.1.1 全虚拟化 +~~~~~~~~~~~~~~~~ + +**全虚拟化(英语:Full +virtualization)**\ 是硬件虚拟化的一种,允许\ **未经修改**\ 的客操作系统(英语:Guest +OS)隔离运行。在全虚拟化环境中,任何可以运行在裸机上的软件(通常是操作系统)都可以未经修改地运行在虚拟机中。 + +虽然适应性较强,但是由于完全依赖软件模拟硬件接口,性能较低,不如半虚拟化。 + +代表:VMWare(1998年) + +.. _全虚拟化-1: + +8.4.1.2 全虚拟化 +~~~~~~~~~~~~~~~~ + +半虚拟化(英语:\ **Paravirtualization**)是另一种类似于全虚拟化的热门技术。它在HOST上使用Hpervisor(虚拟机管理程序)提供便利的接口,使得Guest +OS能够调用接口访问虚拟硬件。而条件是,Guest OS +内部需要部署安装相应的驱动和软件逻辑,需要对操作系统进行修改。 + +半虚拟化系统性能可以接近在裸机上的性能。 + +代表:Xen(2006) + +- Xen是一款虚拟化软件,支持半虚拟化和完全虚拟化。它在不支持VT技术的cpu上也能使用,但是只能以半虚拟化模式运行。 +- 半虚拟化的意思是需要修改被虚拟系统的内核,以实现系统能被完美的虚拟在Xen上面。完全虚拟化则是不需要修改系统内核则可以直接运行在Xen上面。 +- VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化的高。半虚拟化系统性能可以接近在裸机上的性能。 +- Xen是由一个后台守护进程维护的,叫做xend,要运行虚拟系统,必须先将它开启。 +- Xen的配置工具有许多,我使用的是virt-manager(GUI)、virt-install和xm。第一个用于管理和安装系统,第二个只用于安装系统,第三个用于启动系统。 + +8.4.1.3 硬件辅助虚拟化 +~~~~~~~~~~~~~~~~~~~~~~ + +硬件辅助虚拟化(英语:\ **Hardware-assisted +virtualization**\ ),直接从硬件层面开始支持虚拟化。由硬件支持并提供多个虚拟硬件设备接口,这些设备由虚拟机内核驱动传递给虚拟机使用。使用这种方式,虚拟机能获得和宿主机一样的硬件功能,性能也和宿主机相近,同时原生操作系统本来就支持这项技术,因此无需对操作系统进行修改。 + +缺点就是,硬件要支持虚拟化功能,但是随着虚拟化技术的发展,越来越多的硬件都已经支持虚拟化,成本也越来越低,所以硬件辅助虚拟化是目前最流行,使用最广泛的虚拟化技术。 + +代表:KVM(2009) + +以上是三种常见的虚拟化方式,但是要注意的是,一个虚拟化软件不一定会只采用一种虚拟化方式,比如KVM通常使用\ **硬件辅助虚拟化**\ 实现cpu、内存的虚拟化,\ **而使用半虚拟化**\ 的virtio接口实现硬盘,网卡等io设备的虚拟化。 + +kvm 的 内核模块: + +- kvm.ko +- Kvm_intel.ko 或者 kvm_amd.ko + +需要安装的软件 + +- qemu-kvm From 6b7abae4bba42a2d077948ca86b67bd7bbf2cbf6 Mon Sep 17 00:00:00 2001 From: BingmingWong Date: Sun, 17 Feb 2019 22:17:09 +0800 Subject: [PATCH 003/334] update the readme --- README.md | 33 +++++++++++++++++++++++++++++++-- source/c04/c04_13.md | 3 ++- source/c08/c08_01.md | 2 +- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 418c147..d28bc4a 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,13 @@ - 1.4 [什么是猴子补丁?](http://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_04.html) - 1.5 [深入理解闭包与变量作用域](http://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_05.html) - 1.6 [深入理解元组存在的意义](http://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_07.html) -- 1.7 [15个Pythonic的代码示例 -](https://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_06.html) +- 1.7 [15个Pythonic的代码示例](https://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_06.html) - 1.8 [新式类和经典类的区别?](https://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_08.html) - 1.9 [多继承与Mixin设计模式](https://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_09.html) - 1.10 [盘点 Python 中那些冷知识](https://mings-blog.readthedocs.io/zh_CN/latest/c01/c01_10.html) +- 1.11 [正则表达式必知必会](http://python-online.cn/zh_CN/latest/c01/c01_11.html) +- 1.12 [搞懂字符编码的前世今生](http://python-online.cn/zh_CN/latest/c01/c01_12.html) +- 1.13 [Python几个高阶函数](http://python-online.cn/zh_CN/latest/c01/c01_13.html) ## 第二章:并发编程 - 2.1 [从性能角度来初探并发编程](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c02_01.html) @@ -35,6 +37,7 @@ - 3.1 [装饰器从入门到高阶](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c03_01.html) - 3.2 [学会使用元类定制类](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c03_02.html) - 3.3 [学会使用socket网络编程](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c03_03.html) +- 3.4 [Django+Uwsgi部署网站](http://python-online.cn/zh_CN/latest/c03/c03_04.html) ## 第四章:开发工具 - 4.1 [虚拟环境的搭建与使用](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c04_01.html) @@ -42,6 +45,14 @@ - 4.3 [30分钟教你搭建顔值超高的博客](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c04_03.html) - 4.4 [Jupyter NoteBook 的使用指南](https://mings-blog.readthedocs.io/zh_CN/latest/c04/c04_04.html) - 4.5 [Win10 + Ubuntu 双系统安装指南](https://mings-blog.readthedocs.io/zh_CN/latest/c04/c04_05.html) +- 4.6 [我的 Git 使用指南](http://python-online.cn/zh_CN/latest/c04/c04_06.html) +- [4.7 Hexo 搭建博客教程](http://python-online.cn/zh_CN/latest/c04/c04_07.html) +- [4.8 珍惜生命,远离鼠标](http://python-online.cn/zh_CN/latest/c04/c04_08.html) +- [4.9 MySQL的基本使用](http://python-online.cn/zh_CN/latest/c04/c04_09.html) +- [4.10 MySQL的高级进阶](http://python-online.cn/zh_CN/latest/c04/c04_10.html) +- [4.11 不能不会的远程调试技巧](http://python-online.cn/zh_CN/latest/c04/c04_11.html) +- [4.12 服务器调试神器:pdb](http://python-online.cn/zh_CN/latest/c04/c04_12.html) +- [4.13 命令行解析工具:argparse](http://python-online.cn/zh_CN/latest/c04/c04_13.html) ## 第五章:算法教程 - 5.1 [图解九大经典排序算法(一)](http://mings-blog.readthedocs.io/zh_CN/latest/c02/c05_01.html) @@ -53,7 +64,25 @@ - 6.3 [如何绘制正余弦函数图象](https://mings-blog.readthedocs.io/zh_CN/latest/c06/c06_03.html) - 6.4 [子图与子区 难点突破](https://mings-blog.readthedocs.io/zh_CN/latest/c06/c06_04.html) +## 第七章:运维人生 + +- [7.1 Linux 命令行的艺术](http://python-online.cn/zh_CN/latest/c07/c07_01.html) +- [7.2 Zabbix 监控部署文档](http://python-online.cn/zh_CN/latest/c07/c07_02.html) +- [7.3 Docker:Hello world](http://python-online.cn/zh_CN/latest/c07/c07_03.html) +- [7.4 Docker:关于镜像](http://python-online.cn/zh_CN/latest/c07/c07_04.html) +- [7.5 Docker:网络通信](http://python-online.cn/zh_CN/latest/c07/c07_05.html) +- [7.6 Docker:存储与多主机](http://python-online.cn/zh_CN/latest/c07/c07_06.html) +- [7.7 SaltStack 入门指南](http://python-online.cn/zh_CN/latest/c07/c07_07.html) + +## 第八章:OpenStack + +- [8.1 OpenStack 运维命令](http://python-online.cn/zh_CN/latest/c08/c08_01.html) +- [8.2 OpenStack 部署SR-IOV](http://python-online.cn/zh_CN/latest/c08/c08_02.html) +- [8.3 制作 OpenStack 镜像](http://python-online.cn/zh_CN/latest/c08/c08_03.html) +- [8.4 虚拟化入门概念](http://python-online.cn/zh_CN/latest/c08/c08_04.html) + ## LeetCode Challenge + - [NO.1-10](http://mings-blog.readthedocs.io/zh_CN/latest/lc01/1-10.html) --- diff --git a/source/c04/c04_13.md b/source/c04/c04_13.md index 1119bce..0a9c8c6 100644 --- a/source/c04/c04_13.md +++ b/source/c04/c04_13.md @@ -335,5 +335,6 @@ query, "--name", '-n',处理函数:main_query single,"--name", '-n',--frequency,module_args,处理函数:main_single ``` +--- - +![关注公众号,获取最新干货!](https://ws1.sinaimg.cn/large/8f640247gy1fyi60fxos4j20u00a8tdz.jpg) \ No newline at end of file diff --git a/source/c08/c08_01.md b/source/c08/c08_01.md index d9feb7e..75d7290 100644 --- a/source/c08/c08_01.md +++ b/source/c08/c08_01.md @@ -1,4 +1,4 @@ -# 18.1 OpenStack 运维命令 +# 8.1 OpenStack 运维命令 --- From 888b4512c42ecbf765cf14a9969dd0f84538b291 Mon Sep 17 00:00:00 2001 From: BingmingWong Date: Sun, 24 Feb 2019 20:55:17 +0800 Subject: [PATCH 004/334] update --- source/c08/c08_01.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/source/c08/c08_01.md b/source/c08/c08_01.md index d9feb7e..c7bf2a0 100644 --- a/source/c08/c08_01.md +++ b/source/c08/c08_01.md @@ -248,7 +248,7 @@ $ openstack role remove -h ### 1.2 virsh命令 -```shell +``` # 查看虚拟机的网卡信息 $ virsh domiflist VM1 @@ -264,9 +264,26 @@ virsh resume # 开机自启 virsh autostart virsh list --autostart + +``` + +热增加网卡:`virsh attach-device ws_controller01 ./tmp.xml --persistent --live` + +```xml + + + + + + + + ``` + + ### 1.2 LVM管理 + ```shell # 查看计算节点VG信息 $ vgdisplay From 6ed9a7213975760f9b95e6d61ac7015010f093e2 Mon Sep 17 00:00:00 2001 From: BingmingWong Date: Mon, 25 Feb 2019 22:00:12 +0800 Subject: [PATCH 005/334] add file --- source/c08/c08_04.md | 278 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 272 insertions(+), 6 deletions(-) diff --git a/source/c08/c08_04.md b/source/c08/c08_04.md index c186bca..634061f 100644 --- a/source/c08/c08_04.md +++ b/source/c08/c08_04.md @@ -4,18 +4,30 @@ ### 8.4.1.1 全虚拟化 -**全虚拟化(英语:Full virtualization)**是硬件虚拟化的一种,允许**未经修改**的客操作系统(英语:Guest OS)隔离运行。在全虚拟化环境中,任何可以运行在裸机上的软件(通常是操作系统)都可以未经修改地运行在虚拟机中。 +**全虚拟化(英语:Full virtualization)**是硬件虚拟化的一种。 -虽然适应性较强,但是由于完全依赖软件模拟硬件接口,性能较低,不如半虚拟化。 +通俗点讲,全虚拟化就是说,虚拟机的所有操作(CPU,内存,网络等)都需要经过一个运行在物理机上的虚拟化软件转发给物理机内核。而这个虚拟化软件,在windows上你常见且熟悉的有vmware,virtualbox。 + +允许**未经修改**的客操作系统(英语:Guest OS)隔离运行。在全虚拟化环境中,任何可以运行在裸机上的软件(通常是操作系统)都可以未经修改地运行在虚拟机中。 + +虽然适应性较强,但是由于完全依赖软件模拟硬件接口,全虚拟化的运行速度要快于硬件模拟,但是性能方面不如裸机,因为Hypervisor需要占用一些资源。不如半虚拟化。 + +![](http://image.python-online.cn/FqDTXLAxlDdtrsGndSurNeIEtehl) 代表:VMWare(1998年) -### 8.4.1.2 全虚拟化 +### 半虚拟化 + +半虚拟化(英语:**Paravirtualization**)是另一种类似于全虚拟化的热门技术。 -半虚拟化(英语:**Paravirtualization**)是另一种类似于全虚拟化的热门技术。它在HOST上使用Hpervisor(虚拟机管理程序)提供便利的接口,使得Guest OS能够调用接口访问虚拟硬件。而条件是,Guest OS 内部需要部署安装相应的驱动和软件逻辑,需要对操作系统进行修改。 +通俗点讲,半虚拟化对比全虚拟化,就是有一些可以直接操作物理内核空间,而不需要全部经过虚拟化软件。这就大大提高了虚拟机的性能。 + +它在HOST上使用Hpervisor(虚拟机管理程序)提供便利的接口,使得Guest OS能够调用接口访问虚拟硬件。而条件是,Guest OS 内部需要部署安装相应的驱动和软件逻辑,需要对操作系统进行修改。 半虚拟化系统性能可以接近在裸机上的性能。 +![](http://image.python-online.cn/FjJKZqDYDnrQrdk22fAWgYbKEneK) + 代表:Xen(2006) - Xen是一款虚拟化软件,支持半虚拟化和完全虚拟化。它在不支持VT技术的cpu上也能使用,但是只能以半虚拟化模式运行。 @@ -24,11 +36,11 @@ - Xen是由一个后台守护进程维护的,叫做xend,要运行虚拟系统,必须先将它开启。 - Xen的配置工具有许多,我使用的是virt-manager(GUI)、virt-install和xm。第一个用于管理和安装系统,第二个只用于安装系统,第三个用于启动系统。 -### 8.4.1.3 硬件辅助虚拟化 +### 硬件辅助虚拟化 硬件辅助虚拟化(英语:**Hardware-assisted virtualization**),直接从硬件层面开始支持虚拟化。由硬件支持并提供多个虚拟硬件设备接口,这些设备由虚拟机内核驱动传递给虚拟机使用。使用这种方式,虚拟机能获得和宿主机一样的硬件功能,性能也和宿主机相近,同时原生操作系统本来就支持这项技术,因此无需对操作系统进行修改。 -缺点就是,硬件要支持虚拟化功能,但是随着虚拟化技术的发展,越来越多的硬件都已经支持虚拟化,成本也越来越低,所以硬件辅助虚拟化是目前最流行,使用最广泛的虚拟化技术。 +缺点就是,硬件要支持虚拟化功能,在以前这可能是缺点,但是现在随着虚拟化技术的发展,越来越多的硬件都已经支持虚拟化,成本也越来越低,所以硬件辅助虚拟化是目前最流行,使用最广泛的虚拟化技术。 代表:KVM(2009) @@ -43,3 +55,257 @@ kvm 的 内核模块: - qemu-kvm +## 8.4.2 虚拟化技术 + +#### KVM + +KVM(Kernel-based Virtual Machine),意思是基于内核的虚拟机。 + +KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。 + +#### Xen + +Xen是第一类运行在裸机上的虚拟化管理程序。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。 + +#### QEMU + +QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。Qemu,其中关键字emu,全称emulator,模拟器,所以单纯使用qemu是采用的完全虚拟化的模式。 + +**那QEMU有什么用?它和KVM是什么关系呢?** + +准确来说,KVM是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。 + +但仅有KVM模块是 远远不够的,KVM是最底层的hypervisor,它仅用来模拟CPU的运行,缺少了对network和周边I/O的支持,所以我们是没法直接用它的。 + +而QEMU-KVM就是一个完整的模拟器,它是基于KVM构建的,提供了完整的网络和I/O支持。 + +说到了QEMU,其实它也是一个虚拟化软件。作用是什么呢,它相当于一个路由器,当Guest OS的内核想要操作物理硬件时,必须先经由Qemu转发,将操作指令转给真实的硬件。由于所有的指令都要从Qemu里面过一手,因而性能比较差。 + +![](http://image.python-online.cn/FjlPaQLTiYCde92WhurWsRx6z8CK) + +**总结** + +1. KVM 和 Xen 都是免费的。 +2. KVM 需要硬件支持(Intel VT或AMD-V),集成在内核中,而Xen可在所有的Linux上运行,不需要硬件支持。 + +#### libvirt + +要解释libvirt是什么,只要知道为什么会需要libvirt就好了。 + +- 虚拟化的底层可能是KVM,也可能是Xen,或者是其他市面上的Hypervisor,种类之繁多,如果没有一个统一的接口来管理它们,就太乱了,移植性非常差。 +- Hypervisor ,以 qemu-kvm 为例,它的命令行虚拟机管理工具参数众多,难于使用。需要有一个工具将这些参数进行封装。 + +这些都是在内核空间层做的事情,而我们用户创建、销毁虚拟机都是在用户空间层操作,这就尴尬了,我们没有权限。 + +这下该 libvirt 出场了,libvirt分为服务端各客户端。 + +服务端是libvirtd,而你所熟悉的virt,virt-install,virt-manager,virt-viewer 等都是libvirt的客户端。 + +目前,libvirt 已经成为使用最为广泛的对各种虚拟机进行管理的工具和应用程序接口(API),而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。 + +![](https://i.loli.net/2019/02/25/5c73e070ef9e4.jpg) + +## 8.4.3 KVM工具 + +- Virsh:基于 libvirt 的 命令行工具 (CLI) + +- Virt-Manager:基于 libvirt 的 GUI 工具 + +- virt-v2v:虚机格式迁移工具 + +- virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等 + +- libguestfs-tools:一组 Linux 下的 C 语言的 API ,用来访问/修改虚拟机的磁盘映像文件。 + +![](https://i.loli.net/2019/02/25/5c73e6160764a.png) + +## 8.4.4 创建虚拟机 + +#### 手工创建 + +虚拟机的本质是宿主机上的一个进程,当你用OpenStack在界面,或者使用CLI创建了一个虚拟机时。你可以登陆到计算节点去,使用`ps -ef|grep kvm` 看下这个虚拟机的进程,是下面这样子的。 + +天呐,参数多得让人头皮发麻。这要是没有通过 OpenStack 创建,我得写这么长一串命令才能创建一台虚拟机。瞬间觉得 OpenStack 牛逼了不少。 + +```shell +$ /usr/libexec/qemu-kvm \ +-name guest=instance-00000035, debug-threads=on \ +-S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-216-instance-00000035/master-key.aes \ +-machine pc-i440fx-rhel7.5.0,accel=kvm,usb=off,dump-guest-core=off \ +-cpu host \ +-m 16384 \ +-realtime mlock=off \ +-smp 2,maxcpus=32,sockets=2,cores=16,threads=1 \ +-uuid 31d70882-194f-469b-855e-fcfa6736550d \ +-smbios type=1,manufacturer=RDO,product=OpenStack Compute,version=0.0.1-1.el7.centos,serial=bc147bfe8a204d06a09f98387e46b890,uuid=31d70882-194f-469b-855e-fcfa6736550d,family=Virtual Machine \ +-display none \ +-no-user-config -nodefaults \ +-chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-216-instance-00000035/monitor.sock,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc,driftfix=slew \ +-global kvm-pit.lost_tick_policy=delay \ +-no-hpet -no-shutdown -boot strict=on \ + +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/dev/hdd-volumes/31d70882-194f-469b-855e-fcfa6736550d_disk,format=raw,if=none,id=drive-virtio-disk0,cache=none,aio=native -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/var/lib/nova/instances/31d70882-194f-469b-855e-fcfa6736550d/disk.config,format=raw,if=none,id=drive-ide0-0-0,readonly=on,cache=writeback \ +-device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +-netdev tap,fds=28:35,id=hostnet0,vhost=on,vhostfds=36:37 \ +-device virtio-net-pci,mq=on,vectors=6,netdev=hostnet0,id=net0,mac=fa:16:3e:69:63:18,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=on +``` + +#### virsh 创建 + +使用OpenStack创建的前提是你发搭建好OpenStack环境,由于这个环境部署比较复杂。所以你也可以使用virsh 命令来创建。 + +使用virsh 创建之前,你需要准备好一个镜像(可以qcow2格式的,也可以是raw格式的)。 + +然后你要准备一个xml文件,并写入你的虚拟机配置。 + +```xml + + ws_controller01 + 9f9424b1-57ea-4281-b650-8fb4de03fc68 + 12582912 + 12582912 + 6 + + + + + + + /machine + + + hvm + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + + + + + /usr/libexec/qemu-kvm + + + + + + +
+ + + + + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +