<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="https://runnerwoo.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://runnerwoo.com/" rel="alternate" type="text/html" /><updated>2023-07-21T19:40:26+08:00</updated><id>https://runnerwoo.com/feed.xml</id><title type="html">我的个人博客</title><subtitle>HELLO WORLD!
</subtitle><entry><title type="html">酷比魔方iwork8安装ubuntu桌面系统</title><link href="https://runnerwoo.com/2022/06/15/%E9%85%B7%E6%AF%94%E9%AD%94%E6%96%B9iwork8%E5%AE%89%E8%A3%85Ubuntu%E6%A1%8C%E9%9D%A2%E7%B3%BB%E7%BB%9F.html" rel="alternate" type="text/html" title="酷比魔方iwork8安装ubuntu桌面系统" /><published>2022-06-15T00:00:00+08:00</published><updated>2022-06-15T00:00:00+08:00</updated><id>https://runnerwoo.com/2022/06/15/%E9%85%B7%E6%AF%94%E9%AD%94%E6%96%B9iwork8%E5%AE%89%E8%A3%85Ubuntu%E6%A1%8C%E9%9D%A2%E7%B3%BB%E7%BB%9F</id><content type="html" xml:base="https://runnerwoo.com/2022/06/15/%E9%85%B7%E6%AF%94%E9%AD%94%E6%96%B9iwork8%E5%AE%89%E8%A3%85Ubuntu%E6%A1%8C%E9%9D%A2%E7%B3%BB%E7%BB%9F.html">&lt;h1 id=&quot;酷比魔方iwork8安装ubuntu桌面系统&quot;&gt;酷比魔方iwork8安装Ubuntu桌面系统&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;/img/2022-06-15.png&quot; alt=&quot;About&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;准备工具&quot;&gt;准备工具&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;酷比魔方iwork8（U80GT）&lt;/li&gt;
  &lt;li&gt;Ubuntu 22.04 LTS 64位桌面系统&lt;sup id=&quot;fnref:ubuntu-desktop&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:ubuntu-desktop&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Rufus&lt;sup id=&quot;fnref:rufus&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:rufus&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;启动盘制作工具&lt;/li&gt;
  &lt;li&gt;micro USB转USB和扩展坞&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中，扩展坞是必不可少的线材，因为需要键盘和鼠标进入BIOS和安装选项设置。&lt;/p&gt;

&lt;h2 id=&quot;制作支持32位uefi的启动盘&quot;&gt;制作支持32位UEFI的启动盘&lt;/h2&gt;

&lt;p&gt;使用Rufus制作U盘后，由于Ubuntu最新版本的安装镜像已经放弃了32位的UEFI启动支持，所以需要替换原来的EFI文件。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;参考 &lt;a href=&quot;https://www.jianshu.com/p/ef9601c984fe&quot;&gt;https://www.jianshu.com/p/ef9601c984fe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;将U盘原先的内容，如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-cmd&quot;&gt;EFI
└── BOOT
    ├── BOOTx64.EFI
    ├── grubx64.efi
    └── mmx64.efi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;替换成Debian32位安装镜像&lt;sup id=&quot;fnref:debian-iso&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:debian-iso&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;内容（选择&lt;strong&gt;i386&lt;/strong&gt;下载），并修改&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grub.cfg&lt;/code&gt;文件内容。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-cmd&quot;&gt;EFI
├── boot
│   ├── bootia32.efi
│   └── grubia32.efi
└── debian
    └── grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;以下是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grub.cfg&lt;/code&gt;示例：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-cfg&quot;&gt;search --file --set=root /.disk/info
set prefix=($root)/boot/grub
source $prefix/grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;安装32位的grub2配置&quot;&gt;安装32位的grub2配置&lt;/h2&gt;

&lt;p&gt;当Ubuntu完成安装后，并不能正常进入系统，反而重新进入了安装盘，这时，选择试用LiveCD。&lt;/p&gt;

&lt;p&gt;查询设备分区信息。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;fdisk &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;blkid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;找到EFI分区（&lt;strong&gt;EFI System Partition&lt;/strong&gt;）和根目录分区。&lt;/p&gt;

&lt;p&gt;在iWork8中，一般是&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/mmcblk2p1&lt;/code&gt; EFI系统&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/mmcblk2p2&lt;/code&gt; 根目录&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;挂载并切换根目录：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount /dev/mmcblk2p2 /mnt
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount /dev/mmcblk2p1 /mnt/boot/efi
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--bind&lt;/span&gt; /dev /mnt/dev
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--bind&lt;/span&gt; /dev/pts /mnt/dev/pts
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--bind&lt;/span&gt; /proc /mnt/proc
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--bind&lt;/span&gt; /sys /mnt/sys
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--bind&lt;/span&gt; /run /mnt/run
&lt;span class=&quot;nb&quot;&gt;sudo chroot&lt;/span&gt; /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;切到根目录环境，安装i386-efi的grub启动器：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt update
apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;grub-efi-ia32-bin
grub-install &lt;span class=&quot;nt&quot;&gt;--target&lt;/span&gt; i386-efi /dev/mmcblk2
update-grub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;配置完成后，关机并拔掉U盘，重启机器即可。&lt;/p&gt;

&lt;h2 id=&quot;解决重力感应与显示设置方向不一致的问题&quot;&gt;解决重力感应与显示设置方向不一致的问题&lt;/h2&gt;

&lt;p&gt;由于系统显示设置与实际屏幕方向不一致，可能会导致触摸不生效的问题，所以需要解决重映射屏幕方向。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;参考 &lt;a href=&quot;https://zhuanlan.zhihu.com/p/38276352&quot;&gt;https://zhuanlan.zhihu.com/p/38276352&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;修改重力感应文件，创建&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/udev/hwdb.d/61-sensor-local.hwdb&lt;/code&gt;，以下是我的机器支持的配置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-file&quot;&gt;sensor:modalias:acpi:SMO8500*:dmi:*.*
 ACCEL_MOUNT_MATRIX=1,0,0;0,1,0;0,0,1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;之后，更新硬件数据库，并重启机器。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemd-hwdb update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;至此，简单的平板改造就完成。&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:ubuntu-desktop&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://ubuntu.com/download/desktop&quot;&gt;https://ubuntu.com/download/desktop&lt;/a&gt; &lt;a href=&quot;#fnref:ubuntu-desktop&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:rufus&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://rufus.ie/zh/&quot;&gt;https://rufus.ie/zh/&lt;/a&gt; &lt;a href=&quot;#fnref:rufus&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:debian-iso&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://www.debian.org/distrib/netinst&quot;&gt;https://www.debian.org/distrib/netinst&lt;/a&gt; &lt;a href=&quot;#fnref:debian-iso&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">酷比魔方iwork8安装Ubuntu桌面系统</summary></entry><entry><title type="html">使用debian云映像创建虚拟机</title><link href="https://runnerwoo.com/2022/03/21/%E4%BD%BF%E7%94%A8Debian%E4%BA%91%E6%98%A0%E5%83%8F%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA.html" rel="alternate" type="text/html" title="使用debian云映像创建虚拟机" /><published>2022-03-21T00:00:00+08:00</published><updated>2022-03-21T00:00:00+08:00</updated><id>https://runnerwoo.com/2022/03/21/%E4%BD%BF%E7%94%A8Debian%E4%BA%91%E6%98%A0%E5%83%8F%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA</id><content type="html" xml:base="https://runnerwoo.com/2022/03/21/%E4%BD%BF%E7%94%A8Debian%E4%BA%91%E6%98%A0%E5%83%8F%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E6%9C%BA.html">&lt;h1 id=&quot;使用debian云映像创建虚拟机&quot;&gt;使用Debian云映像创建虚拟机&lt;/h1&gt;

&lt;h2 id=&quot;环境准备&quot;&gt;环境准备&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Oracle Virtual Box&lt;/li&gt;
  &lt;li&gt;Debian GNU/Linux 11 (bullseye)系统&lt;/li&gt;
  &lt;li&gt;Debian 11 Cloud Image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果有一台装有Debian 11系统的机器最好，也可以用Windows/WSL2代替，而我用的是vscode devcontainer&lt;sup id=&quot;fnref:vscode-devcontainer&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vscode-devcontainer&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;创建的docker容器来作为工具搭建，配置见下。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-al&lt;/span&gt;

.devcontainer/
  devcontainer.json
  Dockerfile
networks/
  debian-master &lt;span class=&quot;c&quot;&gt;# 主节点网络配置&lt;/span&gt;
  debian-node01 &lt;span class=&quot;c&quot;&gt;# 从节点网络配置&lt;/span&gt;
vboxes/          &lt;span class=&quot;c&quot;&gt;# virtual box虚拟机&lt;/span&gt;
  debian-master/
  debian-node01/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.devcontainer/devcontainer.json&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Cloud Init Environment&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;dockerFile&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Dockerfile&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;remoteUser&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;vscode&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.devcontainer/Dockerfile&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-dockerfile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; mcr.microsoft.com/vscode/devcontainers/base:0-bullseye&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s:deb.debian.org:ftp.cn.debian.org:g'&lt;/span&gt; /etc/apt/sources.list &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s:security.debian.org:ftp.cn.debian.org:g'&lt;/span&gt; /etc/apt/sources.list

&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;apt-get update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;noninteractive &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-install-recommends&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    bash-completion &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    cloud-image-utils &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    qemu-utils &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; clean &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /images &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /images &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2 &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后从VSCode打开该目录，完成容器环境的搭建。&lt;/p&gt;

&lt;p&gt;其中，我直接在容器中，直接从远程获取了Debian的云映像资源（目录&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/images&lt;/code&gt;），如果是自行环境搭建，可以从官网&lt;sup id=&quot;fnref:cloud-images&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:cloud-images&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;下载。&lt;/p&gt;

&lt;h2 id=&quot;新建virtual-box虚拟机&quot;&gt;新建Virtual Box虚拟机&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;由于VBox虚拟机不支持直接在已有文件夹下创建。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;打开Oracle VM VirtualBox，新建一个虚拟机。&lt;/p&gt;

&lt;p&gt;我将输入名称&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;debian-master&lt;/code&gt;（名字随意）。&lt;/p&gt;

&lt;p&gt;内存大小选择“512MB”，虚拟硬盘选择“不添加虚拟硬盘”。&lt;/p&gt;

&lt;p&gt;进入虚拟机设置，在网络选项卡中，选择启用“网卡2”，选择连接方式“仅主机（Host-Only）网络”。&lt;/p&gt;

&lt;h3 id=&quot;创建并vmdk虚拟硬盘&quot;&gt;创建并vmdk虚拟硬盘&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qemu-img convert &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; qcow2 &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; vmdk &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;adapter_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lsilogic /images/debian-11-generic-amd64.qcow2 vboxes/debian-master/root-disk.vmdk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;创建nocloud的iso镜像&quot;&gt;创建NoCloud的iso镜像&lt;/h3&gt;

&lt;p&gt;参考cloud init&lt;sup id=&quot;fnref:cloud-init&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:cloud-init&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;配置基础用户信息和系统配置（这里我们选用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;20.4.1&lt;/code&gt;版本查询模块设置参数），例如&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master-data&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;#cloud-config&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;passw0rd&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# 设置默认用户密码&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;chpasswd&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;expire&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;False&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 是否强制用户修改初始密码&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;ssh_pwauth&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;True&lt;/span&gt;            &lt;span class=&quot;c1&quot;&gt;# 是否允许通过ssh访问&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;system_info&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;default_user&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sysadmin&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# 设置默认用户登录名&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;apt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 使用中国镜像&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;primary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;arches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://ftp.cn.debian.org/debian/&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;security&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;arches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://ftp.cn.debian.org/debian-security/&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;sources_list&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;deb $PRIMARY $RELEASE main &lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;deb $PRIMARY $RELEASE-updates main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE-updates main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;# deb $PRIMARY $RELEASE-backports main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE-backports main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;deb $SECURITY $RELEASE-security main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $SECURITY $RELEASE-security main&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;write_files&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/sysctl.d/70-disable-ipv6.conf&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 关闭IPv6协议&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;net.ipv6.conf.all.disable_ipv6 = 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以下是初始网络配置信息设置：&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;networks/debian-master&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;ethernets&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;enp0s8&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;enp0s8&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;addresses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;192.168.56.10/255.255.255.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cloud-localds vboxes/debian-master/seed.iso master-data &lt;span class=&quot;nt&quot;&gt;--hostname&lt;/span&gt; debian-master &lt;span class=&quot;nt&quot;&gt;--dsmode&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--network-config&lt;/span&gt; networks/debian-maste
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;关联虚拟硬盘和配置镜像&quot;&gt;关联虚拟硬盘和配置镜像&lt;/h3&gt;

&lt;p&gt;打开虚拟机设置，在存储选项卡中，在SATA添加注册&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vboxes/debian-master/root-disk.vmdk&lt;/code&gt;虚拟硬盘，在IDE分配光驱选择&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vboxes/debian-master/seed.iso&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&quot;打开虚拟机&quot;&gt;打开虚拟机&lt;/h2&gt;

&lt;p&gt;等待虚拟机启动完成后，可以使用ssh访问&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.56.10&lt;/code&gt;访问到虚拟机，输入刚才&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master-data&lt;/code&gt;配置用户名和密码，默认用户拥有&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo&lt;/code&gt;权限。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh sysadmin@192.168.56.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这时已完成安装，并且支持外网访问。&lt;/p&gt;

&lt;h3 id=&quot;安装apt-cacher-ng&quot;&gt;安装apt-cacher-ng&lt;/h3&gt;

&lt;p&gt;安装&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt-cacher-ng&lt;/code&gt;，使内网节点支持代理更新软件包：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt-get install apt-cacher-ng
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;配置部署内网节点&quot;&gt;配置部署内网节点&lt;/h2&gt;

&lt;p&gt;首先内网节点，我们不需要用户名和密码登录，使用主节点（debian-master）的ssh密钥登录，所以在主节点运行生成密钥对。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ssh-keygen &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; 2048
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;复制黏贴公钥文本后，修改&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master-data&lt;/code&gt;复制到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;node-data&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;配置apt下载HTTP代理：http://192.168.56.10:3142。&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;#cloud-config&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;ssh_authorized_keys&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# SSH公钥设置&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ssh-rsa AAA..(你的公钥字符串)..ZgE= sysadmin@debian-master&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;system_info&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;default_user&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sysadmin&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# 设置默认用户登录名&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;apt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 使用中国镜像&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;http_proxy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://192.168.56.10:3142&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 内网代理节点&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;primary&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;arches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://ftp.cn.debian.org/debian/&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;security&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;arches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://ftp.cn.debian.org/debian-security/&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;sources_list&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;deb $PRIMARY $RELEASE main &lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;deb $PRIMARY $RELEASE-updates main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE-updates main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;# deb $PRIMARY $RELEASE-backports main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $PRIMARY $RELEASE-backports main&lt;/span&gt;

    &lt;span class=&quot;s&quot;&gt;deb $SECURITY $RELEASE-security main&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;# deb-src $SECURITY $RELEASE-security main&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;write_files&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/sysctl.d/70-disable-ipv6.conf&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 关闭IPv6协议&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;net.ipv6.conf.all.disable_ipv6 = 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;重复上述操作建立debian-node01虚拟机，并在网络设置中，启用网络1，使用连接方式“仅主机（Host-Only）网络”具体内容不再概述，以下是相关执行脚本。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qemu-img convert &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; qcow2 &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; vmdk &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;adapter_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lsilogic /images/debian-11-generic-amd64.qcow2 vboxes/debian-node01/root-disk.vmdk

cloud-localds vboxes/debian-node01/seed.iso node-data &lt;span class=&quot;nt&quot;&gt;--hostname&lt;/span&gt; debian-node01 &lt;span class=&quot;nt&quot;&gt;--dsmode&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;local&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--network-config&lt;/span&gt; networks/debian-node01
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;示例项目参考&quot;&gt;示例项目参考&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://gitee.com/rwyc/debian-cloud-init-setups&quot;&gt;https://gitee.com/rwyc/debian-cloud-init-setups&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:vscode-devcontainer&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/remote/containers&quot;&gt;https://code.visualstudio.com/docs/remote/containers&lt;/a&gt; &lt;a href=&quot;#fnref:vscode-devcontainer&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:cloud-images&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://cloud.debian.org/images/cloud/&quot;&gt;https://cloud.debian.org/images/cloud/&lt;/a&gt; &lt;a href=&quot;#fnref:cloud-images&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:cloud-init&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://cloudinit.readthedocs.io/en/20.4.1/&quot;&gt;https://cloudinit.readthedocs.io/en/20.4.1/&lt;/a&gt; &lt;a href=&quot;#fnref:cloud-init&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">使用Debian云映像创建虚拟机</summary></entry><entry><title type="html">Visual Studio测试工具集成GoogleTest和Qt</title><link href="https://runnerwoo.com/2021/06/12/visualstudio-gtest-integrate-qt.html" rel="alternate" type="text/html" title="Visual Studio测试工具集成GoogleTest和Qt" /><published>2021-06-12T00:00:00+08:00</published><updated>2021-06-12T00:00:00+08:00</updated><id>https://runnerwoo.com/2021/06/12/visualstudio-gtest-integrate-qt</id><content type="html" xml:base="https://runnerwoo.com/2021/06/12/visualstudio-gtest-integrate-qt.html">&lt;p&gt;Visual Studio 的测试管理工具虽然集成了 Google Test 测试框架，但缺少 QtTest 测试框架的支持，所以需要在 Google Test 集成 Qt 框架完成单元测试。&lt;/p&gt;

&lt;h2 id=&quot;背景介绍&quot;&gt;背景介绍&lt;/h2&gt;

&lt;p&gt;因为代码中不免需要编写单元测试，而且可能一个 VC 项目中带有若干个测试用例，这时难免有运行调试其中一个测试用例。
虽然 Visual Studio 本身有测试管理工具（Test Explorer），但目前官方维护和支持的测试框架&lt;sup id=&quot;fnref:vs2019-cpptest&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vs2019-cpptest&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;只有 Google Test 、Boost Test 和 MS CppUnit Test Framework。
所以，采用简单的解决方案是在 Google Test 测试框架基础上，使其支持 Qt 框架。&lt;/p&gt;

&lt;h2 id=&quot;问题描述&quot;&gt;问题描述&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;如何让 Google Test 运行在 Qt 的事件循环中？&lt;/li&gt;
  &lt;li&gt;如何使 Visual Studio 的测试管理工具（环境变量）能正常运行？&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;测试环境&quot;&gt;测试环境&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Visual Studio 2019 Community&lt;/li&gt;
  &lt;li&gt;Test Adapter for Google Test&lt;sup id=&quot;fnref:vs2019-gtest&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vs2019-gtest&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Qt VS Tools&lt;sup id=&quot;fnref:vs2019-qtvstools&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vs2019-qtvstools&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;Qt 5.15.2 ( msvc2019_64 )&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;创建项目&quot;&gt;创建项目&lt;/h2&gt;

&lt;p&gt;创建“&lt;strong&gt;Qt Core Application&lt;/strong&gt;”项目，在 &lt;strong&gt;Qt Modules&lt;/strong&gt; 中选择 &lt;strong&gt;Core&lt;/strong&gt; 和 &lt;strong&gt;Test&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;完成项目创建后，右键 &lt;strong&gt;Manage NuGet Packages…&lt;/strong&gt;，搜索并引入 GoogleTest 测试框架，NuGet 包名 是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;右键项目“&lt;strong&gt;Properties&lt;/strong&gt; &amp;gt; &lt;strong&gt;Referenced Packages&lt;/strong&gt; &amp;gt; &lt;strong&gt;Google Test&lt;/strong&gt;”，设置 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Use Google Test's main Function&lt;/code&gt; 为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;No&lt;/code&gt;。因为我们需要手动编写 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; 函数，以便 Google Test 能够正常启动 Qt 事件循环。&lt;/p&gt;

&lt;h3 id=&quot;创建简单的测试启动类&quot;&gt;创建简单的测试启动类&lt;/h3&gt;

&lt;p&gt;修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.cpp&lt;/code&gt;，使 Google Test 运行在事件循环中。&lt;/p&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[])&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;QCoreApplication&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

	&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;testing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InitGoogleTest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;QTimer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;singleShot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QCoreApplication&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RUN_ALL_TESTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;编写测试单元&quot;&gt;编写测试单元&lt;/h3&gt;

&lt;p&gt;结合 QtTest &lt;sup id=&quot;fnref:qttest-testqstring&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:qttest-testqstring&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;简单写了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QString::toUpper&lt;/code&gt; 方法的单元测试。&lt;/p&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QStringTests&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;TEST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllLower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;QString&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;EXPECT_EQ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HELLO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;TEST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Mixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;QString&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;EXPECT_EQ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HELLO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;TEST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;QString&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HELLO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;EXPECT_EQ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HELLo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;toUpper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// failed&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;编译运行后，可以看到类似的运行结果。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-log&quot;&gt;[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from toUpper
[ RUN      ] toUpper.AllLower
[       OK ] toUpper.AllLower (0 ms)
[ RUN      ] toUpper.Mixed
[       OK ] toUpper.Mixed (0 ms)
[ RUN      ] toUpper.AllUpper
D:\repos\TestQString\TestQString.cpp(21): error: Expected equality of these values:
  &quot;HELLo&quot;
    Which is: 00007FF6978C7A58
  string.toUpper()
    Which is: { 2-byte object &amp;lt;48-00&amp;gt;, 2-byte object &amp;lt;45-00&amp;gt;, 2-byte object &amp;lt;4C-00&amp;gt;, 2-byte object &amp;lt;4C-00&amp;gt;, 2-byte object &amp;lt;4F-00&amp;gt; }
[  FAILED  ] toUpper.AllUpper (2 ms)
[----------] 3 tests from toUpper (5 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (8 ms total)
[  PASSED  ] 2 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] toUpper.AllUpper

 1 FAILED TEST

D:\repos\TestQString\x64\Debug\TestQString.exe (process 6740) exited with code 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;扫描测试用例&quot;&gt;扫描测试用例&lt;/h2&gt;

&lt;p&gt;打开菜单“&lt;strong&gt;View&lt;/strong&gt; &amp;gt; &lt;strong&gt;Test Explorer&lt;/strong&gt;”，会多出测定管理工具，但是执行扫描不出意外会出现错误，因为扫描程序运行其实没有设置 Qt 的环境变量。&lt;/p&gt;

&lt;h3 id=&quot;设置单元测试运行环境&quot;&gt;设置单元测试运行环境&lt;/h3&gt;

&lt;p&gt;Visual Sutdio 测试工具按照项目配置运行环境&lt;sup id=&quot;fnref:vs2019-runsettings&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vs2019-runsettings&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;在当前项目目录下创建文件 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Qt.x64.runsettings&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;RunSettings&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;RunConfiguration&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;EnvironmentVariables&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;PATH&amp;gt;&lt;/span&gt;%PATH%;C:/Qt/5.15.2/msvc2019_64/bin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/PATH&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/EnvironmentVariables&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/RunConfiguration&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/RunSettings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;卸载项目（Unload），并编辑项目，添加属性（&lt;strong&gt;PropertyGroup&lt;/strong&gt;）。&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;RunSettingsFilePath&amp;gt;&lt;/span&gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&lt;span class=&quot;nt&quot;&gt;&amp;lt;/RunSettingsFilePath&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;重新打开项目，并且 &lt;strong&gt;Rebuild&lt;/strong&gt; 后，可以在 &lt;strong&gt;Test Explorer&lt;/strong&gt; 窗口中看到刚才声明的单元测试列表，并且可以针对若干个特定单元进行运行测试。&lt;/p&gt;

&lt;h3 id=&quot;配置t4模板文件&quot;&gt;配置T4模板文件&lt;/h3&gt;

&lt;p&gt;通过创建 T4 模板文件&lt;sup id=&quot;fnref:vs2019-t4template&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vs2019-t4template&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; 来解决 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.runsettings&lt;/code&gt; 的 Qt 固定路径写法存在问题，以此方便不同 Qt 环境切换。&lt;/p&gt;

&lt;p&gt;重命名 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Qt.x64.runsettings&lt;/code&gt; 为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Qt.runsettings.tt&lt;/code&gt;，并修改文件内容。&lt;/p&gt;

&lt;div class=&quot;language-cs highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;c#&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hostspecific&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;.runsettings&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parameter&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;System.String&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;QtDllPath&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1.0&quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RunSettings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RunConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EnvironmentVariables&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%;&amp;lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;QtDllPath&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EnvironmentVariables&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RunConfiguration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RunSettings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;卸载项目配置 T4 模板构建任务，编辑项目文件内容。&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-   &amp;lt;None Include=&quot;Qt.runsettings.tt&quot;&amp;gt;
&lt;/span&gt;  &amp;lt;/ItemGroup&amp;gt;
&lt;span class=&quot;gi&quot;&gt;+ &amp;lt;ItemGroup&amp;gt;
+   &amp;lt;None Include=&quot;Qt.runsettings.tt&quot;&amp;gt;
+     &amp;lt;Generator&amp;gt;TextTemplatingFileGenerator&amp;lt;/Generator&amp;gt;
+     &amp;lt;OutputFileName&amp;gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&amp;lt;/OutputFileName&amp;gt;
+   &amp;lt;/None&amp;gt;
+   &amp;lt;T4ParameterValues Include=&quot;QtDllPath&quot;&amp;gt;
+     &amp;lt;Value&amp;gt;$(QtDllPath)&amp;lt;/Value&amp;gt;
+   &amp;lt;/T4ParameterValues&amp;gt;
+ &amp;lt;/ItemGroup&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;RunSettingsFilePath&amp;gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&amp;lt;/RunSettingsFilePath&amp;gt;
&lt;span class=&quot;gi&quot;&gt;+   &amp;lt;TransformOnBuild&amp;gt;true&amp;lt;/TransformOnBuild&amp;gt;
&lt;/span&gt;  &amp;lt;/PropertyGroup&amp;gt;
&lt;span class=&quot;gi&quot;&gt;+ &amp;lt;Import Project=&quot;$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets&quot; /&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;打开项目，执行 &lt;strong&gt;Rebuild&lt;/strong&gt;，如果看到如下编译输出，并且当前项目出现 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Qt.x64.runsettings&lt;/code&gt;，代表生成成功。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-log&quot;&gt;....
1&amp;gt;Transforming template Qt.runsettings.tt...
....
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;运行截图&quot;&gt;运行截图&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/img/2021-06-12.png&quot; alt=&quot;Test Explorer Results&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:vs2019-cpptest&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://docs.microsoft.com/zh-cn/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2019 &lt;a href=&quot;#fnref:vs2019-cpptest&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:vs2019-gtest&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://docs.microsoft.com/zh-cn/visualstudio/test/how-to-use-google-test-for-cpp?view=vs-2019 &lt;a href=&quot;#fnref:vs2019-gtest&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:vs2019-qtvstools&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2019 &lt;a href=&quot;#fnref:vs2019-qtvstools&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:qttest-testqstring&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://doc.qt.io/qt-5.15/qttestlib-tutorial2-example.html &lt;a href=&quot;#fnref:qttest-testqstring&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:vs2019-runsettings&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://docs.microsoft.com/zh-cn/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019 &lt;a href=&quot;#fnref:vs2019-runsettings&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:vs2019-t4template&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://docs.microsoft.com/en-us/visualstudio/modeling/writing-a-t4-text-template?view=vs-2019 &lt;a href=&quot;#fnref:vs2019-t4template&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">Visual Studio 的测试管理工具虽然集成了 Google Test 测试框架，但缺少 QtTest 测试框架的支持，所以需要在 Google Test 集成 Qt 框架完成单元测试。 背景介绍 因为代码中不免需要编写单元测试，而且可能一个 VC 项目中带有若干个测试用例，这时难免有运行调试其中一个测试用例。 虽然 Visual Studio 本身有测试管理工具（Test Explorer），但目前官方维护和支持的测试框架1只有 Google Test 、Boost Test 和 MS CppUnit Test Framework。 所以，采用简单的解决方案是在 Google Test 测试框架基础上，使其支持 Qt 框架。 问题描述 如何让 Google Test 运行在 Qt 的事件循环中？ 如何使 Visual Studio 的测试管理工具（环境变量）能正常运行？ 测试环境 Visual Studio 2019 Community Test Adapter for Google Test2 Qt VS Tools3 Qt 5.15.2 ( msvc2019_64 ) 创建项目 创建“Qt Core Application”项目，在 Qt Modules 中选择 Core 和 Test。 完成项目创建后，右键 Manage NuGet Packages…，搜索并引入 GoogleTest 测试框架，NuGet 包名 是 Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn。 右键项目“Properties &amp;gt; Referenced Packages &amp;gt; Google Test”，设置 Use Google Test's main Function 为 No。因为我们需要手动编写 main 函数，以便 Google Test 能够正常启动 Qt 事件循环。 创建简单的测试启动类 修改 main.cpp，使 Google Test 运行在事件循环中。 int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); ::testing::InitGoogleTest(&amp;amp;argc, argv); QTimer::singleShot(0, []() { QCoreApplication::exit(RUN_ALL_TESTS()); }); return a.exec(); } 编写测试单元 结合 QtTest 4简单写了 QString::toUpper 方法的单元测试。 namespace QStringTests { TEST(toUpper, AllLower) { QString string = &quot;hello&quot;; EXPECT_EQ(&quot;HELLO&quot;, string.toUpper()); } TEST(toUpper, Mixed) { QString string = &quot;Hello&quot;; EXPECT_EQ(&quot;HELLO&quot;, string.toUpper()); } TEST(toUpper, AllUpper) { QString string = &quot;HELLO&quot;; EXPECT_EQ(&quot;HELLo&quot;, string.toUpper()); // failed } } 编译运行后，可以看到类似的运行结果。 [==========] Running 3 tests from 1 test case. [----------] Global test environment set-up. [----------] 3 tests from toUpper [ RUN ] toUpper.AllLower [ OK ] toUpper.AllLower (0 ms) [ RUN ] toUpper.Mixed [ OK ] toUpper.Mixed (0 ms) [ RUN ] toUpper.AllUpper D:\repos\TestQString\TestQString.cpp(21): error: Expected equality of these values: &quot;HELLo&quot; Which is: 00007FF6978C7A58 string.toUpper() Which is: { 2-byte object &amp;lt;48-00&amp;gt;, 2-byte object &amp;lt;45-00&amp;gt;, 2-byte object &amp;lt;4C-00&amp;gt;, 2-byte object &amp;lt;4C-00&amp;gt;, 2-byte object &amp;lt;4F-00&amp;gt; } [ FAILED ] toUpper.AllUpper (2 ms) [----------] 3 tests from toUpper (5 ms total) [----------] Global test environment tear-down [==========] 3 tests from 1 test case ran. (8 ms total) [ PASSED ] 2 tests. [ FAILED ] 1 test, listed below: [ FAILED ] toUpper.AllUpper 1 FAILED TEST D:\repos\TestQString\x64\Debug\TestQString.exe (process 6740) exited with code 1. 扫描测试用例 打开菜单“View &amp;gt; Test Explorer”，会多出测定管理工具，但是执行扫描不出意外会出现错误，因为扫描程序运行其实没有设置 Qt 的环境变量。 设置单元测试运行环境 Visual Sutdio 测试工具按照项目配置运行环境5。 在当前项目目录下创建文件 Qt.x64.runsettings。 &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt; &amp;lt;RunSettings&amp;gt; &amp;lt;RunConfiguration&amp;gt; &amp;lt;EnvironmentVariables&amp;gt; &amp;lt;PATH&amp;gt;%PATH%;C:/Qt/5.15.2/msvc2019_64/bin&amp;lt;/PATH&amp;gt; &amp;lt;/EnvironmentVariables&amp;gt; &amp;lt;/RunConfiguration&amp;gt; &amp;lt;/RunSettings&amp;gt; 卸载项目（Unload），并编辑项目，添加属性（PropertyGroup）。 &amp;lt;PropertyGroup&amp;gt; &amp;lt;RunSettingsFilePath&amp;gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&amp;lt;/RunSettingsFilePath&amp;gt; &amp;lt;/PropertyGroup&amp;gt; 重新打开项目，并且 Rebuild 后，可以在 Test Explorer 窗口中看到刚才声明的单元测试列表，并且可以针对若干个特定单元进行运行测试。 配置T4模板文件 通过创建 T4 模板文件6 来解决 *.runsettings 的 Qt 固定路径写法存在问题，以此方便不同 Qt 环境切换。 重命名 Qt.x64.runsettings 为 Qt.runsettings.tt，并修改文件内容。 &amp;lt;#@ template language=&quot;c#&quot; hostspecific=&quot;true&quot; #&amp;gt; &amp;lt;#@ output extension=&quot;.runsettings&quot; #&amp;gt; &amp;lt;#@ parameter type=&quot;System.String&quot; name=&quot;QtDllPath&quot; #&amp;gt; &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt; &amp;lt;RunSettings&amp;gt; &amp;lt;RunConfiguration&amp;gt; &amp;lt;EnvironmentVariables&amp;gt; &amp;lt;PATH&amp;gt;%PATH%;&amp;lt;#= QtDllPath #&amp;gt;&amp;lt;/PATH&amp;gt; &amp;lt;/EnvironmentVariables&amp;gt; &amp;lt;/RunConfiguration&amp;gt; &amp;lt;/RunSettings&amp;gt; 卸载项目配置 T4 模板构建任务，编辑项目文件内容。 - &amp;lt;None Include=&quot;Qt.runsettings.tt&quot;&amp;gt; &amp;lt;/ItemGroup&amp;gt; + &amp;lt;ItemGroup&amp;gt; + &amp;lt;None Include=&quot;Qt.runsettings.tt&quot;&amp;gt; + &amp;lt;Generator&amp;gt;TextTemplatingFileGenerator&amp;lt;/Generator&amp;gt; + &amp;lt;OutputFileName&amp;gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&amp;lt;/OutputFileName&amp;gt; + &amp;lt;/None&amp;gt; + &amp;lt;T4ParameterValues Include=&quot;QtDllPath&quot;&amp;gt; + &amp;lt;Value&amp;gt;$(QtDllPath)&amp;lt;/Value&amp;gt; + &amp;lt;/T4ParameterValues&amp;gt; + &amp;lt;/ItemGroup&amp;gt; &amp;lt;PropertyGroup&amp;gt; &amp;lt;RunSettingsFilePath&amp;gt;$(MSBuildProjectDirectory)\Qt.$(Platform).runsettings&amp;lt;/RunSettingsFilePath&amp;gt; + &amp;lt;TransformOnBuild&amp;gt;true&amp;lt;/TransformOnBuild&amp;gt; &amp;lt;/PropertyGroup&amp;gt; + &amp;lt;Import Project=&quot;$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets&quot; /&amp;gt; 打开项目，执行 Rebuild，如果看到如下编译输出，并且当前项目出现 Qt.x64.runsettings，代表生成成功。 .... 1&amp;gt;Transforming template Qt.runsettings.tt... .... 运行截图 https://docs.microsoft.com/zh-cn/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2019 &amp;#8617; https://docs.microsoft.com/zh-cn/visualstudio/test/how-to-use-google-test-for-cpp?view=vs-2019 &amp;#8617; https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2019 &amp;#8617; https://doc.qt.io/qt-5.15/qttestlib-tutorial2-example.html &amp;#8617; https://docs.microsoft.com/zh-cn/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019 &amp;#8617; https://docs.microsoft.com/en-us/visualstudio/modeling/writing-a-t4-text-template?view=vs-2019 &amp;#8617;</summary></entry><entry><title type="html">Qt在线安装包设置镜像</title><link href="https://runnerwoo.com/2020/04/12/qt-online-installer-using-mirror.html" rel="alternate" type="text/html" title="Qt在线安装包设置镜像" /><published>2020-04-12T00:00:00+08:00</published><updated>2020-04-12T00:00:00+08:00</updated><id>https://runnerwoo.com/2020/04/12/qt-online-installer-using-mirror</id><content type="html" xml:base="https://runnerwoo.com/2020/04/12/qt-online-installer-using-mirror.html">&lt;p&gt;&lt;strong&gt;Qt Online Installer&lt;/strong&gt; 在线安装过慢，使用镜像加速。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;目前使用 &lt;strong&gt;Qt&lt;/strong&gt; 安装程序，会强制登录验证，为了避免后续安装，建议 &lt;a href=&quot;https://login.qt.io/register&quot;&gt;注册&lt;/a&gt; 一个 &lt;strong&gt;Qt&lt;/strong&gt; 账号&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;镜像准备&quot;&gt;镜像准备&lt;/h2&gt;

&lt;p&gt;访问 &lt;strong&gt;Qt&lt;/strong&gt; 官网选择镜像&lt;sup id=&quot;fnref:qt-mirrors&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:qt-mirrors&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;，这里我选择 &lt;strong&gt;清华镜像源&lt;/strong&gt;&lt;sup id=&quot;fnref:tsinghua&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:tsinghua&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;确认镜像源各目录的用处，一般关注这两个打 &lt;strong&gt;星号（*）&lt;/strong&gt;目录下内容：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-tree&quot;&gt;  File Name  ↓          File Size  ↓    Date  ↓
  Parent directory/     -               -
  archive/              -               2019-12-18 13:30
  community_releases/   -               2017-02-23 13:29
  development_releases/ -               2019-05-17 22:44
  learning/             -               2013-05-22 21:20
  linguist_releases/    -               2019-03-26 13:49
  ministro/             -               2017-02-20 16:32
* official_releases/    -               2019-06-03 16:59
* online/               -               2014-03-13 14:45
  snapshots/            -               2019-05-16 19:07
  timestamp.txt         11 B            2020-03-24 22:00
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;下载在线安装包&quot;&gt;下载在线安装包&lt;/h2&gt;

&lt;p&gt;在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;official_releases/official_releases/online_installers/&lt;/code&gt; 目录下，可以找到各系统的 &lt;strong&gt;Qt&lt;/strong&gt; 在线安装包。
由于我是 &lt;strong&gt;Windows 10&lt;/strong&gt; 平台下，我选择下载 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/qt-unified-windows-x86-online.exe&quot;&gt;qt-unified-windows-x86-online.exe&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;选择在线库&quot;&gt;选择在线库&lt;/h2&gt;

&lt;p&gt;浏览 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;online/qtsdkrepository/windows_x86/&lt;/code&gt;&lt;/a&gt; 目录下，选择 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;desktop&lt;/code&gt; 可以找到在线软件源，类似 &lt;strong&gt;Debian&lt;/strong&gt; 下的 &lt;strong&gt;APT&lt;/strong&gt; 源吧。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-tree&quot;&gt;  File Name  ↓         File Size  ↓     Date  ↓
  Parent directory/    -                -
  android/             -                2020-03-17 16:19
* desktop/             -                2020-03-17 16:19
  root/                -                2013-12-12 01:35
  winrt/               -                2020-03-17 16:19
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;不同开发平台选择不同目录，例如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAC OS&lt;/code&gt; 选择 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/mac_x64/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;../mac_x64/&lt;/code&gt;&lt;/a&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Linux 64位&lt;/code&gt; 选择 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/linux_x64/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;../linux_x64/&lt;/code&gt;&lt;/a&gt; 等&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;添加在线库&quot;&gt;添加在线库&lt;/h2&gt;

&lt;p&gt;打开 Qt 在线安装软件，点击左下角的 &lt;strong&gt;设置&lt;/strong&gt;，选择 &lt;strong&gt;资料档案库&lt;/strong&gt;，添加以下在线库&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;官网还有许多可以选择的环境，因为我只用到 MSVC 环境，所以没有选择其它环境，具体可以浏览 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/&quot;&gt;在线库&lt;/a&gt; 选择要装的环境和工具&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&quot;language-url&quot;&gt;// 必选
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/licenses
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_generic
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_ifw
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_vcredist
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_telemetry
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_maintenance

// Qt Creator 工具
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/tools_qtcreator

// Qt 版本和源码，我这里选择 Qt 5.9.9 版本，如果需要其它版本，可以从 online 源里选择
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/qt5_599
https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/qt5_599_src_doc_examples
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;设置-hosts&quot;&gt;设置 Hosts&lt;/h2&gt;

&lt;p&gt;因为 Qt 安装程序无论是否设置 &lt;strong&gt;用户定义的资料档案库&lt;/strong&gt;，都会引用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://download.qt.io&lt;/code&gt; 的官方源，所以我采用更改 &lt;strong&gt;Hosts&lt;/strong&gt; 文件屏蔽官方源域名。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-hosts&quot;&gt;# C:\Windows\System32\drivers\etc\hosts
127.0.0.1 download.qt.io
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;安装-qt-creator-和-qt-依赖库&quot;&gt;安装 Qt Creator 和 Qt 依赖库&lt;/h2&gt;

&lt;p&gt;按照上述配置完成后，登录 &lt;strong&gt;Qt&lt;/strong&gt; 账户，同意许可，选择 &lt;strong&gt;Qt&lt;/strong&gt; 的安装路径和指定版本库即可。&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:qt-mirrors&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;http://download.qt.io/static/mirrorlist/ &lt;a href=&quot;#fnref:qt-mirrors&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:tsinghua&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://mirrors.tuna.tsinghua.edu.cn/qt/ &lt;a href=&quot;#fnref:tsinghua&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><summary type="html">Qt Online Installer 在线安装过慢，使用镜像加速。</summary></entry><entry><title type="html">在Ubuntu上使用MySQL服务</title><link href="https://runnerwoo.com/2017/04/17/mysql-in-virtualbox.html" rel="alternate" type="text/html" title="在Ubuntu上使用MySQL服务" /><published>2017-04-17T19:30:00+08:00</published><updated>2017-04-17T19:30:00+08:00</updated><id>https://runnerwoo.com/2017/04/17/mysql-in-virtualbox</id><content type="html" xml:base="https://runnerwoo.com/2017/04/17/mysql-in-virtualbox.html">&lt;p&gt;在Ubuntu上使用MySQL服务，主要是利用Deb包管理器管理，使用的软件包版本是Ubuntu自带的。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;原标题 &lt;strong&gt;在Ubuntu上的MySQL上增加远程访问用户&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;del&gt;前面讲到用&lt;em&gt;Vitrualbox&lt;/em&gt;安装自己的本地服务器（云服务器也同理），现在我想用&lt;em&gt;MySQL&lt;/em&gt;数据库服务，并且可以利用主机上的可视化工具连接客户机上的数据库。&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;首先，先安装&lt;em&gt;MySQL&lt;/em&gt;服务器，这里有两种方法：一是去&lt;a href=&quot;http://dev.mysql.com/downloads/mysql/&quot; target=&quot;blank&quot;&gt;MySQL官网&lt;/a&gt;下载对应的二进制包或者源码安装，二是通过&lt;em&gt;Ubuntu&lt;/em&gt;的&lt;em&gt;apt&lt;/em&gt;包管理机制安装。那么我这里就用包管理的方式安装&lt;em&gt;MySQL&lt;/em&gt;。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 安装 MySQL&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;mysql-server
&lt;span class=&quot;c&quot;&gt;# 在安装 MySQL 的过程中，可能会被要求输入 root 密码，按照要求输入即可&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果要在自己的主机访问客户机上的&lt;em&gt;MySQL&lt;/em&gt;的服务的话，在配置好对应的&lt;em&gt;host-only&lt;/em&gt;的网络配置后，还要在&lt;em&gt;MySQL&lt;/em&gt;数据库中添加远程访问用户，具体步骤如下（&lt;a href=&quot;http://blog.csdn.net/preterhuman_peak/article/details/40396873&quot; target=&quot;blank&quot;&gt;相关参考网站&lt;/a&gt;&lt;sup id=&quot;fnref:mysql&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:mysql&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;）&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 首先用 root 用户登陆 mysql&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mysql &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; root &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 之后会要求输入密码&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 输入完密码后，进入 mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;添加&lt;em&gt;MySQL&lt;/em&gt;的远程用户有两种方法：&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;当然对于云服务器也适用&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;1.使用&lt;strong&gt;grant&lt;/strong&gt;方法授权远程用户&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mysql &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; grant all privileges on &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; to admin@&lt;span class=&quot;s1&quot;&gt;'%'&lt;/span&gt; identified by &lt;span class=&quot;s1&quot;&gt;'password'&lt;/span&gt; with grant option&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 命令的解释是： grant [权限内容](上面的内容代表全部操作权限) on [数据库](上面的代表所有数据库)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# to [用户名](上面的用户名为admin)@[登陆主机](%代表任何其它主机) identified by [密码] with grant option&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;2.使用&lt;strong&gt;INSERT&lt;/strong&gt;语句插入至&lt;strong&gt;user&lt;/strong&gt;表&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 选择 mysql 数据库&lt;/span&gt;
mysql &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; use mysql&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 查看 user 的表头信息&lt;/span&gt;
mysql &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; desc user&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 在 user 表中插入对应数据&lt;/span&gt;
mysql &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; insert into user values&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'%'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'admin'&lt;/span&gt;, password&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'password'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;, &lt;span class=&quot;s1&quot;&gt;'y'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 其中注意有 14 个 'y'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接着，还要配置&lt;em&gt;MySQL&lt;/em&gt;的配置信息，特别是服务端口&lt;strong&gt;(port)&lt;/strong&gt;和绑定地址&lt;strong&gt;(bind-address)&lt;/strong&gt;，不同的&lt;em&gt;MySQL&lt;/em&gt;安装方式，可能对应的配置文件目录地址（而我的目录地址是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/mysql/my.cnf&lt;/code&gt;）不同，但是基本的配置信息修改都是一样的。打开对应的配置文件，修改&lt;strong&gt;bind-address&lt;/strong&gt;为&lt;strong&gt;0.0.0.0&lt;/strong&gt;，至于端口就默认好了。之后，解决MySQL插入中文数据失败问题，需要将数据库的编码类型改成UTF-8模式，参考链接&lt;sup id=&quot;fnref:utf8&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:utf8&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;提示：在最新的Ubuntu16.04LTS版本中，配置文件在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/mysql/mysql.conf.d/mysqld.conf&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;简单的配置如下（仅为本人自己的配置）：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 修改配置文件&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;mysqld]
...
bind-address&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.0.0.0
character-set-server&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf8
collation-server&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf8_unicode_ci

&lt;span class=&quot;c&quot;&gt;# 重启mysql服务&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service mysql restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最后，可能会需要防火墙配置，为什么有防火墙呢，因为有些需要安全性高的系统，可能会只对外开放几个端口，这就需要修改防火墙来开放&lt;em&gt;MySQL&lt;/em&gt;的服务端口，不过，我安装完&lt;em&gt;Ubuntu&lt;/em&gt;后，好像默认不开启防火墙的，如果有需要的可以参考以下网址&lt;a href=&quot;CentOS Linux防火墙配置及关闭 - 像块石头 - 博客园&quot; target=&quot;blank&quot;&gt;CentOS Linux防火墙配置&lt;/a&gt;&lt;sup id=&quot;fnref:iptables&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:iptables&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;和&lt;a href=&quot;http://wiki.ubuntu.org.cn/UFW%E9%98%B2%E7%81%AB%E5%A2%99%E7%AE%80%E5%8D%95%E8%AE%BE%E7%BD%AE&quot; target=&quot;blank&quot;&gt;Ubuntu UFW防火墙配置&lt;/a&gt;&lt;sup id=&quot;fnref:UFW&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:UFW&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:mysql&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://blog.csdn.net/preterhuman_peak/article/details/40396873&quot; target=&quot;blank&quot;&gt;MYSQL添加远程用户或允许远程访问三种方法 - 上帝之手 - 博客频道 - CSDN.NET&lt;/a&gt; &lt;a href=&quot;#fnref:mysql&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:utf8&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/a/10866836&quot;&gt;Change MySQL default character set to UTF-8 in my.cnf? - Stack Overflow&lt;/a&gt; &lt;a href=&quot;#fnref:utf8&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:iptables&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/rockee/archive/2012/05/17/2506671.html&quot; target=&quot;blank&quot;&gt;CentOS Linux防火墙配置及关闭 - 像块石头 - 博客园&lt;/a&gt; &lt;a href=&quot;#fnref:iptables&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:UFW&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://wiki.ubuntu.org.cn/UFW%E9%98%B2%E7%81%AB%E5%A2%99%E7%AE%80%E5%8D%95%E8%AE%BE%E7%BD%AE&quot; target=&quot;blank&quot;&gt;UFW防火墙简单设置 - Ubuntu中文&lt;/a&gt; &lt;a href=&quot;#fnref:UFW&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><category term="virtualbox" /><category term="ubuntu" /><category term="mysql" /><category term="config" /><summary type="html">在Ubuntu上使用MySQL服务，主要是利用Deb包管理器管理，使用的软件包版本是Ubuntu自带的。</summary></entry><entry><title type="html">Installing LAMP with Docker</title><link href="https://runnerwoo.com/2016/02/28/installing-lamp-docker.html" rel="alternate" type="text/html" title="Installing LAMP with Docker" /><published>2016-02-28T20:52:00+08:00</published><updated>2016-02-28T20:52:00+08:00</updated><id>https://runnerwoo.com/2016/02/28/installing-lamp-docker</id><content type="html" xml:base="https://runnerwoo.com/2016/02/28/installing-lamp-docker.html">&lt;p&gt;之前，我介绍了&lt;a href=&quot;/2015/11/22/installing-LAMP-with-vagrant.html&quot;&gt;使用Vagrant安装开发环境&lt;/a&gt;，因为当时是因为刚从Windows转到Ubuntu（但是，现在已经在用Debian了，我是被Ubuntu的内部错误吓怕了…），于是显而易见地使用Vagrant来配置开发环境，而且当时还想介绍如何使用那套开发环境的说，结果就弃坑了，然后，在逐步了解Docker后，发现在Linux下使用Vagrant安装Linux开发环境有点鸡肋了，而且占用内存（无论是物理内存还是运行内存）也大。&lt;/p&gt;

&lt;p&gt;但是如果是Windows下尝试Linux的开发环境，还是可以使用Vagrant，使用都差不多，但是两者的虚拟技术是不一样的，Vagrant是中规中矩地建立一个虚拟机，而Docker是在Linux的内核上建立类似类似沙盒的与真实系统隔离的软件环境，具体两者的区别网上都有很多解释了，我就把我如今的使用流程简单地在这记录一下吧。&lt;/p&gt;

&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;认真研读官方文档&lt;sup id=&quot;fnref:official-doc&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:official-doc&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;：其实没有什么东西比官方文档更权威了，虽然有些开发技术或语言的官方文档写得太深奥或是太简单啥的，这些就另当别论了吧，但是安装方面，官方文档还是写得挺好的，言简意赅，当然，如果英文啥的是软肋，还是有中文方面的资料&lt;sup id=&quot;fnref:dockerpool&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:dockerpool&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;的，我就是结合着一起看的；&lt;/li&gt;
  &lt;li&gt;确认自己的系统类型和版本，在这里我的系统是 Debian 8(Jessie 64位)，后续安装也是以这个为基准，自然官网上也有其他系统版本的安装；&lt;/li&gt;
  &lt;li&gt;注意：我是安装官网的最新版本，不是系统软件库里的稳定版本，如果出现问题，那就只能给官方反馈Bug咯（当然，也可通过搜索引擎自己解决），我是安装成功的。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;安装&quot;&gt;安装&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;首先，向apt源中添加公钥，以确保安全性&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-key adv &lt;span class=&quot;nt&quot;&gt;--keyserver&lt;/span&gt; hkp://p80.pool.sks-keyservers.net:80 &lt;span class=&quot;nt&quot;&gt;--recv-keys&lt;/span&gt; 58118E89F3A912897C070ADBF76221572C52609D
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;再在源列表中添加docker源&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 编辑路径 &lt;span class=&quot;s1&quot;&gt;'/etc/apt/sources.list.d/docker.list'&lt;/span&gt; 的文件
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 如果该文件不存在，就创建一个，如下
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'deb http://apt.dockerproject.org/repo debian-jessie main'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /etc/apt/sources.list.d/docker.list
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get update
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 确认 &lt;span class=&quot;s1&quot;&gt;'apt'&lt;/span&gt; 包管理系统存在该软件包
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-cache policy docker-engine
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 安装 Docker
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; docker-engine
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;基础配置&quot;&gt;基础配置&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;因为Docker默认安装后，每次执行都要索取&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;root&lt;/code&gt;权限，针对只有一个用户的个人系统来说，很不方便。下面使用来自官方的解决方法。&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 如果不存在 &lt;span class=&quot;s1&quot;&gt;'docker'&lt;/span&gt; 用户组，就创建一个
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;groupadd docker
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 向 &lt;span class=&quot;s1&quot;&gt;'docker'&lt;/span&gt; 用户组中添加管理员的用户（如果是个人电脑，一般就是当前管理员&lt;span class=&quot;s1&quot;&gt;'${USER}'&lt;/span&gt;）
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;gpasswd &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; docker
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 重启 &lt;span class=&quot;s1&quot;&gt;'docker'&lt;/span&gt; 服务
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service docker restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;安装lamp&quot;&gt;安装LAMP&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Docker的开发环境也跟Vagrant一样，也有一个仓库（英文名：Docker Hub）&lt;sup id=&quot;fnref:docker-hub&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:docker-hub&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;，只要在上面搜索关键词，基本都能搜到，仓库上的资源有官方认证的也有其他开发者自己的。&lt;/li&gt;
  &lt;li&gt;在这里，我使用的是，一个是官方的&lt;a href=&quot;https://hub.docker.com/_/mysql/&quot; target=&quot;blank&quot;&gt;mysql&lt;/a&gt;，另一个是改写自&lt;a href=&quot;https://hub.docker.com/_/wordpress/&quot; target=&quot;blank&quot;&gt;wordpress&lt;/a&gt;官方 &lt;strong&gt;Dockerfile&lt;/strong&gt; 的&lt;a href=&quot;https://hub.docker.com/_/php/&quot; target=&quot;blank&quot;&gt;php&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;下载环境以及对应的版本（不填写版本tag的话，默认是latest），其中我的 &lt;strong&gt;Dockerfile&lt;/strong&gt; 如下：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM php:5.6-apache

# Base on wordpress:apache Dockfile
# 基于wordpress:apache的Dockfile
RUN a2enmod rewrite expires

# install the PHP extensions we need
# 安装必要的PHP插件
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y libpng12-dev libjpeg-dev &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \
	&amp;amp;&amp;amp; docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
	&amp;amp;&amp;amp; docker-php-ext-install gd mysqli opcache pdo_mysql

# Change uid 1000 to www-data avoid 403 forbidden
# 更改www-data用户的用户id至1000，避免出现403错误
RUN usermod -u 1000 www-data &amp;amp;&amp;amp; groupmod -g 1000 www-data
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 下载官方的mysql镜像
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker pull mysql
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 由于官方的php镜像是纯净的，不含php插件（包括mysqli等）
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 所以选择自己编写&lt;span class=&quot;s1&quot;&gt;'Dockerfile'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;如上&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;，或者选择&lt;span class=&quot;s1&quot;&gt;'workpress'&lt;/span&gt;的官方镜像
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 我是选择模仿&lt;span class=&quot;s1&quot;&gt;'workpress'&lt;/span&gt;的&lt;span class=&quot;s1&quot;&gt;'Dockerfile'&lt;/span&gt;改写了自己的&lt;span class=&quot;s1&quot;&gt;'Dockerfile'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; php-with-mysqli:5.6-apache /path/to/Dockerfile
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 等待一段时间建立自定义镜像，然后查看已安装的镜像，就可以看到自己的镜像
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker images
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/img/2016-02-28-000.png&quot; alt=&quot;Docker镜像列表&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;因为要在之后的apache容器中使用mysql服务，先建立mysql容器，具体运行参数还是参考Docker Hub上的资料吧。&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 建立&lt;span class=&quot;s1&quot;&gt;'mysql'&lt;/span&gt;后台服务，名称取为&lt;span class=&quot;s1&quot;&gt;'db'&lt;/span&gt;，且分配映射3306端口
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 3306:3306 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; db &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;root &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; mysql
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 建立&lt;span class=&quot;s1&quot;&gt;'php-apache'&lt;/span&gt;后台服务，名称取为&lt;span class=&quot;s1&quot;&gt;'php-apache-app'&lt;/span&gt;，链接到&lt;span class=&quot;s1&quot;&gt;'db'&lt;/span&gt;，映射80端口且挂载网站目录
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 80:80 &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; php-apache-app &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/path/to/html&quot;&lt;/span&gt;:/var/www/html &lt;span class=&quot;nt&quot;&gt;--link&lt;/span&gt; db:mysql &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; php-with-mysqli:5.6-apache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/img/2016-02-28-001.png&quot; alt=&quot;Docker正在运行的容器&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;开始使用&quot;&gt;开始使用&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;在 &lt;strong&gt;/path/to/html/&lt;/strong&gt; 下建立一个php文件，保存文件名为 &lt;strong&gt;hello.php&lt;/strong&gt; ，文件内容如下：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;phpinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
 &lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;访问 &lt;strong&gt;localhost/hello.php&lt;/strong&gt; ，可以看到一些必须知道的参数，如下图：&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-02-28-002.png&quot; alt=&quot;PHP全局变量&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;之后，你就可以在 &lt;strong&gt;/path/to/html/&lt;/strong&gt; 目录下部署你的php项目。&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 关闭容器
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker stop some-container
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 打开容器
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker start some-container
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; 进入容器的终端（即Bash）
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; some-container bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:official-doc&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;官方安装最新版Docker教程：&lt;a href=&quot;https://docs.docker.com/engine/installation/&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/engine/installation/&lt;/a&gt; &lt;a href=&quot;#fnref:official-doc&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:dockerpool&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;DockerPool的中文Doker教程：&lt;a href=&quot;http://dockerpool.com/static/books/docker_practice/&quot; target=&quot;_blank&quot;&gt;http://dockerpool.com/static/books/docker_practice/&lt;/a&gt; &lt;a href=&quot;#fnref:dockerpool&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:docker-hub&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Docker官方仓库：&lt;a href=&quot;https://hub.docker.com&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/&lt;/a&gt; &lt;a href=&quot;#fnref:docker-hub&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><category term="debian" /><category term="docker" /><category term="apache" /><category term="php" /><summary type="html">之前，我介绍了使用Vagrant安装开发环境，因为当时是因为刚从Windows转到Ubuntu（但是，现在已经在用Debian了，我是被Ubuntu的内部错误吓怕了…），于是显而易见地使用Vagrant来配置开发环境，而且当时还想介绍如何使用那套开发环境的说，结果就弃坑了，然后，在逐步了解Docker后，发现在Linux下使用Vagrant安装Linux开发环境有点鸡肋了，而且占用内存（无论是物理内存还是运行内存）也大。</summary></entry><entry><title type="html">CURL Usage</title><link href="https://runnerwoo.com/2016/01/29/curl-usage.html" rel="alternate" type="text/html" title="CURL Usage" /><published>2016-01-29T00:00:00+08:00</published><updated>2016-01-29T00:00:00+08:00</updated><id>https://runnerwoo.com/2016/01/29/curl-usage</id><content type="html" xml:base="https://runnerwoo.com/2016/01/29/curl-usage.html">&lt;p&gt;CURL —— 一款用来检测HTTP路由的工具&lt;/p&gt;

&lt;h1 id=&quot;安装步骤&quot;&gt;安装步骤&lt;/h1&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;curl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;使用方法&quot;&gt;使用方法&lt;/h1&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; GET Method&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Default&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl localhost:8080/predictions
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--request&lt;/span&gt; GET localhost:8080/predictions/
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl localhost:8080/predictions?id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;31
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; GET Method with Header &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ex.Use GET request &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;JSON data&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--header&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Accept: application/json&quot;&lt;/span&gt; localhost:8080/predictions/
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--header&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Accept: application/json&quot;&lt;/span&gt; localhost:8080/predictions?id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;31
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; POST Method with Data
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--request&lt;/span&gt; POST &lt;span class=&quot;nt&quot;&gt;--data&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;who=Mike&amp;amp;what=Hello world&quot;&lt;/span&gt; localhost:8080/predictions/
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; PUT Method with new Data
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--request&lt;/span&gt; PUT &lt;span class=&quot;nt&quot;&gt;--data&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;id=33#what=This is an update&quot;&lt;/span&gt; localhost:8080/predictions/
&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; DELETE Method
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;--request&lt;/span&gt; DELETE localhost:8080/predictions?id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;33
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="debian" /><category term="development" /><category term="web" /><summary type="html">CURL —— 一款用来检测HTTP路由的工具</summary></entry><entry><title type="html">在Ubuntu上编译使用wxWidgests</title><link href="https://runnerwoo.com/2015/11/30/starting-wxwidgets-on-ubuntu.html" rel="alternate" type="text/html" title="在Ubuntu上编译使用wxWidgests" /><published>2015-11-30T00:00:00+08:00</published><updated>2015-11-30T00:00:00+08:00</updated><id>https://runnerwoo.com/2015/11/30/starting-wxwidgets-on-ubuntu</id><content type="html" xml:base="https://runnerwoo.com/2015/11/30/starting-wxwidgets-on-ubuntu.html">&lt;p&gt;&lt;a href=&quot;https://wxwidgets.org/&quot; target=&quot;blank&quot;&gt;wxWidgets&lt;/a&gt;是一个跨平台的C++的GUI开发库，用来开发桌面应用程序的，具体就不加介绍了，详情的话可以看看官网的&lt;a href=&quot;https://wiki.wxwidgets.org/Main_Page&quot; target=&quot;blank&quot;&gt;Wiki&lt;/a&gt;或是使用搜索引擎搜索相关介绍。这次主要讲讲，我第一次使用这个开发库遇见的问题，和一些简单的解决方法，特别是如何使用eclipse的IDE环境（注：如果不是硬性要装elipse，相信其他IDE比较适合，比如&lt;a href=&quot;http://codeblocks.org/&quot; target=&quot;blank&quot;&gt;Code::Blocks&lt;/a&gt;或&lt;a href=&quot;http://codelite.org/&quot; target=&quot;blank&quot;&gt;Codelite&lt;/a&gt;）。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;为什么要用wxWidgets呢，这个原因，主要是自己学了C++无从使用有点不甘心，而且大学将近过了一大半了，现在连个简单的桌面应用程序都写不出，出去都不好意思说我是软工专业毕业的了 (／‵Д′)／~ ╧╧&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在使用wxWidgets之前，还是先要安装这个开发库，这其中，有两个名词注意一下，一个是静态链接库以及动态链接库，这其中的区别，可以简单理解为，运行时，经动态链接库编译的也需要这个动态链接库，而静态的不需要，运行可执行文件即可（这里，我可能解释得不是很准确，给个比较好的&lt;a href=&quot;http://blog.csdn.net/chlele0105/article/details/23691147&quot; target=&quot;blank&quot;&gt;介绍链接&lt;/a&gt;&lt;sup id=&quot;fnref:diff-lib&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:diff-lib&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;）。说了那么多，那么就开始编译安装wxWidgets了，在这里，我就不提供安装包或者包管理安装了，因为这些官网都有简单的介绍&lt;sup id=&quot;fnref:install&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:install&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;，主要还是讲一讲比较“折磨”的源代码安装。&lt;/p&gt;

&lt;p&gt;我主要还是讲讲Ubuntu下的安装方式，Ubuntu就比较简单了，其实就三句命令，分别是&lt;strong&gt;配置&lt;/strong&gt;、&lt;strong&gt;编译&lt;/strong&gt;、&lt;strong&gt;安装&lt;/strong&gt;，当然规范的源代码安装也是这样的，学好这个固然理解整个源代码安装的规范流程。&lt;/p&gt;

&lt;p&gt;首先是配置，这里官网有提供简单的&lt;a href=&quot;https://wiki.wxwidgets.org/WxWidgets_Build_Configurations&quot; target=&quot;blank&quot;&gt;配置参数&lt;/a&gt;&lt;sup id=&quot;fnref:config&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:config&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-Bash&quot;&gt;# 首先，解压从官网上下载的源代码，并在其目录下建立一个用来存放编译文件的目录
$ cd /path/to/wxWidgets
$ mkdir gtk-build
# 我在这个建立一个gtk-build的目录用来存放之后编译后的文件
$ cd gtk-build
$ ../Configure --enable-unicode --enable-monolithic --enable-debug
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在这里，我简单介绍一下，一些配置信息，默认情况下，是生成动态链接库，可以使用参数&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--disable-shared&lt;/code&gt;取消，而生成单文件的参数&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--enable-monolithic&lt;/code&gt;只能在动态链接库的选项下执行，而&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--enable-debug&lt;/code&gt;是可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Debug&lt;/code&gt;的方式编译运行，而默认的安装目录实在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/&lt;/code&gt;下，修改参数&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--prefix=/your/installation/path&lt;/code&gt;即可，具体的其他参数，可参考&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--help&lt;/code&gt;或者官网。至于windows下的编译，我就提供一个&lt;a href=&quot;http://blog.csdn.net/sxhelijian/article/details/26163791&quot; target=&quot;blank&quot;&gt;链接&lt;/a&gt;&lt;sup id=&quot;fnref:win-install&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:win-install&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;供大家参考（其实刚才那个官网提供的参数配置&lt;sup id=&quot;fnref:config:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:config&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;里也有介绍到windows的编译方式）&lt;/p&gt;

&lt;p&gt;接下来，就是编译了，做好上一步的话，编译就不是很难了，只需要在刚才那个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gtk-build&lt;/code&gt;目录下执行一句命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$ make&lt;/code&gt;就可以了。对了，上一步配置检查的过程中会有缺少&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gtk&lt;/code&gt;依赖项的小错误，&lt;a href=&quot;https://forums.wxwidgets.org/viewtopic.php?t=34891&quot; target=&quot;blank&quot;&gt;解决方式&lt;/a&gt;&lt;sup id=&quot;fnref:gtk-dev&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:gtk-dev&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo apt-get install libgtk2.0-dev&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;安装，如果没有更改安装目录的话，安装至&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/&lt;/code&gt;目录下，可能有权限问题，所以要在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gtk-build&lt;/code&gt;执行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo make install&lt;/code&gt;；如果是安装在非权限目录下，执行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make install&lt;/code&gt;就可以了，但是这样会带来环境配置的问题，最好还是装在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local&lt;/code&gt;，方便管理。&lt;/p&gt;

&lt;p&gt;最后，就是如何在eclipse上使用该开发库了，自然，我是已经安装好了eclipse，至于如何在Ubuntu下安装elipse，就已经偏题了。先提供&lt;a href=&quot;https://wiki.wxwidgets.org/Eclipse&quot; target=&quot;blank&quot;&gt;官网的配置方法&lt;/a&gt;，当然也是最正确的配置方式。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;有人会问，eclipse编C程序是个坑，但是，我因为一些原因，要用到eclipse，且已经安装完CDT了，为什么不用呢，还要多下个软件，徒增内存（以上纯属个人意见，当然如果是为了更大的项目的话，在eclipse上编C的确不是很好的选择，但我们是学习嘛，就不用考虑那么多了嘛）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;打开eclipse，先建立一个C++项目（File-&amp;gt;New-&amp;gt;C++ Project），然后之后在这个项目上右键选择&lt;em&gt;Properties&lt;/em&gt;，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C/C++ Build -&amp;gt; Setting&lt;/code&gt;设置里，有以下几个地方要设置。&lt;/p&gt;

&lt;p&gt;一、 C++编译设置里，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Miscellaneous-&amp;gt;Others flags&lt;/code&gt;后添加（`wx-config –cxxflags`），不要忘了（`）这个符号。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-001.png&quot; alt=&quot;GCC C++ Compiler Setting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;二、 C编译设置里，同理，加上（`wx-config –cflags`）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-002.png&quot; alt=&quot;GCC C Compiler Setting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;三、 在C++的链接器设置中，在&lt;strong&gt;Linker flags&lt;/strong&gt;中添加（`wx-config –libs`）&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-003.png&quot; alt=&quot;GCC C++ Linker Setting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;四、 将其&lt;strong&gt;Command Line Pattern&lt;/strong&gt;中改为&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Bash&quot;&gt;${COMMAND} ${OUTPUT_FLAG} ${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} ${FLAGS}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-004.png&quot; alt=&quot;GCC C++ Linker Setting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;之后，建立一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main.cpp&lt;/code&gt;写入代码测试一下，发现缺少&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libwx_gtk2u-3.0.so&lt;/code&gt;文件，原来在运行的时候，系统没有添加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/lib&lt;/code&gt;下的运行库文件，所以在elipse的运行设置中添加这样一段即可。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-005.png&quot; alt=&quot;Run Configurations&quot; /&gt;&lt;/p&gt;

&lt;p&gt;还有就是在编程的时候，没有自动填充，这是很头疼的事，eclipse提供了一个功能能够倒入头文件来建立自动填充的提示，虽然要另外安&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alt + /&lt;/code&gt;实现，但也是足够了。具体还是看这个&lt;a href=&quot;http://stackoverflow.com/questions/8209978/how-to-enable-code-completion-for-wxwidgets-in-eclipse-ide&quot; target=&quot;blank&quot;&gt;解决方案&lt;/a&gt;&lt;sup id=&quot;fnref:autocomplete&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:autocomplete&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;（如下图设置）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2015-11-30-006.png&quot; alt=&quot;Paths and Symbols&quot; /&gt;&lt;/p&gt;

&lt;p&gt;至于测试代码，我这里附上官网的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hello&lt;/code&gt;源码&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-CPP&quot;&gt;// wxWidgets &quot;Hello world&quot; Program
// For compilers that support precompilation, includes &quot;wx/wx.h&quot;.
#include &amp;lt;wx/wxprec.h&amp;gt;
#ifndef WX_PRECOMP
    #include &amp;lt;wx/wx.h&amp;gt;
#endif
class MyApp: public wxApp
{
public:
    virtual bool OnInit();
};
class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString&amp;amp; title, const wxPoint&amp;amp; pos, const wxSize&amp;amp; size);
private:
    void OnHello(wxCommandEvent&amp;amp; event);
    void OnExit(wxCommandEvent&amp;amp; event);
    void OnAbout(wxCommandEvent&amp;amp; event);
    wxDECLARE_EVENT_TABLE();
};
enum
{
    ID_Hello = 1
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Hello,   MyFrame::OnHello)
    EVT_MENU(wxID_EXIT,  MyFrame::OnExit)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( &quot;Hello World&quot;, wxPoint(50, 50), wxSize(450, 340) );
    frame-&amp;gt;Show( true );
    return true;
}
MyFrame::MyFrame(const wxString&amp;amp; title, const wxPoint&amp;amp; pos, const wxSize&amp;amp; size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;
    menuFile-&amp;gt;Append(ID_Hello, &quot;&amp;amp;Hello...\tCtrl-H&quot;,
                     &quot;Help string shown in status bar for this menu item&quot;);
    menuFile-&amp;gt;AppendSeparator();
    menuFile-&amp;gt;Append(wxID_EXIT);
    wxMenu *menuHelp = new wxMenu;
    menuHelp-&amp;gt;Append(wxID_ABOUT);
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar-&amp;gt;Append( menuFile, &quot;&amp;amp;File&quot; );
    menuBar-&amp;gt;Append( menuHelp, &quot;&amp;amp;Help&quot; );
    SetMenuBar( menuBar );
    CreateStatusBar();
    SetStatusText( &quot;Welcome to wxWidgets!&quot; );
}
void MyFrame::OnExit(wxCommandEvent&amp;amp; event)
{
    Close( true );
}
void MyFrame::OnAbout(wxCommandEvent&amp;amp; event)
{
    wxMessageBox( &quot;This is a wxWidgets' Hello world sample&quot;,
                  &quot;About Hello World&quot;, wxOK | wxICON_INFORMATION );
}
void MyFrame::OnHello(wxCommandEvent&amp;amp; event)
{
    wxLogMessage(&quot;Hello world from wxWidgets!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;另外，可能有一些朋友是使用windows的eclipse，在这里，附上另外一个人写的教程做&lt;a href=&quot;http://my.oschina.net/uniquejava/blog/108692?fromerr=JtezGgRI&quot; target=&quot;blank&quot;&gt;参考&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:diff-lib&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://blog.csdn.net/chlele0105/article/details/23691147&quot; target=&quot;blank&quot;&gt;Linux的.a、.so和.o文件 - chlele0105的专栏 - 博客频道 - CSDN.NET&lt;/a&gt; &lt;a href=&quot;#fnref:diff-lib&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:install&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://wxwidgets.org/downloads/&quot; target=&quot;blank&quot;&gt;wxWidgets的各平台安装包下载&lt;/a&gt; &lt;a href=&quot;#fnref:install&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:config&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://wiki.wxwidgets.org/WxWidgets_Build_Configurations&quot; target=&quot;blank&quot;&gt;WxWidgets Build Configurations&lt;/a&gt; &lt;a href=&quot;#fnref:config&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt; &lt;a href=&quot;#fnref:config:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:win-install&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://blog.csdn.net/sxhelijian/article/details/26163791&quot; target=&quot;blank&quot;&gt;wxWidgets初学者导引（2）——下载、安装wxWidgets - 迂者-贺利坚的专栏 - 博客频道 - CSDN.NET&lt;/a&gt; &lt;a href=&quot;#fnref:win-install&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:gtk-dev&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://forums.wxwidgets.org/viewtopic.php?t=34891&quot; target=&quot;blank&quot;&gt;https://forums.wxwidgets.org/viewtopic.php?t=34891&lt;/a&gt; &lt;a href=&quot;#fnref:gtk-dev&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:autocomplete&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/questions/8209978/how-to-enable-code-completion-for-wxwidgets-in-eclipse-ide&quot; target=&quot;blank&quot;&gt;autocomplete - How to enable code completion for wxWidgets in Eclipse IDE - Stack Overflow&lt;/a&gt; &lt;a href=&quot;#fnref:autocomplete&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><category term="ubuntu" /><category term="wxwidgets" /><category term="c++" /><category term="eclipse" /><summary type="html">wxWidgets是一个跨平台的C++的GUI开发库，用来开发桌面应用程序的，具体就不加介绍了，详情的话可以看看官网的Wiki或是使用搜索引擎搜索相关介绍。这次主要讲讲，我第一次使用这个开发库遇见的问题，和一些简单的解决方法，特别是如何使用eclipse的IDE环境（注：如果不是硬性要装elipse，相信其他IDE比较适合，比如Code::Blocks或Codelite）。</summary></entry><entry><title type="html">在Vagrant上使用和配置Apache服务器</title><link href="https://runnerwoo.com/2015/11/24/using-apache-with-vagrant.html" rel="alternate" type="text/html" title="在Vagrant上使用和配置Apache服务器" /><published>2015-11-24T00:00:00+08:00</published><updated>2015-11-24T00:00:00+08:00</updated><id>https://runnerwoo.com/2015/11/24/using-apache-with-vagrant</id><content type="html" xml:base="https://runnerwoo.com/2015/11/24/using-apache-with-vagrant.html">&lt;p&gt;上篇博客，我讲到了如何安装Vagrant来建立一个开发环境，让自己的电脑与开发环境隔离，在文章中，我也讲到了如何在Vagrant中简单安装LAMP的web服务器，这次，我在这篇文章中，简单的讲解我在使用Vagrant做我的Apache服务器时，遇见的一些问题以及相关的解决方案。&lt;/p&gt;

&lt;h3 id=&quot;apache服务器在vagrant上的一些权限问题&quot;&gt;Apache服务器在Vagrant上的一些权限问题&lt;/h3&gt;

&lt;p&gt;在Apache服务器上部署一个网站的时候，这时，有个十分偷懒的方法，就是将自己的网站项目放进Vagrant的共享目录下，然后，登陆Vagrant建立的虚拟机中，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/www/&lt;/code&gt;目录下建立软链接（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ln -s /vagrant/yourweb /var/www/path/to/yourweb&lt;/code&gt;）即可。但是，在本地连接上次配好的ip的地址，访问刚才部署好的网站目录时，显示&lt;strong&gt;403&lt;/strong&gt;的错误信息，这是我就郁闷了，4开头的错误一般是客户端的错误，难道我访问的地址错误了？然后，我又试一下，先把软链接删除，再将整个网站项目复制到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/www/&lt;/code&gt;下时，访问对应网址，结果还是错误了，后来，渐渐发现了，这是个权限错误，客户端以及当前我这个用户及用户组无权访问网站部署目录下的目录，所以只要更改一下Apache的配置就行了。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 打开 /etc/apache2/&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 编辑目录下的 apache2.conf 文件&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;vim apache2.conf
&lt;span class=&quot;c&quot;&gt;# 找到以下两行，并修改用户和用户组&lt;/span&gt;
...
User  www-data &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; User  vagrant
Group www-data &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; Group vagrant
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这时，重启Apache服务器，无论是建立软链接还是使用配置更改网站根目录都可以正常访问了。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service apache2 restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;apache服务器不同站点及端口的设置&quot;&gt;Apache服务器不同站点及端口的设置&lt;/h3&gt;

&lt;p&gt;在新的Apache2的配置信息中，将站点信息配置和功能模块配置等等配置信息个分成了两类目录，它们分别是对应的可用配置目录（*-available/）和已被使用的配置目录（*-enabled/），而每个被使用的配置目录下的文件其实就是可用配置目录下文件的软链接，而开启关闭这些配置，可以用下面的命令实现。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-tree&quot;&gt;/etc/apache2
     |__ apache2.conf
     |__ conf-availiable/
     |    |__ ...可用的配置文件
     |__ conf-enabled/
     |    |__ ...被使用的配置文件，实际上就是软链接
     |        $ sudo a2enconf filename  使用配置
     |        $ sudo a2disconf filename 取消使用
     |__ envvars
     |__ magic
     |__ mods-available/
     |    |__ ...可用的模块配置
     |__ mods-enabled/
     |    |__ ...被用的模块配置
     |        $ sudo a2enmod  filename
     |        $ sudo a2dismod filename
     |__ ports.conf  监听端口号配置
     |__ sites-available/
     |    |__ ...可用的站点配置，之后的站点配置都可以写在这
     |__ sites-enabled/
          |__ ...正在使用的站点
              $ sudo a2ensite  filename
              $ sudo a2dissite filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;比如，我要建立一个在&lt;strong&gt;8080&lt;/strong&gt;上的，对应站点根目录在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/var/path/to/mysite/&lt;/code&gt;的站点，首先，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/apache2/sites-available/&lt;/code&gt;目录下，复制&lt;strong&gt;000-default.conf&lt;/strong&gt;（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo cp 000-default.conf 001-mysite.conf&lt;/code&gt;），并编辑。&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 1. 修改 001-mysite.conf 文件
&lt;span class=&quot;nt&quot;&gt;&amp;lt;VirtualHost&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;*:8080&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  ....
	DocumentRoot /var/path/to/mysite
  ....
	ErrorLog ${APACHE_LOG_DIR}/mysite.error.log
	CustomLog ${APACHE_LOG_DIR}/mysite.access.log combined
  ....
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;

# 2. 修改监听端口配置 ports.conf
Listen 80
Listen 8080
....
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改完后，使用命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo a2ensite 001-mysite.conf&lt;/code&gt;，然后重启Apache服务器（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo service apache2 restart&lt;/code&gt;），访问 host-only-ip:8080就可以看到自己部署的网站了。&lt;/p&gt;</content><author><name></name></author><category term="apache" /><category term="vagrant" /><category term="config" /><summary type="html">上篇博客，我讲到了如何安装Vagrant来建立一个开发环境，让自己的电脑与开发环境隔离，在文章中，我也讲到了如何在Vagrant中简单安装LAMP的web服务器，这次，我在这篇文章中，简单的讲解我在使用Vagrant做我的Apache服务器时，遇见的一些问题以及相关的解决方案。</summary></entry><entry><title type="html">使用Vagrant安装LAMP开发环境</title><link href="https://runnerwoo.com/2015/11/22/installing-LAMP-with-vagrant.html" rel="alternate" type="text/html" title="使用Vagrant安装LAMP开发环境" /><published>2015-11-22T12:45:00+08:00</published><updated>2015-11-22T12:45:00+08:00</updated><id>https://runnerwoo.com/2015/11/22/installing-LAMP-with-vagrant</id><content type="html" xml:base="https://runnerwoo.com/2015/11/22/installing-LAMP-with-vagrant.html">&lt;p&gt;上次有一篇&lt;a href=&quot;/2015/09/12/ubuntu-in-virtualbox.html&quot; target=&quot;blank&quot;&gt;博客&lt;/a&gt;讲到出于对原有系统不造成太大的破坏，想利用虚拟机服务器来做开发环境，并且，一些开发环境需要用到Linux的环境（虽然我用的也是Linux的桌面系统）。但是，现在我不想弄这么麻烦的配置方式，有没有跟快捷的开发方法，显然是有的，上次在一次学习Rails的视频中接触到了&lt;a href=&quot;https://www.vagrantup.com/&quot; target=&quot;blank&quot;&gt;Vagrant&lt;/a&gt;，这次通过安装LAMP环境，记录一下自己的使用情况。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注：我的主机是Ubuntu14.04，如果是Windows用户的话，也是可以使用Vagrant的，但是因为Windows没有自带&lt;strong&gt;SSH&lt;/strong&gt;的命令，所以要另外下载&lt;strong&gt;SSH&lt;/strong&gt;管理工具，例如&lt;a href=&quot;https://www.netsarang.com/products/xsh_overview.html&quot; target=&quot;blank&quot;&gt;XShell&lt;/a&gt;，或者下载&lt;a href=&quot;https://git-scm.com/&quot; target=&quot;blank&quot;&gt;Git&lt;/a&gt;来给系统装上&lt;strong&gt;SSH&lt;/strong&gt;命令，反正无论什么方法，只要能使用&lt;strong&gt;SSH客户端&lt;/strong&gt;即可。  &lt;br /&gt;
在此，也感谢&lt;a href=&quot;http://happypeter.github.io/rails10/01_vagrant.html&quot; target=&quot;blank&quot;&gt;happypeter&lt;/a&gt;&lt;sup id=&quot;fnref:happypeter&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:happypeter&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;的工具介绍。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;那么，下面我们开始安装Vagrant的开发环境，首先，什么是Vagrant，Vagrant就是基于开源的VirtualBox虚拟机的建立虚拟机的工具（算了，具体概念还是看官网&lt;sup id=&quot;fnref:vagrant&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:vagrant&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;好了）。下面就是介绍安装Vagrant的具体方法了。&lt;/p&gt;

&lt;p&gt;首先，在安装Vagrant前，要先安装好&lt;a href=&quot;https://www.virtualbox.org/&quot; target=&quot;blank&quot;&gt;VirtualBox&lt;/a&gt;，其中如果有人想用VMWare Workstation，在这里，我先声明一句，VMWare虚拟机是个收费的商业软件，虽然其中&lt;a href=&quot;https://my.vmware.com/cn/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0&quot; target=&quot;blank&quot;&gt;VMWare Player&lt;/a&gt;是个免费的个人软件，但是因为一些不开放的api，所以Vagrant对应的VMWare版是收费的。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;在此，特别说一下，为什么我会使用之前那个虚拟机配置方法，因为我在使用Windows操作系统中，发生了一些不知原因的网络问题，导致VirtualBox创建的虚拟机无法连接网络，所以，就用VMWare Player来配置建立开发环境了&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;下载安装VirtualBox好，并在Vagrant官网&lt;a href=&quot;https://www.vagrantup.com/downloads.html&quot; target=&quot;blank&quot;&gt;下载&lt;/a&gt;自己系统对应的版本，安装完后，打开终端，输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant -v&lt;/code&gt;来查看是否安装完毕，Windows用户可能还要配置系统的环境变量。&lt;/p&gt;

&lt;p&gt;接下来，在自己喜欢的文件夹下新建一个文件夹，在这提醒一下，这个文件夹是用来存放Vagrant的配置启动信息，以及作为与虚拟机共享的文件夹使用，而虚拟机主体是存放在VirtualBox的虚拟机创建目录下。还有，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/home/User/.vagrant.d&lt;/code&gt;中存放的是之后要用的虚拟机镜像文件（&lt;strong&gt;boxes&lt;/strong&gt;）和一些其他配置信息。然后在当前文件夹打开终端。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;vagrant
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;vagrant
&lt;span class=&quot;c&quot;&gt;# 初始化获取Vagrantfile的配置文件，且指定虚拟机系统类型为Ubuntu14.04（64位)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant init ubuntu/trusty64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后编辑&lt;strong&gt;Vagrantfile&lt;/strong&gt;配置文件，其中，先要更改分配给虚拟机的内存，知道这么几段注释并修改为，分配给虚拟机&lt;em&gt;1024MB&lt;/em&gt;内存：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;config.vm.provider &lt;span class=&quot;s2&quot;&gt;&quot;virtualbox&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; |vb|
&lt;span class=&quot;c&quot;&gt;#   # Display the VirtualBox GUI when booting the machine&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#   vb.gui = true&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#   # Customize the amount of memory on the VM:&lt;/span&gt;
  vb.memory &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1024&quot;&lt;/span&gt;
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后，就是修改&lt;strong&gt;Vagrantfile&lt;/strong&gt;的网络配置，让其使用有别于宿主机的个人ip（&lt;strong&gt;host-only&lt;/strong&gt;），找到这几段，并取消注释：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Create a private network, which allows host-only access to the machine&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# using a specific IP.&lt;/span&gt;
config.vm.network &lt;span class=&quot;s2&quot;&gt;&quot;private_network&quot;&lt;/span&gt;, ip: &lt;span class=&quot;s2&quot;&gt;&quot;192.168.33.10&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这样你就能通过访问IP，访问到虚拟机了，如果为了方便可以修改自己系统的&lt;em&gt;host&lt;/em&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my.dev 192.168.33.10&lt;/code&gt;来通过自定义域名访问该虚拟机，还有可以有时需要端口转发，找到这几段，请取消注释，在后面添加配置，使虚拟机的端口转发到主机的指定ip的端口上。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Create a forwarded port mapping which allows access to a specific port&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# within the machine from a port on the host machine. In the example below,&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# accessing &quot;localhost:8080&quot; will access port 80 on the guest machine.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 其中我设置host_ip是指定主机IP为0.0.0.0，默认是localhost&lt;/span&gt;
config.vm.network &lt;span class=&quot;s2&quot;&gt;&quot;forwarded_port&quot;&lt;/span&gt;, guest: 80, host: 8080, host_ip: &lt;span class=&quot;s2&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;更多其他详情配置，可以参考&lt;a href=&quot;https://docs.vagrantup.com/v2/&quot; target=&quot;blank&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;配置完一些基础配置后，然后就可以安装虚拟机了，这时候，只需在当前文件夹下输入命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant up&lt;/code&gt;，即可自动安装虚拟机。注意，如果是第一次使用该虚拟机系统，会先行下载虚拟机镜像存到之前提到的那个文件夹中，而且会因为不同地区时间网速等综合原因，导致下载速度不尽相同，所以，需要耐心等候，有可能速度慢的话，要1、2个小时。当然，网上还有一些关于下载的其他解决方案，因为我没查仔细，就不介绍了。&lt;/p&gt;

&lt;p&gt;漫长地等待后，就可以启动期待已久的虚拟机了。当前目录下输入命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant ssh&lt;/code&gt;即可连接到虚拟机服务器，上面提到了如果Windows没有ssh命令怎么办，使用ssh的管理软件连接&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost:2222&lt;/code&gt;，其中用户名和密码都是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant&lt;/code&gt;，或者打开之前下载的&lt;strong&gt;Git Bash&lt;/strong&gt;，使用命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vagrant ssh&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;连接完成后，就开始安装LAMP了，而&lt;strong&gt;Ubuntu Server&lt;/strong&gt;提供了一个十分好用的安装工具包，输入命令&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo tasksel&lt;/code&gt;，空格选择&lt;strong&gt;LAMP Server&lt;/strong&gt;，然后&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tab&lt;/code&gt;跳转到&lt;strong&gt;OK&lt;/strong&gt;，回车，按照可视化界面安装LAMP即可。这时，在自己的系统上访问虚拟机的IP时，看到Ubuntu的Apache欢迎界面就是成功了。&lt;/p&gt;

&lt;p&gt;对了，如果主机是zh_CN.UTF-8的本地语言，会在ssh连接之后，报本地化啥啥的警告，只要做好配置即可，另外，还有时区的设置。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 设置语言环境&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;locale-gen zh_CN.UTF-8 en_US.UTF-8
&lt;span class=&quot;c&quot;&gt;# 设置时区&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;tzselect
&lt;span class=&quot;c&quot;&gt;# 按照要求选择时区，Asia-&amp;gt;China-&amp;gt;Beijing，然后设置时区&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo cp&lt;/span&gt; /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;另外，附上一些Vagrant的常用命令：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# 初始化虚拟机 box.name为.vagrant.d下boxes中的虚拟机镜像&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant init box.name
&lt;span class=&quot;c&quot;&gt;# 开启虚拟机，前提当前文件夹下有Vagrantfile&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant up
&lt;span class=&quot;c&quot;&gt;# 关闭虚拟机&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant halt
&lt;span class=&quot;c&quot;&gt;# 修改完配置信息后，重启虚拟机&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant reload
&lt;span class=&quot;c&quot;&gt;# 连接虚拟机&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant ssh
&lt;span class=&quot;c&quot;&gt;# 保存（休眠）虚拟机&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant &lt;span class=&quot;nb&quot;&gt;suspend&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# 恢复（唤醒）虚拟机&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vagrant resume
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当然，这一切只是开端，之后还有Apache服务器配置，以及PHP各种蛋疼的编码适配等等。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;相关参考链接：&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.ituring.com.cn/minibook/10949&quot; target=&quot;blank&quot;&gt;图灵社区 - 合集 - Vagrant学习手册&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://happypeter.github.io/rails10/&quot; target=&quot;blank&quot;&gt;happypeter的Rails十日谈&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://wiki.ubuntu.org.cn/LAMP_%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE&quot; target=&quot;blank&quot;&gt;Apache的安装配置 - Ubuntu中文论坛&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://blog.sina.com.cn/s/blog_6c9d65a1010145st.html&quot; target=&quot;blank&quot;&gt;ubuntu server设置时区和更新时间_汉斯的遗忘_新浪博客&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:happypeter&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;http://happypeter.github.io/rails10/01_vagrant.html&quot; target=&quot;blank&quot;&gt;使用 vagrant 安装 ubuntu 系统 - happypeter&lt;/a&gt; &lt;a href=&quot;#fnref:happypeter&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:vagrant&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://www.vagrantup.com/&quot; target=&quot;blank&quot;&gt;Vagrant的官网网址：https://www.vagrantup.com/&lt;/a&gt; &lt;a href=&quot;#fnref:vagrant&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name></name></author><category term="vagrant" /><category term="php" /><category term="apache" /><summary type="html">上次有一篇博客讲到出于对原有系统不造成太大的破坏，想利用虚拟机服务器来做开发环境，并且，一些开发环境需要用到Linux的环境（虽然我用的也是Linux的桌面系统）。但是，现在我不想弄这么麻烦的配置方式，有没有跟快捷的开发方法，显然是有的，上次在一次学习Rails的视频中接触到了Vagrant，这次通过安装LAMP环境，记录一下自己的使用情况。</summary></entry></feed>