2019年6月16日星期日

介绍几款 Docker 镜像

Docker 是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一 Linux 实体下运作,避免启动一个虚拟机造成的额外负担。
简单概括起来就是,Docker 是个容器,什么都能往里塞,你也可以理解为是一个轻量化的虚拟机。
使用 Docker 的好处就是对当前系统的环境没有破坏性,基本上一款镜像可以跑在任意包含了 Docker 的机器上,可以说是十分方便了。
本文主要介绍一下我在学习 Docker 的过程中制作的几款镜像,以及使用方法。

安装并启动 Docker

操作系统内核大于等于 3.10 的都可以安装最新版 Docker,可以直接运行官方的安装脚本一键安装。
执行脚本方法如下:
wget -qO- get.docker.com | bash 

安装完成后,运行下面的命令,验证是否安装成功。
docker version 

启动 Docker
systemctl start docker 

查看 Docker 启动状态
systemctl status docker

允许 Docker 开机自启
systemctl enable docker 

Shadowsocks-libev Docker Image

这是我第一款制作出来的 Docker 镜像,基于官方 debian:stretch 镜像制作,在引入 stretch-backports 后,直接利用 apt-get 安装好 shadowsocks-libev simple-obfs 即可。
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker ,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。
支持的 Tags 及 Dockerfile
latest (Dockerfile)
alpine (Dockerfile)
拉取镜像
docker pull teddysun/shadowsocks-libev

或者拉取以 alpine 镜像制作的,其特点就是文件容量非常小
docker pull teddysun/shadowsocks-libev:alpine 

创建 config 文件
比如在目录 /etc/shadowsocks-libev 下创建 config.json,完整路径也就是 /etc/shadowsocks-libev/config.json
范例内容如下:
{
    "server":"0.0.0.0",
    "server_port":9000,
    "password":"password0",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_and_udp"
}

如果你想同时开启 simple-obfs,那么配置文件范例如下:
{
    "server":"0.0.0.0",
    "server_port":9000,
    "password":"password0",
    "timeout":300,
    "method":"aes-256-gcm",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_and_udp",
    "plugin":"obfs-server",
    "plugin_opts":"obfs=tls"
} 

配置文件里面所有选项的含义,可以参考这个链接
启动容器
在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:
docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev -v /etc/shadowsocks-libev:/etc/shadowsocks-libev teddysun/shadowsocks-libev 

docker run:开始运行一个容器。
-d 参数:容器以后台运行并输出容器 ID。
-p 参数:容器的 9000 端口映射到本机的 9000 端口。默认是映射 TCP,当需要映射 UDP 时,那就再追加一次 UDP 的映射。冒号后面是容器端口,冒号前面是宿主机端口,可以写成一致,也可以不一致。
–name 参数:给容器分配一个识别符,方便将来的启动,停止,删除等操作。
-v 参数:挂载卷(volume),冒号后面是容器的路径,冒号前面是宿主机的路径,可以写成一致,也可以不一致。
teddysun/shadowsocks-libev:这是拉取回来的镜像路径。
当然,这里也可以启动 Tag 为 alpine 的镜像命令:
docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev -v /etc/shadowsocks-libev:/etc/shadowsocks-libev teddysun/shadowsocks-libev:alpine 

注意:此处仅作为演示,不能同时执行上面的这两个启动命令,因为端口都是 9000,产生冲突了。一般我是推荐选 Tag 为 alpine 的镜像的,因为文件的体积会相对比较小。
查看容器
利用如下命令可以查看所有已创建的 Docker 容器并显示容器的大小等信息:
docker ps -as 

停止容器
利用如下命令可以停止正在运行中的容器:
docker stop $name

此处的 $name 就是在启动容器那一步定义的容器的识别符,比如范例的 ss-libev
启动容器
利用如下命令可以启动已经停止的容器:
docker start $name

此处的 $name 就是在启动容器那一步定义的容器的识别符,比如范例的 ss-libev

ShadowsocksR Docker Image

这是我第二款制作出来的 Docker 镜像,基于官方 debian:stretch 镜像制作,安装的是 Github 上目前最新的版本
该容器在启动时依赖于读取宿主机里的配置文件,因此在启动该镜像时配合不同的 config 文件,就能开启任意个 Docker ,也就是所谓的多端口。
把配置文件放在宿主机里,是基于这样的考量:随时在宿主机里修改配置的端口,密码,加密方式等信息,然后只需重启容器,无需再次创建新的容器。
支持的 Tags 及 Dockerfile
3.2.2, latest (Dockerfile)
alpine (Dockerfile)
拉取镜像
docker pull teddysun/shadowsocks-r

或者拉取基于 python:3.6-alpine 镜像制作的
docker pull teddysun/shadowsocks-r:alpine 

创建 config 文件
比如在目录 /etc/shadowsocks-r 下创建 config.json,完整路径也就是 /etc/shadowsocks-r/config.json
范例内容如下:
{
    "server":"0.0.0.0",
    "server_ipv6":"::",
    "server_port":9000,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"password0",
    "timeout":120,
    "method":"aes-256-cfb",
    "protocol":"origin",
    "protocol_param":"",
    "obfs":"plain",
    "obfs_param":"",
    "redirect":"",
    "dns_ipv6":false,
    "fast_open":true,
    "workers":1
} 

ShadowsocksR 协议插件文档的含义,可以参考这个链接
启动容器
在上面这个范例里,定义的端口是 9000,那么在启动容器时就需要将 9000 端口映射到宿主机的对外端口上。
启动命令:
docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr -v /etc/shadowsocks-r:/etc/shadowsocks-r teddysun/shadowsocks-r 

启动 Tag 为 alpine 的镜像命令:
docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr -v /etc/shadowsocks-r:/etc/shadowsocks-r teddysun/shadowsocks-r:alpine 

注意:此处仅作为演示,不能同时执行上面的这两个启动命令,因为端口都是 9000,产生冲突了。一般我是推荐选 Tag 为 alpine 的镜像的,因为文件的体积会相对比较小。

L2TP/IPsec VPN Server Docker Image

这是我第三款制作出来的 Docker 镜像,基于官方 debian:stretch 镜像制作,使用了最新版 libreswan-3.27 和 xl2tpd-1.3.12,支持 L2TP/IPsec PSK 和 IPSec Xauth PSK 两种连接方式。
2018 年 11 月 7 日更新:
1,基于 debian:stretch 镜像制作,使用了最新版 libreswan-3.27 和 xl2tpd-1.3.12;
2,基于 alpine:latest 镜像制作,使用了 alpine 自带的 libreswan-3.21 和 xl2tpd-1.3.10;
注意1:Android 版本小于或等于 7.0 时,建议选择 IPSec Xauth PSK (Cisco IPsec) 模式连接。如下图所示:
注意2:同一个 NAT 下多用户连接,请选择 IPSec Xauth PSK (Cisco IPsec) 模式连接。
该镜像在启动之前,需事先定义环境变量文件 /etc/l2tp.env,其内容具体参考以下的说明。
同时,该镜像具备自主管理用户的特点,一个简单命令即可增删改查用户账号。
支持的 Tags 及 Dockerfile
latest (Dockerfile)
alpine (Dockerfile)
拉取镜像
docker pull teddysun/l2tp

docker pull teddysun/l2tp:alpine

创建启动环境参数文件
比如是 /etc/l2tp.env,该文件内的各个变量定义如下:
VPN_IPSEC_PSK=teddysun.com
VPN_USER=vpnuser
VPN_PASSWORD=vpnpassword
VPN_PUBLIC_IP=
VPN_L2TP_NET=
VPN_L2TP_LOCAL=
VPN_L2TP_REMOTE=
VPN_XAUTH_NET=
VPN_XAUTH_REMOTE=
VPN_DNS1=
VPN_DNS2= 

VPN_IPSEC_PSK:预共享密钥
VPN_USER:默认的登录用户名
VPN_PASSWORD:默认的登录用户密码
VPN_PUBLIC_IP:指定公网 IP 地址,当你的 VPS 有多个公网 IP 时,可能需要手动指定一下
VPN_L2TP_NET:内网 L2TP 网段范围,默认为 192.168.18.0/24,一般此处留空即可
VPN_L2TP_LOCAL:内网 L2TP 网关 IP,默认为 192.168.18.1,一般此处留空即可
VPN_L2TP_REMOTE:内网 L2TP 网段分配给连接的 IP 段,默认为 192.168.18.10-192.168.18.250,一般此处留空即可
VPN_XAUTH_NET:内网 XAUTH 网段范围,默认为 192.168.20.0/24,一般此处留空即可
VPN_XAUTH_REMOTE:内网 XAUTH 网段分配给连接的 IP 段,默认为 192.168.20.10-192.168.20.250,一般此处留空即可
VPN_DNS1:默认 DNS 服务器,8.8.8.8,一般此处留空即可
VPN_DNS2:默认 DNS 服务器,8.8.4.4,一般此处留空即可
启动容器
在这个范例里,需要将 500 和 4500 端口的 UDP 映射到宿主机的对外端口上。
启动命令1:
docker run -d --privileged -p 500:500/udp -p 4500:4500/udp --name l2tp --env-file /etc/l2tp.env -v /lib/modules:/lib/modules teddysun/l2tp

启动命令2:
docker run -d --privileged -p 500:500/udp -p 4500:4500/udp --name l2tp --env-file /etc/l2tp.env -v /lib/modules:/lib/modules teddysun/l2tp:alpine

查看启动日志
docker logs l2tp
此处的 l2tp,是指在启动时定义的容器识别符,–name 参数后的名字。
输出的日志参考如下:
L2TP/IPsec VPN Server with the Username and Password is below: 
Server IP: Your Server public IP
IPSec PSK: IPSec PSK (pre-shared key)
Username : VPN username
Password : VPN password 
Redirecting to: /etc/init.d/ipsec start
Starting pluto IKE daemon for IPsec: Initializing NSS database 
xl2tpd[1]: Not looking for kernel SAref support.
xl2tpd[1]: Using l2tp kernel support.
xl2tpd[1]: xl2tpd version xl2tpd-1.3.12 started on 1d20eaecd9f2 PID:1
xl2tpd[1]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
xl2tpd[1]: Forked by Scott Balmos and David Stipp, (C) 2001
xl2tpd[1]: Inherited by Jeff McAdams, (C) 2002
xl2tpd[1]: Forked again by Xelerance (www.xelerance.com) (C) 2006-2016
xl2tpd[1]: Listening on IP address 0.0.0.0, port 1701 

当然,你也可以查看一下 ipsec status 命令的输出,命令如下:
docker exec -it l2tp ipsec status
此处的 l2tp,是指在启动时定义的容器识别符,–name 参数后的名字。
管理 VPN 用户
列出全部用户及其密码
docker exec -it l2tp l2tpctl -l

新增一个用户
docker exec -it l2tp l2tpctl -a

删除一个用户
docker exec -it l2tp l2tpctl -d

修改一个用户的密码
docker exec -it l2tp l2tpctl -m

打印控制脚本 l2tpctl 的帮助信息
docker exec -it l2tp l2tpctl -h 

需要注意的是,容器一旦被删除重建,或者停止后重新启动,都会导致 VPN 用户信息的丢失,需要通过以上的命令再次创建。
Windows 10 下连接 L2TP VPN
首先,参考下图的设置,将 VPN 的连接信息稍微修改一下。
修改 VPN 属性,如图所示。
一般我们都是连接到家用路由器上的,也就是说,我们的网络一般都是处于 NAT 状态下,因此还需要改一下注册表,根据这个链接,修改注册表的信息,修改完成后,重启 Windows 即可。
参考链接

2019年6月10日星期一

Text message to Robot Voice -- text To Speech Online



This voice synthesizer tool allows you to enter almost any text into the container and tune in to the computer system generated words speaking the particular output. Various windows in addition to operating systems have diverse sounds (typically like natural male and female voices plus unusual accents), so seem on the options within the dropdown box to see what voices are available.

Make sure you word, as this is very brand-new engineering, the speech electrical generator is currently only suitable for the particular latest variation connected with Stainless- as well as Apple safari. Opera and even Web Explorer are certainly not at this time recognized.

Macintosh personal computer computer systems feature a few comments incorporated as part of the MacInTalk program. These kinds of voices show up regularly in favorite tradition, many of these since in the tune "Satisfaction" simply by Benny Benassi (which uses Fred and even Victoria), or perhaps Auto throughout Wall-E which uses a mixture of Ralph and Zarvox.

Twenty-four hours a day use the made audio tracks for any of your own projects (commercial or perhaps personal). It's free! Wish is actually ideal for you: )


Converts the text to a robotic speech which can be online as a possible stereo clip!


Simply wait around regarding this to load up (it may take the minute or so like is actually a good 2mb part associated with software) then type your own personal written text in the field and click "Speak". You could download the conversation by simply clicking the link that will will appear under typically the "Speak" button.


Textual content to be able to Robot Voice

This program behind this software is usually a JavaScript version on the eSpeak library which has been initially written in D. Most thanks goes for you to @kripken to get porting the particular software to JavaScript and so it works in your current web browser!


In natural conversation, you will find a lot of subtle inflections, silence, and amplitude modulations used to convey emotion and effectively give importance to the suitable elements of a sentence. The stated things are very hard to create into the program mainly because they are much more delicate than the pitch/harmonic modulations that make up our syllable sounds.


As a result, early efforts at machine voice technology sounded very monotone in addition to robotic. eSpeak was one such attempt, and fortunately, it now (more than 20 years later) allows us to produce this fun automatic text message to speech software.


For anyone who is old adequate, you might bear in mind "Microsoft Sam" - the particular robotic sounding voice that could read points out in Ms Expression, and help anyone understand Windows. I experienced lots of fun as a guy doing Microsoft Mike claim all kinds of silly issues, therefore i determined I'd make this particular therefore that the youthful decades can savor the exact same matter.


I am hoping anyone have enjoyment with this! It may even be helpful to be able to somebody - that is aware! Maybe to be a weird MLG voice for just a Youtube . com online video, or just as one digital speech generator with regard to DJs? I'd personally love to hear just what you're using the idea with regard to in the comments!: ) If I are able to do whatever to enhance it, as well as if theres a related translator that you need everyone to help make, remember to permit us know in the reviews! Cheers: )

For some noises (Bane and Dalek, to get example), you'll need to help wear the correct "accent" for the speech transformation to work properly. Essentially, try to make your current voice seem like the concentrate on voice, and the powerplant will add some effects to really make it sound like often the real thing. A further arbitrary tip: You'll need for you to talk fairly slowly and gradually in the event that you're using one of the "echo-ey" voices, otherwise this echos will make it really hard to comprehend.


You can employ the generated audio movies for any purpose with all (commercial usage included). There's no need to help credit voicechanger. io when you don't want to be able to. You are able to leave suggestions here, nonetheless please note this is just some sort of hobby project so I actually is not going to be updating the web page routinely. Thanks for ending by - My spouse and i wish you find this web page beneficial! 😄

2019年5月31日星期五

如何制作 Windows Server 2019 的 DD 镜像

DD 命令是 Linux 下的磁盘读写常用命令。它可以将已有的硬盘镜像文件直接写到硬盘上。通过 DD 命令,我们可以把系统由 Linux 改造成 Windows,这样不仅能获得一个纯净的系统,而且也能省下不少费用。网上 DD 镜像文件有很多,但是鱼龙混杂,不是版本不合适,就是害怕有后门木马。所以求人不如求己,自己制作的镜像才是最好的。
下面以制作目前最新的 Windows Server 2019 系统的 DD 镜像为例,记录一下整个过程。

事前准备

1,MSDN 原版 Windows Server 2019 系统的 iso 文件。此处以英文版的 en_windows_server_2019_x64_dvd_3c2cf1202.iso 为例。
2,7zip
3,Dism++
4,virtio 驱动
5,一款支持 Hyper-V 的服务器(可选)

编辑镜像

1,使用 7zip 打开 en_windows_server_2019_x64_dvd_3c2cf1202.iso 并从中提取文件 install.wim,其路径位于 \sources\install.wim,将其单独解压到本地硬盘。此处假设为 D:\install.wim。
2,新建一个目录,此处假设为 D:\Win2019。将下载回来的 Dism++ 解压到一个单独目录下,根据系统的不同运行 Dism++x64.exe(64 位) 或 Dism++x86.exe (32位)
3,在打开的 Dism++ 界面里选择菜单,文件,挂载映像。在弹出的窗口里,第一个浏览那里,点击选择刚才解压出来的 D:\install.wim,此时 Dism++ 会读出 install.wim 里包含的各个版本,我选择了 ServerDatacenter 版。记住不要选择只读模式,点击确定,等待映像挂载完毕。
4,挂载准备就绪后,点击打开会话,进入主界面。
5,将事前准备好的 virtio 驱动 iso 文件,此处下载回来的文件名为 virtio-win-0.1.149.iso,用 7zip 将之解压到 D:\virtio-win-0.1.149。点击驱动管理,添加驱动。选择驱动所在的文件夹后,会自动安装驱动。在弹出窗口,点击确定。
6,如果要适配某些独立服务器比如 Kimsufi,需要手动安装 Intel 的网卡驱动。
点击下载。下载后,用 7zip 打开该文件,将 PROWinx64.exe\PRO1000\Winx64\NDIS65 目录复制出来备用。
然后需要对文件 e1c65x64.inf 魔改一下才能使用,内容如下,注意对比(此处为天坑,切记)。
[Intel.NTamd64.10.0]
; DisplayName                   Section        DeviceID
; -----------                   -------        --------
%E1502NC.DeviceDesc%            = E1502,       PCI\VEN_8086&DEV_1502
%E1502NC.DeviceDesc%            = E1502,       PCI\VEN_8086&DEV_1502&SUBSYS_00008086
%E1502NC.DeviceDesc%            = E1502,       PCI\VEN_8086&DEV_1502&SUBSYS_00011179
%E1502NC.DeviceDesc%            = E1502,       PCI\VEN_8086&DEV_1502&SUBSYS_00021179
%E1502NC.DeviceDesc%            = E1502.10.0.1,       PCI\VEN_8086&DEV_1502
%E1502NC.DeviceDesc%            = E1502.10.0.1,       PCI\VEN_8086&DEV_1502&SUBSYS_00008086
%E1502NC.DeviceDesc%            = E1502.10.0.1,       PCI\VEN_8086&DEV_1502&SUBSYS_00011179
%E1502NC.DeviceDesc%            = E1502.10.0.1,       PCI\VEN_8086&DEV_1502&SUBSYS_00021179
%E1503NC.DeviceDesc%            = E1503.10.0.1,       PCI\VEN_8086&DEV_1503
%E1503NC.DeviceDesc%            = E1503.10.0.1,       PCI\VEN_8086&DEV_1503&SUBSYS_00008086
%E1503NC.DeviceDesc%            = E1503.10.0.1,       PCI\VEN_8086&DEV_1503&SUBSYS_00011179
%E1503NC.DeviceDesc%            = E1503.10.0.1,       PCI\VEN_8086&DEV_1503&SUBSYS_00021179
之后重复添加驱动的步骤,将此驱动加入。
7,点击更新管理,扫描,安装,开始安装更新。此处因为是最新版系统,暂时还没有更新包。
8,点击系统优化,有一系列选项,按需进行优化。我的建议是将防火墙关闭。
9,编辑完镜像后,另存为新的镜像。此处假设为 D:\win2019.wim。等待新的镜像保存完毕。

创建 VHD 虚拟硬盘

1,依次点击开始菜单,Windows 管理工具,计算机管理。点击磁盘管理,操作,创建 VHD,在弹出的窗口,指定计算机上的虚拟硬盘位置,此处假设为 D:\2019.vhd,选择虚拟硬盘大小为 15GB,点击确定,具体如图所示。注意硬盘不宜设置过大,不然将来 DD 的时候,VPS 或服务器的硬盘小于你指定的磁盘大小的话会出错。
2,等待片刻,虚拟磁盘创建完毕。然后选中新建的 VHD 硬盘,右键点击初始化磁盘,分区选择 MBR,点击确定。右键点击新建简单卷,并一路下一步确认,盘符任意指定,此处假设为 T 盘。至此虚拟磁盘创建完毕。

创建带有 Windows Server 2019 系统的 VHD 虚拟硬盘

1,此时另存为的新镜像 D:\win2019.wim 已经创建完毕。在 Dism++ 界面,依次点击,文件,释放镜像,第一个浏览那里,点击选择 D:\win2019.wim,第二个浏览那里,选择刚建立的 VHD 磁盘 T 盘,选中添加引导和格式化,点击确定,在弹出的窗口里选择更多(此处很重要),选择刚建立的磁盘盘符,点击确认。
2,释放镜像完毕后,关闭 Dism++。此时再将该 VHD 磁盘,此处选中 T 盘,右键点击,弹出。

创建无人值守的 DD 包(可选)

之前创建完毕的 VHD 虚拟硬盘实际上就可以使用了。
有些 VPS 提供的控制面板有 VNC,可以用鼠标,还能快捷输入 Ctrl + Alt + Del,那么此 VHD 虚拟硬盘就可以直接拿来使用。
而实际上很多地方是不能 VNC 的,因此就需要做成无人值守,DD 完了立刻就能使用远程登录进入桌面。此时,我们需要借助 Hyper-V 开启远程桌面及定制,优化一下系统。
1,依次打开 Hyper-V 管理器,连接到服务器,本地计算机,操作,新建,虚拟机,指定名称和位置,第一代(1),内存,网络连接,使用现有虚拟硬盘,选择 D:\2019.vhd,完成。以下演示图截自日文系统,实际上界面都是一样的。
2,创建完毕虚拟机后,建议取消检查点。选中虚拟机,右键点击,设置,检查点,取消勾选启用检查点。
3,选中虚拟机,右键点击,连接,启动。然后就像平时安装系统一样,输入一些信息,同意条款,设置 Administrator 密码,进入桌面后,可以进行各种设置了。
比如修改注册表关闭 Ctrl + Alt + Del,以及开启远程桌面,不验证用户级别等操作。此处略过。

压缩 VHD 虚拟硬盘

1,选中 D:\2019.vhd,右键选择 7zip,添加压缩包,压缩格式选择 gzip,选项默认,点击确认。7zip如果压缩报错,用管理员模式启动即可。
2,等待压缩完成后,将压缩包重命名,上传到你自己的服务器,利用 Apache 或 Nginx 等 WebServer 做一个下载直链即可直接拿来使用了。

参考链接: