VirtualBox 从物理硬盘启动

1. 基于一个物理硬盘设备,创建一个 virbualbox 的挂载盘

Linux

VBoxManage internalcommands createrawvmdk -filename "xxx.vmdk" -rawdisk /dev/sda

MacOS

VBoxManage internalcommands createrawvmdk -filename "xxx.vmdk" -rawdisk /dev/disk#

Windows

VBoxManage internalcommands createrawvmdk -filename "C:\Users\\VirtualBox VMs\\xxx.vmdk" -rawdisk \.\PhysicalDrive#

2. 创建 virtualbox 虚拟机,设置硬盘为刚刚创建的的挂载盘

使用 Virtual Box 的图形界面,根据物理硬盘中的系统创建虚拟机。到创建硬盘的步骤,点击选择现有虚拟机挂载盘,选择前面创建的 xxx.vmdk 文件

3. 开机测试

Read the rest

Install yaml plugin to logstash

In fact, the easiest way to install yaml filter plugin is to run:

sudo -u logstash ./bin/logstash-plugin install logstash-filter-yaml

But because of the network problem, I can’t connect to ruby-gems site, whether I use a proxy or not, the command always shows the warning below:

So I have to build the plugin by myself then install the plugin. If you meet with the same problem with me, you can following the instruction below.

Download the latest release from github: https://github.com/logstash-plugins/logstash-filter-yaml/releases

Copy the link of the zip file, download to your server… Read the rest

ubuntu 安装 cuda 支持 GTX 1080ti

安装显卡驱动

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt install nvidia-driver-418

安装后运行 nvidia-smi 可以检测是否安装成功。如果现实 Failed to initialize NVML: Driver/library version mismatch,可以尝试重启计算机。

安装 cuda

下载 cuda 安装包 https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64 。在其中选择 linux ubuntu 使用的版本,下载 .deb(local) 包。

选择安装包后,页面下方会显示安装指导,如:

如果运行 apt-get install cuda 时显示匹配的 nvidia 驱动版本不对,则需要安装指定版本的显卡驱动。… Read the rest

ubuntu 挂载 exfat 分区

在 ubuntu 挂载 exfat 分区时,会出现如下错误:

sudo mount /dev/sdd1 /mnt/u1                                                                                
mount: /mnt/u1: unknown filesystem type 'exfat'.

这时,需要运行以下命令,安装可以让 mount 程序识别 exfat 格式的程序:

sudo apt install exfat-fuse exfat-utils

Read the rest

privoxy 通过 sslocal 提供 http 代理

配置 sslocal 服务

安装 shadowsocks:sudo pip install shadowsocks。运行 shadowsocks 会常出现错误,这时候找到报错对的文件 openssl.py,按下述修复文件。

打开 site-packages/shadowsocks/crypto/openssl.py,将文件中的 cleanup 单词改成 reset。

创建服务脚本 /etc/systemd/system/sslocal.service,内容为:

[Unit]
Description=shadowsocks client

[Service]
Type=simple
User=root
Group=root
ExecStart=/opt/anaconda3/bin/sslocal -c /etc/shadowsocks/client.json
Restart=always
WorkingDirectory=/

[Install]
WantedBy=multi-user.target

运行 sudo systemctl start sslocal.service

配置 privoxy 服务

sudo apt install privoxy
echo 'forward-socks5
Read the rest

使用多进程加速 make 的编译过程

make 默认会以单进程执行 gcc 编译程序,但是编译的代码文件稍微多一些,编译的速度会很慢。如果运行的机器有多个 CPU 多个核,就可以借助多个进程同时编译来减小编译时间。

很简单,在 make 是,加上 -j10 的参数即可,其中 10 为编译进程数量,一般设置为 CPU 核数一样。

仅仅知道这些是不够的,对于一些没有直接运行 make 的场景,如 Dockerfile 在 build 过程中,调用了其它脚本,其中包含 make 命令,但是又不方便修改脚本,这时,可以在 Dockerfile 运行时,添加环境变量 MAKEFLAGS=-j10,在 make 时,就会自动加上 -j10 的参数了。

从 docker-compose.yml 传入环境变量到 Dockerfile 可以参考:

Read the rest

Squid 缓存相关配置和日志查看

在 ubuntu 18.04 中,squid 的配置文件默认位置为:/etc/squid/squid.conf,访问日志默认保存在 /var/log/squid/access.log

缓存配置

cache_dir aufs /var/spool/squid 100000 16 256
cache_mem 1024 MB
maximum_object_size_in_memory 2 MB
maximum_object_size 80 MB

cache_dir 后面的参数非常重要,其中 100000 说明可以分配硬盘上 100GB 的空间用于保存缓存。默认情况下只有 100MB,所以会发现之前的缓存没有生效,因为超出 100MB 后,会用 LRU 的策略清除缓存。

maximum_object_size 参数也比较重要,有时候文件没有缓存,是因为这个值太小了,导致稍微大一些的文件就没有被缓存,需要重新下载。

权限配置

squid 默认只限本地访问,如果需要其它机器访问,需要指定可访问的机器的 IP。首先,需要找到 http_access deny all 这一行,在这一行前面添加:

acl permittedips src 192.168.0.0/16
acl permittedips
Read the rest

docker compose 传入变量到 Dockerfile

使用 docker-compose 构建镜像时,在 Dockerfile 中,经常需要外部传入的参数决定如何运行。

这时,需要在 build 区块下层加入 args

version: '3'
services:
php:
build:
context: ./php
args:
MAKEFLAGS: -j20
http_proxy: http://192.168.0.125:3128
https_proxy: http://192.168.0.125:3128

同时,需要在 Dockerfile 的 FROM 下面加入,如:

FROM registry.docker-cn.com/library/php:7.3-fpm
ARG MAKEFLAGS
ARG http_proxy
ARG https_proxy
# RUN env # 非必要,但是可以用来确定传入的变量是否正确

args 在传入 Dockerfile,自动会加到后续脚本执行的环境变量中,可以用 RUN env 确认。

更多可以参考:https://docs.docker.com/compose/compose-file/#argsRead the rest

elasticsearch 查询格式整理

GET some_index/_search
{
	"query" : {
		"term": {
			"field_name": "value"
		},
		"terms": {
			"field_name": ["value1", "value2"]
		}
		"match": {
			"field_name": "value"
		},
		"multi_match": {
			"fields": ["field1", "field2"],
			"query": "value"
		},
		"match_all": {},
		"match_phrase": {
			"field_name": "搜索连续的字符串字符"
		},
		"match_phrase_prefix": {
			"field_name": "前缀"
		},
		"fuzzy": {
			"field_name": "xxx"
		},
		"wildcard": {
			"field_name": "*feji?"
		},
		"range": {
			"field_name": {
				"lt": 12,
				"gt": 9
			}
		}
		"bool": {
			"must": [
			],
			"must_not": [
			],
			"should": [
			],
			"filter": [
			]
		}
	},
	"_source": {
		"include": [],
		"exclude": []
	},
	"post_filter":
Read the rest