我已经主要使用 Linux 大约 10 年了，而且主要是 Ubuntu。但在最新发布的版本中，我决定重新回到我通常不喜欢的操作系统： Windows 10。我一直是 Linux 的粉丝，我最喜欢的两个发行版是 Debian 和 Ubuntu。现今作为一个服务器操作系统，Linux 是完美无暇的，但在桌面上一直存在不同程度的问题。最近一系列的问题让我意识到，我不需要使用 Linux 作为我的桌面操作系统，我仍然是一个 Linux 粉丝，但基于我安装 Ubuntu 17.10 的经验，我已经决定回到 Windows。什么使我选择了回归问题是，当 Ubuntu 17.10 出来后，我像往常一样进行全新安装，但遇到了一些非常奇怪的新问题。Dell D3100 Dock 不再工作（包括临时规避方案也没用）Ubuntu 意外死机（随机）双击桌面上的图标没反应使用 HUD 搜索诸如“tweaks”之类的程序会尝试安装 META 桌面版本GUI 比标准的 GNOME 感觉更糟糕现在我确实考虑回到使用 Ubuntu 16.04 或另一个发行版，但是我觉得 Unity 7 是最精致的桌面环境，而另外唯一一个优雅且稳定的是 Windows 10。除此之外，使用 Linux 而不是使用 Windows 也有一些固有的问题，如：大多数商用软件不可用，E.G Maya、 PhotoShop、 Microsoft Office（大多数情况下，替代品并不相同）等等。大多数游戏都没有移植到 Linux 上，包括来自 EA、 Rockstar Ect. 等主要工作室的游戏。对于大多数硬件来说，其 Linux 驱动程序是厂商的次要考虑。在决定使用 Windows 之前，我确实考虑过其他发行版和操作系统。与此同时，我看到了更多的“微软爱 Linux ”的行动，并且了解了 WSL。他们的新开发者的关注角度对我来说很有意思，于是我试了一下。我在 Windows 找到了什么我使用计算机主要是为了编程，我也使用虚拟机、git 和 ssh，并且大部分工作依赖于 bash。我偶尔也会玩游戏，观看 netflix 和一些轻松的办公室工作。总之，我期待在 Ubuntu 中保留当前的工作流程并将其移植到 Windows 上。我也想利用 Windows 的优点。所有的 PC 游戏支持 Windows大多数程序是原生的微软办公软件虽然使用 Windows 有很多坑，但是我打算正确对待它，所以我不担心一般的 Windows 故障，例如病毒和恶意软件。Windows 的子系统 Linux（Windows 上的 Ubuntu 中的 Bash）微软与 Canonical 的密切合作将 Ubuntu 带到了 Windows 上。在经过快速设置和启动程序之后，你将拥有非常熟悉的 bash 界面。我一直在研究其局限性，但是在写这篇文章时我碰到的唯一真正的限制是它从硬件中抽象了出来。例如，lsblk 不会显示你有什么分区，因为子系统里的 Ubuntu 没有提供这些信息。但是除了访问底层工具之外，我发现其体验非常熟悉，也很棒。我在下面的工作流程中使用了它。生成 SSH 密钥对使用 Git 和 Github 来管理我的仓库SSH 到几个服务器，包括不用密码为本地数据库运行 MySQL监视系统资源使用 Vim 编辑配置文件运行 Bash 脚本运行本地 Web 服务器运行 PHP、NodeJS到目前为止，它已经被证明是非常强大的工具。除了是在 Windows 10 用户界面之中，我的工作流程感觉和我在 Ubuntu 上几乎一样。尽管我的多数工作可以在 WSL 中处理，但我仍然打算通过虚拟机进行更深入的工作，这可能超出了 WSL 的范围。不需要用 Wine我遇到的另一个主要问题是兼容性问题。我很少使用 Wine 来使用 Windows 软件。（LCTT 译注：Wine 是可以使 Linux 上运行 Windows 应用的软件）但是有时它是必需的，尽管通常体验不是很好。HeidiSQL我首先安装的程序之一是 HeidiSQL，它是我最喜欢的数据库客户端之一。它可以在 Wine 下工作，但是感觉很不好，所以我在 Linux 下丢掉它而使用了 MySQL Workbench。回到了 Windows 中，就像一个可靠的老朋友回来了。游戏平台 / Steam没有游戏的 Windows 电脑是无法想象的。我从 Steam 的网站上安装了它，我的 Linux 游戏，加上我的 Windows 游戏就变大了 5 倍，并且包括 GTA V （LCTT 译注： GTA V 是一款名叫侠盗飞车的游戏) 等 AAA 级游戏。而这些我在 Ubuntu 中只能梦想。我对 SteamOS 有很大的期望，并且一直会持续如此。但是我认为在可预见的将来，它不会在任何地方的游戏市场中崭露头角。所以如果你想在 PC 上玩游戏，你确实需要 Windows。还有一点需要注意的是， 你的 nvidia 显卡的驱动程序会得到很好的支持，这使得像 TF2 （LCTT 译注： 这是一款名叫军团要塞 2 的游戏）这样的一些 Linux 原生游戏运行的稍好一些。Windows 在游戏方面总是优越的，所以这并不令人感到意外。从 USB 硬盘运行，为什么我在我的主固态硬盘上运行 Linux，但在过去，我是从 usb 棒和 usb 硬盘运行它的。我习惯了 Linux 的这种持久性，这让我可以在不丢失主要操作系统的情况下长期尝试多个版本。现在我尝试将 Windows 安装到 USB 连接的硬盘上时，它无法工作也不可能工作。所以当我将 Windows 硬盘分区的克隆作为备份时，我很惊讶我可以通过 USB 启动它。这对我来说已经成为一个方便的选择，因为我打算将我的工作笔记本电脑迁移回 Windows，但如果不想冒险，那就把它扔在那里吧。所以我在过去的几天里，我使用 USB 来运行它，除了一些错误的消息外，我没有通过 USB 运行发现它真正的缺点。这样做主要的问题是：较慢的启动速度恼人的信息：不要拔掉你的 USB无法激活它我可能会写一篇关于 USB 驱动器上的 Windows 的文章，这样我们可以有更详细的了解。那么结论是什么？我使用 Windows 10 大约两周了，并没有注意到它对我的工作流程有任何的负面影响。尽管过程会有一些小问题，但我需要的所以工具都在手边，并且操作系统一般都在运行。我会留在 Windows吗？虽然现在还为时尚早，但我想在可见的未来我会坚持使用 Windows。via: https://www.chris-shaw.com/blog/my-adventure-migrating-back-to-windows作者：Christopher Shaw 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Vagrant 对于虚拟机来说是一个强大的工具，在这里我们将研究如何在 Ubuntu 上设置和使用 Virtualbox 和 Vagrant 来提供可复制的虚拟机。虚拟机，并不复杂多年来，开发人员一直使用虚拟机作为其工作流程的一部分，允许他们交换和更改运行软件的环境，这通常是为了防止项目之间的冲突，例如需要 php 5.3 的项目 A 和需要 php 5.4 的项目 B。并且使用虚拟机意味着你只需要你正在使用的计算机就行，而不需要专用硬件来镜像你的生产环境。当多个开发人员在一个项目上工作时，它也很方便，他们都可以运行一个包含所有需求的环境，但是维护多台机器并确保所有的需求都具有相同的版本是非常困难的，这时 Vagrant 就能派上用场了。使用虚拟机的好处你的虚拟机与主机环境是分开的你可以根据你代码的要求裁剪一个定制虚拟机不会影响其他虚拟机可以运行在你的主机上无法运行的程序，例如在 Ubuntu 中运行一些只能在 Windows 运行的软件什么是 Vagrant简而言之，这是一个与虚拟机一起工作的工具，可以让你自动创建和删除虚拟机。它围绕一个名为 VagrantFile 的配置文件而工作，这个配置文件告诉 Vagrant 你想要安装的操作系统，以及一些其他选项，如 IP 和目录同步。 你还可以在虚拟机上添加一个命令的配置脚本。通过共享这个 VagrantFile，项目的所有开发人员全可以使用完全相同的虚拟机。安装要求安装 VirtualBoxVirtualBox 是运行虚拟机的程序，它可以从 Ubuntu 仓库中安装。sudo apt-get install virtualbox 安装 Vagrant对于 Vagrant 本身，你要前往 https://www.vagrantup.com/downloads.html 查看适用于你的操作系统的安装软件包。安装增强功能如果你打算与虚拟机共享任何文件夹，则需要安装以下插件。vagrant plugin install vagrant-vbguest 配置 Vagrant首先我们需要为 Vagrant 创建一个文件夹。mkdir ~/Vagrant/test-vm cd ~/Vagrant/test-vm 创建 VagrantFile：vagrant init 开启虚拟机：vagrant up 登录机器：vagrant-ssh 此时，你将拥有一个基本的 vagrant 机器，以及一个名为 VagrantFile 的文件。定制在上面的步骤中创建的 VagrantFile 看起来类似于以下内容VagrantFile：# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "base" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. # config.vm.synced_folder "../data", "/vagrant_data" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end 现在这个 VagrantFile 将创建基本的虚拟机。但 Vagrant 背后的理念是让虚拟机为我们的特定任务而配置，所以我们删除注释和调整配置。VagrantFile：# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # Set the Linux Version to Debian Jessie config.vm.box = "debian/jessie64" # Set the IP of the Box config.vm.network "private_network", ip: "192.168.33.10" # Sync Our Projects Directory with the WWW directory config.vm.synced_folder "~/Projects", "/var/www/" # Run the following to Provision config.vm.provision "shell", path: "install.sh" end 现在我们有一个简单的 VagrantFile，它将 Linux 版本设置为 debian jessie，设置一个 IP 给我们使用，同步我们感兴趣的文件夹，并最后运行 install.sh，这是我们可以运行 shell 命令的地方。install.sh：#! /usr/bin/env bash # Variables DBHOST=localhost DBNAME=dbname DBUSER=dbuser DBPASSWD=test123 echo "[ Provisioning machine ]" echo "1) Update APT..." apt-get -qq update echo "1) Install Utilities..." apt-get install -y tidy pdftk curl xpdf imagemagick openssl vim git echo "2) Installing Apache..." apt-get install -y apache2 echo "3) Installing PHP and packages..." apt-get install -y php5 libapache2-mod-php5 libssh2-php php-pear php5-cli php5-common php5-curl php5-dev php5-gd php5-imagick php5-imap php5-intl php5-mcrypt php5-memcached php5-mysql php5-pspell php5-xdebug php5-xmlrpc #php5-suhosin-extension, php5-mysqlnd echo "4) Installing MySQL..." debconf-set-selections <<< "mysql-server mysql-server/root_password password secret" debconf-set-selections <<< "mysql-server mysql-server/root_password_again password secret" apt-get install -y mysql-server mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME" mysql -uroot -p$DBPASSWD -e "grant all privileges on $DBNAME.* to '$DBUSER'@'localhost' identified by '$DBPASSWD'" echo "5) Generating self signed certificate..." mkdir -p /etc/ssl/localcerts openssl req -new -x509 -days 365 -nodes -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key chmod 600 /etc/ssl/localcerts/apache* echo "6) Setup Apache..." a2enmod rewrite > /etc/apache2/sites-enabled/000-default.conf echo " ServerAdmin webmaster@localhost DocumentRoot /var/www/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined " >> /etc/apache2/sites-enabled/000-default.conf service apache2 restart echo "7) Composer Install..." curl --silent https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer echo "8) Install NodeJS..." curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - apt-get -qq update apt-get -y install nodejs echo "9) Install NPM Packages..." npm install -g gulp gulp-cli echo "Provisioning Completed" 通过上面的步骤，在你的目录中会有 VagrantFile 和 install.sh，运行 vagrant 会做下面的事情：采用 Debian Jessie 来创建虚拟机将机器的 IP 设置为 192.168.33.10同步 ~/Projects 和 /var/www/ 目录安装并设置 Apache、Mysql、PHP、Git、Vim安装并运行 Composer安装 Nodejs 和 gulp创建一个 MySQL 数据库创建自签名证书通过与其他人共享 VagrantFile 和 install.sh，你可以在两台不同的机器上使用完全相同的环境。via: https://www.chris-shaw.com/blog/how-to-install-and-setup-vagrant作者：Christopher Shaw 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出