标签归档:linux

INOTIFY – 监听事件

Linux 2.6.13 内核中引入了新的文件系统变化通知机制 inotify ,使用该特性提供的用户态调用 api ,可以方便的完成文件变化监听。

各种语言基本都提供了对该接口的调用方法: C 不必多说, Perl 使用 [Linux::Inotify2](https://metacpan.org/pod/Linux::Inotify2)Golang 使用 golang.org/x/sys/unixPython 则使用 [pyinotify](https://github.com/seb-m/pyinotify) 即可完成调用。

这里汇总所有相关监听事件,理论上针对所有语言通用:

 *            IN_ACCESS         文件被访问
 *            IN_ATTRIB         文件属性发生变化(文件元数据改变, 如权限, 链接计数, 扩展属性, 用户ID或组ID等)
 *            IN_CLOSE_WRITE      关闭以write方式打开的文件
 *            IN_CLOSE_NOWRITE  关闭以非write方式打开的文件
 *            IN_CREATE         在受监控目录内创建了文件/目录
 *            IN_DELETE         在受监控目录内删除了文件/目录
 *            IN_DELETE_SELF    被监测的文件/目录被删除
 *            IN_MODIFY         文件被修改
 *            IN_MOVE_SELF      移动受监测的文件或目录
 *            IN_MOVED_FROM     文件移出被监测的目录
 *            IN_MOVED_TO         文件移入被监测的目录
 *            IN_OPEN             文件被打开
 * --------- 上述flag的集合
 *            IN_ALL_EVENTS     以上所有flag的集合
 *            IN_MOVE             IN_MOVED_TO + IN_MOVED_FROM
 *            IN_CLOSE          IN_CLOSE_WRITE + IN_CLOSE_NOWRITE
 * --------- 不常用的flag
 *            IN_DONT_FOLLOW      不对符号链接解引用, 监控符号链接自身
 *            IN_MASK_ADD         将事件追加到pathname的当前监控掩码
 *            IN_ONESHOT          只监测一个事件, 事件发生后, 被监控项会从监控列表中消失
 *            IN_ONLYDIR          只监测目录
 *            IN_IGNORED          监控项被内核或应用程序移除
 *            IN_ISDIR          发生事件的是一个目录
 *            IN_Q_OVERFLOW     Event队列溢出
 *            IN_UNMOUNT          文件系统unmount

参考文献

Linux 下的文件锁

本文内容为 Linux 系统通用,各个语言实现可能稍有不同,但原理相同。

当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失。

例如进程1和进程2都要写入数据到a.txt中,进程1获取到了文件句柄,进程2也获取到了文件句柄,然后进程1写入一段数据,进程2写入一段数据,进程1关闭文件句柄,会将数据flush到文件中,进程2也关闭文件句柄,也将flush到文件中,于是进程1的数据被进程2保存的数据覆盖了。

所以,多进程修改同一文件的时候,需要协调每个进程:

  • 保证文件在同一时间只能被一个进程修改,只有进程1修改完成之后,进程2才能获得修改权
  • 进程1获得了修改权,就不允许进程2去读取这个文件的数据,因为进程2可能读取出来的数据是进程1修改前的过期数据

这种协调方式可以通过文件锁来实现。

文件锁分类

文件锁分两种,

  • 独占锁(写锁)
  • 共享锁(读锁)

当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。

独占锁和独占锁、独占锁和共享锁都是互斥的。

只要进程1持有了独占锁,进程2想要申请独占锁或共享锁都将失败(阻塞),也就保证了这一时刻只有进程1能修改文件,只有当进程1释放了独占锁,进程2才能继续申请到独占锁或共享锁。

但是共享锁和共享锁是可以共存的,这代表的是两个进程都只是要去读取数据,并不互相冲突。

文件锁:flock 和 lockf

Linux上的文件锁类型主要有两种:flock和lockf。后者是fcntl系统调用的一个封装。它们之间有些区别:

  • flock来自BSD,而fcntl或lockf来自POSIX,所以lockf或fcntl实现的锁也称为POSIX锁
  • flock只能对整个文件加锁,而fcntl或lockf可以对文件中的部分加锁,即粒度更细的记录锁
  • flock的锁是劝告锁,lockf或fcntl可以实现强制锁。所谓劝告锁,是指只有多进程双方都遵纪守法地使用flock锁才有意义,某进程使用flock,但另一进程不使用flock,则flock锁对另一进程完全无限制
  • flock锁是附加在(关联在)文件描述符上的(见下文更深入的描述),而lockf是关联在文件实体上的。本文后面将详细分析flock锁在文件描述符上的现象

参考文献

Linux 下新硬盘分区、格式化、挂载全流程

互联网上搜索到的 Linux 环境新磁盘配置方法资料质量都不尽如人意,因此自己整理了一份,日常 Linux 磁盘分区时查阅足够了,主要是用到了 fdisk 命令。

fdisk 基本使用

新增硬盘后,在linux系统下输入 fdisk -l 命令查看当前磁盘信息:

$ sudo fdisk -l                                                         
...
Disk /dev/ram0: 4.8 GiB, 5120000000 bytes, 10000000 sectors                                   
Units: sectors of 1 * 512 = 512 bytes                                                         
Sector size (logical/physical): 512 bytes / 8192 bytes                                        
I/O size (minimum/optimal): 8192 bytes / 8192 bytes
...
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors                               
Disk model: ST500DM002-1BD14                                                                  
Units: sectors of 1 * 512 = 512 bytes                                                         
Sector size (logical/physical): 512 bytes / 4096 bytes                                        
I/O size (minimum/optimal): 4096 bytes / 4096 bytes                                          
Disklabel type: gpt
Disk identifier: C16B3C7C-2596-448D-A4BA-4A7554CD734A                                        

Device     Start       End   Sectors   Size Type                                             
/dev/sda1   2048 976773119 976771072 465.8G Linux filesystem                                 
...

Disk /dev/sdc: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: ST4000NM000A-2HZ
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...

注意看最下面多了一块 3.7TB 的硬盘 sdc ,下面用命令: fdisk /dev/sdc 给新硬盘进行分区:

$ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

The old LVM2_member signature will be removed by a write command.

Device does not contain a recognized partition table.
The size of this disk is 3.7 TiB (4000787030016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

Created a new DOS disklabel with disk identifier 0xe461c452.

Command (m for help):

进入 fdisk 命令,输入 m 可以看到该命令的帮助:

Command (m for help): m                                                              

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label                                                                         
   g   create a new empty GPT partition table                                                
   G   create a new empty SGI (IRIX) partition table                                         
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table

创建分区表

进行分区前需要先明确采用分区表的格式,目前主流的有 MBR 和 GPT ,二者的区别可以自行搜索,总结两点:

  • MBR 兼容性较好,兼容所有windows,但单盘最大 2TB ;
  • GPT 是一种新格式,最大支持18EB的大容量,但并不是所有的windows都支持。

知道上面两点就够了,这里我使用在 Linux 服务器上,不需要考虑 windows 兼容性,此外是一块 4T 盘,因此采用 GPT 进行分区,下面两种方式请根据自己的需要选择。

采用GUID(GPT)分区结构

如果使用 GPT 则输入 g 创建一张新的空 GPT 格式分区表。

ommand (m for help): g
Created a new GPT disklabel (GUID: D53735F6-8E14-504D-BDA5-89DB97A770DF).                    
The old LVM2_member signature will be removed by a write command.

之后输入 n 进行分区,

Command (m for help): n

选择分区表编号,根据提示目前最多可以创建128个分区,保持默认即可:

Partition number (1-128, default 1):

之后选择该分区的起始磁盘数,这里可自定义也可不做选择,如无特殊需求强烈建议选择默认:

First sector (2048-7814037134, default 2048):

接下来是定义该分区的大小,默认使用整个,直接回车:

Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7814037134, default 7814037134):         

创建成功:

Created a new partition 1 of type 'Linux filesystem' and of size 3.7 TiB.

最后记得 w 将分区表写入硬盘。

采用DOS(MBR)分区结构

如果使用 MBR 则输入 o 创建一张新的空 MBR 格式分区表:

Command (m for help): o
The size of this disk is 3.7 TiB (4000787030016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

Created a new DOS disklabel with disk identifier 0xe3e2291c.
The old LVM2_member signature will be removed by a write command.

输入 n 进行分区:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)

一块物理硬盘只能有: 一到四个主分区(但其中只能有一个是活动的主分区),或一到三个主分区,和一个扩展分区。分别对应hda1,hda2,hda3,hda4. Linux 中规定,每一个硬盘设备最多能有 4 个主分区(其中包含扩展分区)构成,任何一个扩展分区都要占用一个主分区号码,也就是在一个硬盘中,主分区和扩展分区一共最多是 4 个。 —— 《Linux主分区,扩展分区,逻辑分区的联系和区别

总接下来就是一块物理硬盘至少有一个主分区,在这里我只需要一个分区,因此下面将这块硬盘全部划为主分区:

Select (default p): p

之后选择该主分区为第几个主分区,由于是新盘,这里输入1来分第一个主分区:

Partition number (1-4, default 1): 1

之后选择该分区的起始磁盘数,这里可自定义也可不做选择,如无特殊需求强烈建议选择默认:

First sector (2048-4294967295, default 2048):

接下来是定义该分区的大小,如果按默认(按回车)即是使用全部可用存储额,也可以是用 Mm 单位结尾的数字(大写M是大B的意思,如果输入1M实际上是X8也就是8m的空间),这里我保持默认:

Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4294967294, default 4294967294): 

Created a new partition 1 of type 'Linux' and of size 2 TiB.

可以看到即使硬盘是 4TB,采用 MBR 后只能使用其中的 2TB 空间,其他的就浪费了。

最后记得 w 将分区表写入硬盘。

后续操作(重要)

完成分区后,记得输入 w 写入分区:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

写入分区表成功后会退出 fdisk 交互界面。

再看一眼磁盘信息:

$ sudo fdisk -l
...
Disk /dev/sdc: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: ST4000NM000A-2HZ
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 74A6DB69-8C91-654F-9F61-A9F38D7F2A34

Device     Start        End    Sectors  Size Type
/dev/sdc1   2048 7814037134 7814035087  3.7T Linux filesystem
...

没问题后进行格式化,如果没有特殊需求就采用 ext4

第四代扩展文件系统(英语:Fourth extended filesystem,缩写为ext4)是Linux系统下的日志文件系统,是ext3文件系统的后继版本 —— ext4 By Wikipedia

$ sudo mkfs.ext4 /dev/sdc1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 976754384 4k blocks and 244195328 inodes
Filesystem UUID: 87746749-1922-4682-9b4e-3a67be1d9498
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

磁盘挂载

之后将磁盘挂载到需要的位置,一般会选择挂载在 /mnt ,我在这里由于涉及到多用户,将硬盘挂载我用户目录下的一个文件夹下:

sudo mount /dev/sdc1 /home/songtianlun/data

直接挂载,重启后配置会丢失,可以修改 /etc/fstab 配置文件配置开机自动挂载,该配置文件的格式如下:

$ cat /etc/fstab 
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda7 during installation
UUID=4ae9f128-7cee-48fd-998c-4257e394fa4a /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=A5EB-573A  /boot/efi       vfat    umask=0077      0       1
/swapfile                                 none            swap    sw              0       0

# /dev/sda1
/dev/sda1    /    ext4  rw,relatime 0   1
UUID=4ae9f128-7cee-48fd-998c-4257e394fa4a /               ext4    errors=remount-ro 0       1

格式大概是这样的:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# 要挂载的分区设备号 挂载点 文件系统类型  挂载选项    是否备份    是否检测

如果需要设备号,可以使用 blkid 命令获取:

$ blkid
/dev/sda1: UUID="e943af1e-72cf-4b72-b444-859b9610256f" TYPE="ext4" PARTUUID="161a8c3f-871d-45f6-a25f-466bf16f6035"

实测下面这两种都是可以挂载的:

UUID=4ae9f128-7cee-48fd-998c-4257e394fa4a /               ext4    errors=remount-ro     0       1
/dev/sda1       /               ext4            rw,relatime     0       1

写好配置后可以使用该命令生效(挂载 /etc/fstab 中所有档案):

mount -a

下次重启设备就不需要再手动挂载该磁盘了。

磁盘状态

使用 lsblk 看一下当前硬盘的树形结构:

$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
└─sda1   8:1    0 465.8G  0 part /
sdc      8:32   0   3.7T  0 disk 
└─sdc1   8:33   0   3.7T  0 part /home/songtianlun/data

使用 df-h 看看使用率:

$ df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda1       459G  8.6G  427G    2% /
...
/dev/sdc1       3.6T   89M  3.4T    1% /home/songtianlun/data

参考文献

Linux 解决远程连接的“Gtk-WARNING **: cannot open display;”

问题重现

在使用 libvirt 管理虚拟机时,有时会用到 virt-manager 提供的图形界面管理虚拟机,查看 vnc 输出等,但是常常会得到如下错误:

(virt-manager:25381): Gtk-WARNING **: 08:55:23.876: cannot open display:

Linux 解决

如果是在 Linux 桌面环境,解决方法很简单,只需要这样连接远程服务器就可以了:

ssh -Y username@ip

使用 -Y 参数实际上是授权了 X11 转发,这样就可以看到来自远端的 gtk 图形窗口了。

$ man ssh
...
-Y      Enables trusted X11 forwarding.  Trusted X11 forwardings are not subjected to the X11 SECURITY extension controls.
...

如果您的操作系统设置为中文,远端连接过来也会继承这一配置,这时如果远端没有安装中文字库,就会出现乱码:

https://imagehost-cdn.frytea.com/images/2021/11/05/image07addd92aee33b37.png

解决方法也很简单,只需使用以下命令,临时将远端服务器的语言配置为英文即可:

export LANG=en_US

再次打开窗口发现一切正常:

https://imagehost-cdn.frytea.com/images/2021/11/05/2021-11-05-09-05-44df1374621cb605b6.png

Windows 解决

在 Windows 下不是每一个终端模拟器都支持 x11 转发,使用 MobaXterm 直接可以连接,也可以使用 Xming 连接即可。

参考文献

Tmux 使用笔记

Tmux 是一个终端复用器(terminal multiplexer),用起来就离不开。网上有很多 Tmux 使用指南,但是用下来发现还是自己整理一遍才能真正的记住,于是有了这篇文章,本文意在整理 tmux 最常用操作,详细的操作指南请移步 「tmux(1) manual page」。

基本概念

tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务器,此时将 新建一个会话(session),会话中默认新建一个窗口(window),窗口中默认新建一个面板 (pane)

  • 一个 tmux session 可以包含多个 windowwindow 默认充满 session
  • 一个 window 又可以包含多个 pane ,且都处于同一界面下。

常用操作

以下按照 Ctrl 和 Alt 的简写记录,周知。 C -> Ctrl A -> Alt

  • 新建和断开
tmux               # 新建一个无名称的会话
tmux new -s demo   # 新建一个名称为demo的会话
tmux detach        # 断开当前会话,会话在后台运行

tmux a             # 默认进入第一个会话
tmux a -t <>       # 进入之前的会话

tmux kill-session -t demo # 关闭demo会话
tmux ls                   # 查看所有会话

C-b d    # 断开当前会话
C-b C-Z  # 挂起当前会话

C-b c    # 新建 window
C-b &    # 关闭当前窗口(关闭前需输入y or n确认)

C-b "    # 下侧新建面板
C-b %    # 右侧新建面板
C-b x    # 关闭当前面板(关闭前需输入y or n确认)
  • 切换会话
C-b 0~9  # 切换到指定 window
C-b p    # 切换到上一 window
C-b n    # 切换到下一 window
C-b f    # 快速定位到 window(输入关键字匹配窗口名称)

C-b s    # 显示 session 列表,用于选择并切换
C-b w    # 显示 windows 列表,用于且切换窗口
C-b q    # 显示 pane 编号,在编号消失前输入对应的数字可切换面板

C-b ←↑→↓ # 移动光标切换 pane
C-b ;    # 切换到上一 pane
C-b o    # 切换到下一 pane
  • 调整布局
C-b !          # 将当前 pane 拆分为一个独立 window
C-b z          # 最大化当前面板,重复一次恢复正常(v1.8版本新增)
C-b {          # 向前置换当前面板
C-b }          # 向后置换当前面板
C-b C-o        # 顺时针旋转当前窗口中的所有面板
C-b A-o        # 逆时针旋转当前窗口中的所有面板
C-b space      # 在自带的面板布局中循环切换
C-b A + ←↑→↓   # 以5个单元格为单位调整当前面板边缘
C-b C + ←↑→↓   # 以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖)

参考文献

基于 Ubuntu 平台安装 OS X 10.15 虚拟机

OS X 系统启动时会识别计算机主板,针对非苹果电脑拒绝启动,就算是虚拟机,也有天然的限制不可以随便安装 OS X 虚拟机,本文就介绍了在 Ubuntu 平台上使用 VMware Workstation 安装 OS X 10.15

资源清单

  • VMware Workstation Pro
  • Unlock
  • OS X 10.15 CDR镜像

本教程资源来源:

简单流程

第一步:安装 Vmware 并 使用 Unlock 破解 OS X 系统安装限制。

第二步:新建虚拟机,选择准备好的 *.cdr 系统镜像,选择 Apple OS X 10.15

第三步:安装系统

2020-01-30-20-05-22-16f67f7f0f139bec.png

注:进入 mac实用工具 后先进入磁盘工具,将刚刚分配好的虚拟磁盘抹掉格式化,结束后退出磁盘工具,再进入mac安装。其他步骤就很日常啦,有问题敬请留言!

详细步骤请参考:如何在Windows上VMware上安装macOS Catalina 10.15

2020-01-30-21-18-17-2c3f9246d05ac691.png

安装 VMware tools

安装 VMware tools 时可能会遇到一个问题:无法在更新服务器上找到组件。请联系 VMware 技术支持或您的系统管理员。

在此通过手动安装的方式获得 工具并安装到虚拟机中。

首先资源:在这里找最新版本的MacOSvmtool : <https://softwareupdate.vmware.com/cds/vmw-desktop/fusion/ >

安装方法很简单,解压工具找到 drawin.iso使用 CD/DVD 的方式挂载进去安装即可!

详细步骤可参考:Windows下VMmare黑苹果macOS Catalina 10.15虚拟机安装VMware tools工具

参考文献

Linux 使用 DNSMasq 自建 DNS 服务器

DNS(Domain Name System) 是一个为计算机、服务器或其他任何需要接入互联网或私有网络提供分级域名分发系统(hierarchical and decentralized naming system)。

在内网中又一台服务器提供服务,为了使用使其可以在公共网络中访问到需要为它分配 ip 或者使用端口转发、内网穿透等,但绑定域名后域名解析到公网ip,如果在内网访问的话就写多此一举。因此在内网自建一台 DNS 服务器,使其优先级高于公网域名解析服务器,进而实现内网访问解析为内网 ip 且不影响外网访问的目的。

DNSMasq 主要用来解决内网 DNS 域名缓存、DHCP、网络启动和路由通告功能,本文目的是将 DNSMasq 作为内网 DNS 使用。

  1. 安装 DNSMasq
# Ubuntu/Debian
$ sudo apt update
$ sudo apt install -y dnsmasq

# Centos
$ yum install dnsmasq -y 
$ service dnsmasq start
  1. 修改配置

$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
$ sudo vim /etc/dnsmasq.conf
....
resolv-file=/etc/resolv.conf
strict-order
listen-address=<host-ip>
addn-hosts=/etc/hosts.dnsmasq

修改内容解释:

  • resolv-file:从文件读取 DNSMasq 上游的 DNS 服务器配置。
  • strict-order:resolv-file 文件中如果指定了多个 DNS 服务器,严格安装 DNS 服务器的先后顺序查询域名。
  • listen-address:监听地址,如果你不想所有用户都使用你的DNS服务,可以在listen-address后面加上你指定的IP地址即可。
  • addn-hosts:从文件读取本地 DNS 域名和 IP 的对应关系,格式为 。其实可以把 IP 和域名的对应关系写在 /etc/hosts 文件中,DNSMasq 默认从那里读取,但如果要支持一个域名对应多个 IP,就必须使用 addn-hosts 选项了。

/etc/hosts.dnsmasq 文件内容如下:

$ cat /etc/hosts.dnsmasq
10.0.0.1 blackpiglet.com
10.0.0.2 blackpiglet.com
10.0.0.3 blackpiglet.com

修改完成后重启 DNSMasq

$ sudo systemctl restart dnsmasq.service
  1. 配置Dnsmasq上游DNS服务器

DNSMasq 是从 /etc/resolv.conf 文件中读取上游 DNS 服务器, 编辑 /etc/resolv.conf ,参考如下:

nameserver 223.5.5.5
nameserver 223.4.4.4
  1. 启动Dnsmasq并加入启动项(Centos)
chkconfig dnsmasq on
/etc/init.d/dnsmasq restart
  1. 使用

在需要内网解析的服务器上修改网络设置中的DNS服务器即可。

参考文献

KVM虚拟机安装 GitLab EE

GitLab 是一个基于网页的软件开发生命周期管理工具,提供了 git 代码仓库、知识库、问题追踪、CI/CD 流水线功能,使用开源许可证,由 GitLab 公司开发(来自 WikiPedia)。

自建 GitLab 服务器基于以下原因:

  1. GitHub 到国内的访问速度实在堪忧
  2. 随着某种关系的变化发展,作者并不指望这种状况有什么改善
  3. Git 仓库速度缓慢会拖慢开发效率
  4. GitHub Pages 的访问速度慢,托管在此的网页对于国内用户实在太不友好
  5. GitLab 提供的 CI/CD 流水线功能比较完善
  6. GitLab 的文档很全面,英文说明还不错,值得探索
  7. 借此机会提高英文

自建方法还是基于 KVM 虚拟化一台 Ubuntu 虚拟机,并由这台虚拟机提供服务,外网由宿主机反向代理到内网实现外网访问。本文记录基于此上描述的环境及日后遇到的解决方案,本文带有一个持续更新区。

虚拟化

  1. 创建虚拟磁盘

    qemu-img create -f qcow2 ubuntu_gitlab.qcow2 100G
  2. 新建虚拟机

    
    virt-install \
    --virt-type=kvm \
    --name=ubuntu_gitlab \
    --hvm \
    --vcpus=4 \
    --memory=6144 \
    --cdrom=/srv/kvm/iso/ubuntu-18.04.3-live-server-amd64.iso \
    --disk path=/srv/kvm/ubuntu_gitlab.qcow2,size=100,format=qcow2 \
    --network network=default \
    --graphics vnc,password=tianlun666,listen=::,port=5914 \
    --autostart \
    --force

3. 安装

在安装的过程中,为虚拟机配置网络如下:

 - statics ip : `192.168.122.4`
 - GatWay: `192.168.122.1`
 - name server: `192.168.122.1`
 - Subnet: `192.168.122.0/24`

## 安装 GitLab

GitLab 官方提供的[安装说明](https://about.gitlab.com/install/)很全面,本文提取其中关键步骤,具体安装请以官网文档为准。

1. 安装并配置相关依赖

$ sudo apt-get update $ sudo apt-get install -y curl openssh-server ca-certificates


[tip type="info" title="安装Postfix (选装)"]
GitLab 支持 Postfix, SMTP 等方式实现邮件通知,使用SMTP请跳过此步,如果需要安装Postfix邮件请执行以下的命令:

sudo apt-get install -y postfix

安装过程中可能会出现一个全屏显示窗口,此时选择'Internet Site'并回车,使用你服务器的外部 DNS 作为'mail name'并回车,不出意外的话安装会继续进行。
[/tip]

2. 添加 GitLab 软件源

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash


3. 运行 GitLab 安装

将代码中的网址替换为您为 GitLab 准备的地址,GitLab 会使用 Let's Encrypt 验证您的域名并自动为其配置 SSL。

sudo EXTERNAL_URL=”https://gitlab.example.com” apt-get install gitlab-ee


4. 设置默认 root 密码。

使用浏览器进入您上一步设置的地址,使用 `root` 账户登录,系统会提示您为其设置密码。

## 案例汇总(持续更新区)

### 为 GitLab 配置 SMTP 邮箱

1. 依次修改配置文件

vim /etc/gitlab/gitlab.rb

依次修改

gitlab_rails[‘smtp_enable’] = true gitlab_rails[‘smtp_address’] = “smtp.mxhichina.com” gitlab_rails[‘smtp_port’] = 25 gitlab_rails[‘smtp_user_name’] = “gitlab@yinnote.com” gitlab_rails[‘smtp_password’] = “xxxxxx” gitlab_rails[‘smtp_domain’] = “yinnote.com” gitlab_rails[‘smtp_authentication’] = “login” gitlab_rails[‘smtp_enable_starttls_auto’] = true gitlab_rails[‘smtp_tls’] = false

gitlab_rails[‘gitlab_email_from’] = “gitlab@yinnote.com” user[“git_user_email”] = “gitlab@yinnote.com”


2. 生效配置并重启 GitLab

$ gitlab-ctl reconfigure $ gitlab-ctl restart


3. 监听日志打印

如果出现问题,可以使用该命令在控制台监听日志。

$ gitlab-ctl tail


4. 可能用到的 VIM 命令

整页翻页 ctrl-f ctrl-b

f就是forword b就是backward

翻半页

ctrl-d ctlr-u d=down u=up

滚一行

ctrl-e ctrl-y

zz 让光标所在的行居屏幕中央 zt 让光标所在的行居屏幕最上一行 t=top zb 让光标所在的行居屏幕最下一行 b=bottom

查找

/string

向前(Forward)查找字符串string

按下回车后,光标就能跳到正确的地方


### 手动刷新 Let’s Encrypt 证书

sudo gitlab-ctl reconfigure sudo gitlab-ctl renew-le-certs



## 参考文献

 - [GitLab Installation](https://about.gitlab.com/install/)
 - [WikiPedia/GitLab](https://en.wikipedia.org/wiki/GitLab)
 - [VIM中的翻页命令](https://blog.csdn.net/nyist327/article/details/48625385)
 - [VIM 查找文本](https://blog.csdn.net/hitustc/article/details/5585101)
 - [GitLab邮件配置](https://www.jianshu.com/p/b91d2e676cba)
 - [Git:gitlab修改域名配置](https://blog.csdn.net/qq_36937234/article/details/89381857)
 - [SSL Configuration](https://docs.gitlab.com/omnibus/settings/ssl.html)
 - [使用SSL证书保护GitLab服务器的方法](https://ywnz.com/linuxyffq/3961.html)

自建网盘之 NextCloud 终极记录

自建过许多网盘,试过 可道云、Seafile、FileRun、Nextcloud,但Nextcloud的如下特性吸引了我:

  • 完整、好用的客户端,包括 windows、mac、android、ios …
  • 强大的插件扩展,如 Talk, Contacts, notes, Maps …
  • 完整的第三方扩展,支持 Amazie S3, OneDrive, DropBox, Google Drive, Ftp, WebDav …

以上种种吸引了我进行了无数次的配置、尝试、探索。我在 Centos, Debian, Ubuntu, Docker, Cpanel Virtual Hosting 上都尝试过配置 Nextcloud , 但最终发现,还是官方首推的 sudo snap install nextcloud 方式是最稳定的,此外的自建环境 (Linux + Nginx + Php + MySQL) 总是会出各种各样的兼容性、异常报错,而这些异常报错会在一些莫名其妙、意想不到的地方出现让人在一个莫名其妙的地方掉坑。

以上种种,我决定在服务器上 KVM 虚拟出来一个 Ubuntu 系统专门配置 Nextcloud 服务。会有人说有必要吗?在一台 VPS 就可以配置 LNMG/LAMP + CLoud Drive + Docker + Kubernates + node.js 等等环境。但在我踩过无数的坑之后,发现一切兼容的,都难以发挥其自身最大的力量

话不多说,本文主要记录 Nextcloud 配置在 KVM 虚拟化出的 Ubuntu 系统上,并持续更新后续各种基于此环境的操作。

虚拟机环境

  1. 创建虚拟磁盘
qemu-img create -f qcow2 ubuntu_nextcloud.qcow2 100G
  1. 创建 KVM 虚拟机

    virt-install \
    --virt-type=kvm \
    --name=ubuntu_nextcloud \
    --hvm \
    --vcpus=4 \
    --memory=4096 \
    --cdrom=/srv/kvm/iso/ubuntu-18.04.3-live-server-amd64.iso \
    --disk path=/srv/kvm/ubuntu_nextcloud.qcow2,size=400,format=qcow2 \
    --network network=default \
    --graphics vnc,password=kvm,listen=::,port=5913 \
    --autostart \
    --force
  2. VNC 装系统

通过 VNC viewer 连入宿主机 5913 端口输入密码,安装操作系统。

C4791477-DEA4-4F81-A7D7-6DDDE62863B3.png

  1. 端口转发

在宿主机使用 Frp, Iptables, NAT…等方式按照需求将虚拟机 80 端口转发出来,当然也可以不转发,这样子可以在内网的机器上使用内网 ip 直接访问到将来配置的 Nextcloud.

安装 nextcloud

A snap is a zip file containing an application together with its dependencies, and a description of how it should safely be run on your system, especially the different ways it should talk to other software. Most importantly snaps are designed to be secure, sandboxed, containerized applications isolated from the underlying system and from other applications.

To install the Nextcloud Snap Package, run the following command in a terminal:

sudo snap install nextcloud

此前已经说明在这里使用 snap 一键安装 Nextcloud ,除此之外还有 Web installer , zip, 等方式,可以直接将 nextcloud 安装在 自建好的 lnmp 环境上,但这种方式在此不再说明。

注:英文部分摘自官网说明。

Nextcloud 维护 (持续更新区)

在使用过程中会需要各种莫名其妙的问题,因此在这里记录基于以上配置方法及环境下遇到的问题。

snap 常用命令


#查看snap版本信息
snap --version
#找出所有snap应用
snap find
#安装应用
snap install 包名
#重启应用
snap restart 应用名
#升级应用
snap refresh 应用名
#查看安装的应用
snap list
#卸载应用
snap remove 应用名

Nextcloud 资源位置

  • 数据资源位置:/var/snap/nextcloud/common/nextcloud/data
  • 配置资源位置:/var/snap/nextcloud/current/nextcloud/config/config.php

调整 PHP 内存限制的方法

$ sudo snap set nextcloud php.memory-limit=512M

# To set it to be unlimited
$ sudo snap set nextcloud php.memory-limit=-1

调整最大处理时间的方法

$ sudo snap set nextcloud nextcloud.cron-interval=10m

# disable the cronjob completely
$ sudo snap set nextcloud nextcloud.cron-interval=-1

添加可信域的方法

# 查看可信域
$ sudo nextcloud.occ config:system:get trusted_domains

# 添加可信域,请调整 1 和 example.com, 计数从 ‘0’ 开始
$ sudo nextcloud.occ config:system:set trusted_domains 1 --value=example.com

关闭维护模式的方法

sudo nextcloud.occ maintenance:mode --off

IOS 配置 Calendar / Contacts

  1. 打开设置 settings application -> Select Mail, Contacts, Calendars -> Select Add Account Select Add CalDAV/CardDAV account.

  2. 填入服务器、账号、密码

For server, type example.com/remote.php/dav/principals/users/USERNAME/

  1. 成功 Select Next.

上传文件限制

根据文章 snap安装nextcloud详细配置 的说法:snap nextcloud的项目地址在https://github.com/nextcloud/nextcloud-snap,目前snap安装的nextcloud还不能调整和配置包内的php和apache2,但官方已经配置好的apache2和PHP 单文件16Gb的上传限制(实际好像不限制大小),一般来说应该不需要更改。

自签名证书 ssl

I copyied the cert files in /var/snap/nextcloud/current/certs/custom/ and then

sudo nextcloud.enable-https custom -s cert.pem privkey.pem chain.pem

也许会成功,来源 :Using your own SSL certs in snap

参考文献

Deepin(Linux)下实现Android投屏

Deepin(Linux)下实现Android投屏

最近需要演示自己的安卓开发作品,因此需要在自己的主力操作系统(Deepin)上实现安卓投屏,之后才好连接电脑在班级里演示。找寻一圈之后终于发现了开源的Linux端投屏神器Scrcpy. 因此在这里简单记录配置过程,方便后用。

项目源码:Scrcpy的GitHub

简单说明

Scripe支持桌面全平台。

It works on GNU/Linux, Windows and MacOS.

但是在这里主要记录下Linux下的Deepin系统配置。

继续阅读