? qcow2 ? ? 分区 ?    2020-08-13 13:39:52    1040    1    0

ubuntu 扩展磁盘后如何扩展分区

背景: 使用kvm 安装 qcow2 文件 ,启用一个ubuntu 虚拟机。

直接扩展qcow2 镜像文件 的磁盘大小,并指定扩展在分区N

  1. qemu-img info a.qcow2
  2. qemu-img create -f qcow2 -o preallocation=metadata b.qcow2 60G
  3. virt-resize --expand /dev/sda1 a.qcow2 b.qcow2
  4. #第一个命令查看a.qcow2 镜像磁盘有多大(a 包含我们要安装系统镜像)
  5. #第二个命令创建一块 60G 的镜像磁盘文件(即最终磁盘容量,b须比a大)
  6. #第三个命令,将a 镜像内容拷到b镜像中,并将空闲空间(b'size-a'size)扩展到/dev/sda1 分区上。
  7. #即,如果a.qcow2 原磁盘大小是50G ,执行完命令后b.qcow2 除了是a.qcow2 的完整拷贝外,b.qcow2中的/deb/sda磁盘大小为60G,其中/dev/sda1 分区 比a.qcow2 中/dev/sda1 多了10G.

扩展磁盘,不分配到指定分区,进入系统后再分配

  1. qemu-img resize a.qcow2 +5G
  2. virsh destroy vm
  3. virsh start vm
  4. ## enter vm
  5. fdisk -l | grep sda (/dev/sda 磁盘大小增加了5g, 但是分区 /dev/sda1 未拿到这些空间)
  6. parted /dev/sda (将磁盘的未分配空间,分配给分区sda1
  7. (parted) p
  8. (parted) resizepart 1
  9. (parted) quit
  10. ## 执行log 如下:
  11. root@CASA-MOBILE:~# parted /dev/sda
  12. (parted) p <== remember space of all disk /dev/sda ,and remember the Number of sda1
? 分区 ?    2020-07-20 14:14:45    729    0    0

在使用diskimage-builder生成qcow2 镜像时,磁盘空间足够,但是执行到中间时会报
No space left
用df -h 查看时,/目录下的空间足够。
于是再执行,在执行过程中发现,diskimage-builder在执行过程解包和拷贝过程是会将一个/tmp/dib_build.xxxxxx的临时目录挂载在tmpfs上,而当前系统的tmpfs 只有3.9G 。

  1. root@vm1:~# df -h| grep tmpfs
  2. tmpfs 797M 3.3M 793M 1% /run
  3. tmpfs 3.9G 0 3.9G 0% /dev/shm
  4. tmpfs 5.0M 0 5.0M 0% /run/lock
  5. tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
  6. tmpfs 797M 0 797M 0% /run/user/0
  7. tmpfs 3.9G 3.8G 154M 97% /tmp/dib_build.whmZyNdv
  8. tmpfs 3.9G 0 3.9G 0% /tmp/dib_image.6Jdr8dSL

解决:

了解tmpfs是在哪里分配及分配规则:

https://wiki.archlinux.org/index.php/Tmpfs

tmpfs is a temporary filesystem that resides in memory and/or swap
partition(s). Mounting directories as tmpfs can be

2020-07-20 13:43:32    690    1    0

普通场景:

在ubuntu系统上,安装一系列依赖,及打包工具diskimage-builder, 然后在其上执行包含
disk-image-create 命令的脚本,生成qcow2/vmdk镜像。

容器内无差别构建:

每个人想拥有自己的构建环境 ,都需要另外在自己的系统上安装所需要的软件列表,会存在系统版本和软件版本不一的情况。

将其上环境构建成固定的dokcer 镜像, 每个人不管自己的设备是redhat, centos, ubuntu,都可以使用可控版本的打包容器进行构建,并且使用的软件版本是一致的。使用的镜像基于基础系统另装了哪些工具,都是可追溯可控版的。

Dockerfile

将需要定义的变量,需要预装的软件,都写进dockerfile

  1. FROM ubuntu:bionic AS DIB-env
  2. COPY sources.list /etc/apt/
  3. RUN apt-get update
  4. RUN apt-get install -y python-pip
  5. RUN apt-get install -y qemu-utils
  6. RUN apt-get install -y sudo
  7. RUN apt-get install -y curl
  8. RUN apt-get install -y squashfs-tools
  9. # Install python packages
  10. RUN pip install --upgrade pip
  11. RUN pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  12. RUN pip install diskimage-builder -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  13. ENV TEMP_PATH=/vob_temp
  14. RUN mkdir -p ${TEMP_PATH}
  15. COPY temp.tar.gz ${TEMP_PATH}
  16. WORKDIR ${TEMP_PATH}
  17. RUN tar zxvf temp.tar.gz
  18. RUN r
? python ? ? docker ?    2020-07-14 15:38:22    1213    0    0


Dockerfile 里的 pip install 总是failed .但是直接执行可以成功。
估计是docker build 时默认使用的pip 源有太慢导致

Dockerfile 里涉及的报错语句

  1. RUN pip install networkx

报错如下

  1. Step 9/15 : RUN pip install networkx
  2. ---> Running in 3a3f19067b2f
  3. Collecting networkx
  4. Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed ox/
  5. Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed ox/
  6. Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed ox/
  7. Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutErr
2020-06-16 14:14:15    373    1    0

Go 语言特性

  • 自动垃圾回收机制

    • 跟踪记录内存分配,阶段性地回收无任何人使用的内存。
    • 无需delete 关键字和free()方法
    • 系统自动判断,在合适的时候 如cpu空闲的时候进行垃圾回收,降低回收导致的损耗
  • 丰富的内置类型

    • 经典 整型 浮点型 数组 字符串
    • 字典类型 map
    • 数组切片slice
  • 函数多返回值

    • 在go之前其他语言除了python 之外基本不支持多返回值
    • 其他语言需要多返回值时,多定义一个结构体用于返回
    • fn, mn, ln, nn := getName()
    • , , lastName, _ := getName() 避免声明不必要的变量
  • 错误处理

    • defer、panic和recover
  • 匿名函数和闭包

  • 类型和接口

    • 不支持继承和重载
    • 接口和类型可以直接转换,甚至接口的定义都不用在类型定义之前,这种比较松散的对应关系可以大幅降低因为接口调整而导致的大量代码调整工作。
  1. #我们在实现Bird类型时完全没有任何IFly的信息。我们可以在另外一个地方定义这个IFly
  2. 接口:
  3. type IFly interface {
  4. Fly()
  5. }
  6. #这两者目前看起来完全没有关系,现在看看我们如何使用它们:
  7. func main() {
  8. var fly IFly = new(Bird)
  9. fly.Fly()
  10. }
  • 并发编程

    • goroutine
    • 通过使用goroutine而不是裸用操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。通过在函数调用前使用关键字go,我们即可让该函数以goroutine方式执行。goroutine是一种比线程更加轻盈、更省资源的协程。Go语言通过系统的线程来多路派遣这些函数的执行,使得每个用go关键字执行的函数可以运行成为一个单位协程。
    • CSP/channel
    • 在CSP模型中,一个并发系统由若干并行运行的顺序进程组成,每个进程不能对其他进程的变量赋值。进程之间只能通过一对通信原语实现协作。Go语言用channel(通道)这个概念来轻巧地实现了CSP模型。channel的使用方式比较接近Unix系统中的管道(pipe)概念,可以方便地
2020-06-10 10:57:10    785    0    0

平时的配置管理概念默认是指都是指源代码的版本管理,这一章整理一些系统环境的配置管理

整理中。。。。。

saltstack

https://docs.saltstack.com/en/latest/

SaltStack是一种革命性的基础设施管理方法,它以速度取代了复杂性。SaltStack非常简单,可以在几分钟内运行,可扩展程度足以管理数万台服务器,速度足以在几秒钟内与每个系统通信。

Salt Master

Salt Master 上安装了中心管理系统,配置和指令是由master 发往minions 的

Salt minion

Salt minion 被管理系统上安装着Salt minion ,由Salt minion 接收来自master 的指令

Execution Modules 执行模块

从命令行对一个或多个受管理系统执行的临时命令。适用于:

  1. 实时监控、状态和库存
  2. 一次性命令和脚本
  3. 部署关键更新
Formulas (States)

系统配置的声明式或命令式表示。

Grains(系统变量)

(系统变量)。粒度是关于底层托管系统的静态信息,包括操作系统、内存和许多其他系统属性。还可以为任何系统定义自定义粒度。

Pillar (用户定义的变量)

用户定义的变量。这些安全变量被定义并存储在Salt主服务器上,然后使用目标将其“分配”给一个或多个“仆从”。Salt pillar数据存储端口、文件路径、配置参数和密码等值。

Top File

将Formulas和Pillar数据与minion进行匹配

Runner

在Salt Master上执行支持任务的模块。Salt runner报告作业状态、连接状态、从外部api读取数据、查询连接的Salt minions等等。
例如,Orchestrate runner协调跨许多系统的配置部署

Returnne
? accurev ?    2020-06-08 14:03:25    671    0    0

Accurev workspace 有一个include/exclude 功能,可以在workspace 中增加规则,使workspace 只看到,只更新想关注的列表。
对于被排除在外的元素,不可见,不更新,不会提交,不影响


title

workspace Exploer

切换到workspace exploer
title

Include/Exclude View

在workspace 左侧导栏 下方,勾选 include/exclude view 右击文件视图上方会出现 include.exclude 功能的按扭
title

根据需要设置需要的视图效果

Include : 包含在视图
Include Directry Only : 只包含目录,不包含目录下的文件
Exclude : 排除在外
一个元素上只能有一种规则
顶部元素没有设置rule的,按默认显示

设置之后右侧视图上方展示workspace 的元素,下方展示元素上被设置的规则


例子

/gua/gua2/test1.txt
/hua/hua2/test2.txt
/hua/hua2/test1.txt
/dua/dua2/test/test3.txt

设置一个workspace ,使之更新时将/dua目录及目录下的文件排除在外,即workspace视图 对stream 的dua 目录不可见

  1. /dua :exclude

设置一个workspace ,使之更新时只会更新到/hua/hua2/test2.txt,对此文件外的其他文件及目录不可见。

  1. /dua :exclude
  2. /gua :exclude
  3. /hua :include directory only
  4. /hua/hua2 :include directory only
  5. /hua/hua2/test2.txt :include

Accurev 其他相关笔记
安装时报错:
http://blog.leanote.com/post/gua_l

? accurev ?    2020-05-15 15:11:26    564    1    0

Accurev GUI 里新建 stream 的界面有三个元素:

Stream Name: 自定义名称
Basis: 爸爸stream
Stream Type : stream 类型
Base Time : 基准时间


GUI 创建入口

新建 :Base stream 上右击菜单,new stream
修改 :在建成的stream 上右击菜单是,change stream
一般情况下我们新建的都是 Dynamic Stream ,图标是波浪线或时钟。


类型和时间

title


Dynamic Stream : 类型

这种类型的stream 的图标有两种,一种是三条波浪线,一种是时钟
两种情况可以互相转换,通过把basetime 从None 和 其他三种时间的切换实现

波浪线 :(none)

title
波浪线表示可以本流是实时同步父流同步的提交的,实时接收父流的修改,即两流从上而下的关系是畅通的意思, New stream 的页面,Based time里选 None , 即上下游之间无关时间闸门阻隔。

时钟 : ( now / transaction / special time )

title
时钟表示这个动态流上打上了一个时间闸门,即以basetime 里设置的时间作为一个时间节点,这个时间节点以后,在父流提交的东西,不会往下流到本流。
New stream 的页面,Based time 的 Now , Transaction # , specail time 三个选项都可以设置时间闸门。

now

会以创建时间为准,保存时,将当前时间转换成一个具体的时间戳。创建成功后再查看时间,是当时的now. 不同时间点now 都有不同含义。常用于需要最新修改,但是不要以后的修改流下来的情况

As transaction

在base stream 的history 里,每一条promote 都有一个对应的transaction ID , 这背后也是对应着的一个时间戳,可以在该base time 的histroy 里选一条提交的transaction ID ,或者选全局的一个trans

2020-04-28 15:32:23    908    0    0

系统:ubuntu

软件:dnsmasq

安装:

  1. apt-get install -y dnsmasq

配置 /etc/dnsmasq.conf:

  1. root@node248:/etc/resolvconf/resolv.conf.d# cat /etc/dnsmasq.conf | grep -v "^#|^$"
  2. port=53
  3. resolv-file=/etc/resolv.conf
  4. strict-order
  5. listen-address=172.0.11.248
  6. addn-hosts=/etc/hosts

配置 /etc/hosts

  1. root@node248:/etc/resolvconf/resolv.conf.d# cat /etc/hosts
  2. #.....
  3. 172.0.11.2 vm2
  4. 172.0.11.3 vm3
  5. 172.0.11.4 vm4.com

配置 上游 nameserver

  1. 使用服务器本身的dns 列表,则resolv-file=/etc/resolv.conf

  2. 使用服务器上另外的dns 列表文件,即上游dns,则resolv-file=/etc/dnsmasq.d/ 此目录下放置 *conf

重启服务:

  1. #14
  2. service dnsmasq restart
  3. #18
  4. systemctl restart dnsmasq

解析过程:

客户端将此服务器ip 设置为dns 之后,查找域名时,会通过服务器的/etc/hosts 去解析域名,然后再通过resolv-file 中列的dns 去解析。

附不同ubuntu系统dns-nameserver的设置:

UBUNTU 14

  1. root@vm1:/etc/dnsmasq.d# cat /etc/resolvconf/resolv.conf.d/base
  2. nameserver 172.0.11.248
  3. root@vm1:/etc/dnsmasq.d# cat /etc/resolv.conf
  4. # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
  5. #
? k8s ?    2020-04-14 10:54:42    873    0    0


fluxCD

https://fluxcd.io/
The GitOps operator for Kubernetes


填补了构建和监控之间的空白 ,持续监控git库中的yaml和 registry的镜像

It fills the automation void that exists between building and monitoring.
Automated git->cluster synchronisation


配置存储库的同步

Flux的主要特性是版本控制存储库和集群之间的自动同步。如果对存储库进行任何更改,这些更改将自动部署到集群中。

所有配置都存储在版本控制中,并且本质上是最新的。在任何时候,任何人都可以完全以完全相同的配置状态重新创建集群。
对集群的更改对所有相关方都是立即可见的。
在事后分析期间,git日志为审计提供了完美的历史记录。
端到端,代码到生产管道不仅变得可能,而且容易。


配置容器的自动部署

另一个特性是容器的自动部署。它将持续监控一系列容器注册中心,并在适用的地方部署新版本。
这对于使存储库和集群保持最新非常有用。它允许单独的团队拥有自己的部署管道,因为Flux能够看到新映像并相应地更新集群。
可以禁用此功能,并将图像锁定到特定的版本。


集成其他配置工具,内置支持Kustomize和Helm

对于跨环境和集群的配置自定义,Flux提供了对Kustomize和Helm的内置支持。
对于高级部署模式,如Canary版本、A/B测试和蓝/绿部署,Flux可以和Flagger一起使用。


要求和局限性:

Requirements and limitations

  1. 目前一次只能处理一个库,技术限制,不会是永久问题
  2. 会忽略 heml/chart ,文件夹包含Chart.yaml and values.yaml 就会被跳过。
  3. 只能处理yaml 文件,会递归目录中的yaml 文件,不会解析文件夹结构意义
  4. 由于Flux在集群中的一个容器中运行,所以它可能无法解析您或Kubernetes能够解析的所有主机名。特别是,它将无法在localhost上提供
4/12