? svn ?    2020-09-02 11:00:59    861    0    0
  1. 点击TortoiseSVN 右击菜单的properties

title

  1. 在properties 窗口右下“NEW” 点开,选择others
    title

  2. 在弹出的窗口的property name 项上,选择:tsvn:logtemplate
    title

  3. 保存后,重新commit 一个修改的文件 ,提交窗口会出现刚才设置的log 格式。

2020-09-02 10:04:38    717    1    0

列表本目录所占空间

  1. du -sh ./

列表子目录所占空间

  1. du -sh ./*

列表子目录所占空间达到不足1M的

  1. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[K]"

列表子目录所占空间达到1M 以上

  1. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[M,G]"

列表子目录所占空间达到1G 以上

  1. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[G]"

每个级别的列表再按第一列数值排序

  1. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[K]"| sort -n
  2. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[M]"| sort -n
  3. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[G]"| sort -n

在排了序基础上再取最大10 个

  1. du -sh ./* | grep "^[0-9]\{1,\}.\{0,1\}[0-9]\{1,\}[G]" | sort -n | tail -n 10

2020-08-19 15:45:50    897    0    0
  1. # <file system> <mount point> <type> <options> <dump> <pass>

以下是官方对fstab 里六个字段用法的解释

The first field (fs_spec).

  1. For ordinary mounts, it will hold (a link to) a block special device node (as created by mknod(2)) for the device to be mounted, like /dev/cdrom' or/dev/sdb7'.

  2. LABEL= < label > or UUID= < uuid >
    LABEL=< label> or UUID=< uuid> may be given instead of a device name. This is the recommended method, as device names are often a coincidence of hardware detection order, and can change when other disks are added or removed. For example, LABEL=Boot' orUUID=3e6be9de-8139-11d1-9106-a43f08d823a6'. (Use a filesystem-specific tool like e2label(8), xfs_admin(8), or fatlabel(8) to set LABELs on filesystems).
    第一个字段可以是分区名,或标签名,设备id, 用来标记这一行所表示 的文件系统所在的设备块

  1. root@vm1:/vob/GuaKing/DevOps# cat /etc/fstab
  2. # <file system> <mount point> <type> <options> <dum
? qcow2 ? ? 分区 ?    2020-08-13 15:04:24    1131    1    0

官方参考文档

diskimage-builder code
https://opendev.org/openstack/diskimage-builder

官方分区设置

https://docs.openstack.org/diskimage-builder/latest/user_guide/building_an_image.html

If you wish to customise the top-level block-device-default.yaml file
from one of the block-device-* elements, set the environment variable
DIB_BLOCK_DEVICE_CONFIG. This variable must hold YAML structured
configuration data or be a file:// URL reference to a on-disk
configuration file.


在自己自定义的element 的根目录下,创建一个文件block-device-default.yaml,将分区方案按yaml 文件格式配置其中,如果element 下方有一个block-device-default.yaml,则会优先使用用户定义的分区配置,如果用户无定制,则使用默认配置:
https://opendev.org/openstack/diskimage-builder/src/branch/master/diskimage_builder/elements/block-device-mbr/block-device-default.yaml

或使用变量DIB_BLOCK_DEVICE_CONFIG定义分区配置,将block-device-default.yaml的文本赋值给DIB_BLOCK_DEVICE_CONFIG

https://github.com/GuaKing/qcow2build.git

官方的一个默认配置:

磁盘全部容量分配r

? qcow2 ? ? 分区 ?    2020-08-13 13:39:52    1092    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    753    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    702    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    1274    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    405    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    809    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
4/12