Skip to content

virtualbox vagrant gitbash入门

王伟兵 edited this page Apr 21, 2021 · 29 revisions

安装三个软件:

virtualbox的下载页面上,需要额外下载Extension Pack。然后通过virtualbox的菜单全局设定->扩展来安装扩展包。

概述

virtualbox、vagrant、git三个软件中,git会安装git bash工具,git bash可以充当linux终端窗口软件使用。

  1. 通过windows开始菜单点git bash快捷项,启动git bash窗口。git bash窗口中可以直接使用linux命令,如cd(进目录)、mkdir(创建目录)等。
  2. 在git bash窗口中创建vagrant工作目录。如果windows下安装了多个盘符,如c: 、d:等,则需要映射到linux的目录。如当前在c:盘中,要进入d:/temp目录,需要输入$ cd /d/temp。如果把windows目录e:/vagrant做为工作目录,则:
$ cd /e
$ mkdir vagrant
$ cd vagrant
  1. 如下文的“vagrant入门”中说明的编辑Vagrantfile文件,执行vagrant up和vagrant ssh。
  2. 执行vagrant ssh后就离开了windows,进入了linux。可参照下文的“常用linux命令”来学习基本的linux操作。
  3. 如果需要docker环境,则需要安装docker引擎,可参考Docker入门。 也可参考docker官方的docker引擎安装说明和docker-compose安装说明。

vagrant入门 

1.建个目录(如C:/U),在鼠标右键菜单中选择“Git Bash”。然后执行vagrant init,发现目录下新建了一个Vagrantfile文件。
2.修改Vagrantfile文件将base换成ubuntu/xenial64 (其他的镜像参考这个链接)

config.vm.box = "ubuntu/xenial64"

执行(如果是第一次执行vagrant up,由于需要从网上下载镜像会很慢):

$ vagrant up (启动虚拟机)
$ vagrant ssh (进入虚拟机)

3.多虚拟机的配置文件参考Vagrantfile

可以手工将Vagrantfile修改为:

Vagrant.configure("2") do |config|
        config.vm.box = "ubuntu/xenial64"
        config.vm.define "wang1" do |wang1|
                wang1.vm.network "private_network", ip: "192.168.1.110"
                wang1.vm.hostname = "wang1"
        end
        config.vm.define "wang2" do |wang2|
                wang2.vm.network "private_network", ip: "192.168.1.111"
                wang2.vm.hostname = "wang2"
        end
end

上面的这个配置文件支持两个虚机,而且设定了两个虚机的ip、主机名、内存大小等。
4.进入wang1

$ vagrant up wang1 wang2 (启动两个虚机)
$ vagrant ssh wang1  (登录wang1)

退出虚拟机执行$ exit
其他的vagrant命令还有:

$ vagrant halt wang1   (wang1关机)
$ vagrant destroy wang1 (将wang1虚拟机删除)
$ vagrant reload wang1 (重新加载配置文件,有时可以解决一些未知问题)

当虚机上安装了很多软件,想打包自己的虚机镜像,则:

$ vagrant package wang1 --output webb-wang1

webb-wang1是输出的镜像文件名。
在Vagrantfile中直接引用镜像文件名来定义新的虚拟机:

   config.vm.define :"wang2" do |os|
         os.vm.box = "webb-wang1"
         (略)   

vagrant的配置文件、box等位于$HOME/.vagrant.d/目录下。对于linux,$HOME相当与~,如root用户的HOME是/root。对于windows,$HOME类似于c:/users/用户名
~/.vagrant.d目录下有个insecure_private_key是vagrant的私钥,有时需要复制到Vagrantfile所在的目录。

使用自定义BOX地址

  node1.vm.box = <BOX name>
  node1.vm.box_url = <BOX_URL>

vagrant网络设置

当需要启动多个VM,并且各个VM之间可以相互通信时必须在Vagrantfile中配置网络:

1. wang2.vm.network "private_network", ip: "192.168.1.111"
2. wang2.vm.network "public_network", ip: "10.10.11.95"
3. wang2.vm.network "private_network"
4. wang2.vm.network "public_network"

1和3设置了私有网络,即hostonly网络。2和4设置了公开网络。

hostonly网络

对于hostonly网络,vagrant会自动在宿主机上添加虚拟的网卡。按1的配置,虚拟网卡ip会是192.168.1.1。
hostonly网络,同一宿主机上的各个VM之间可以互相访问,但宿主机之外的其他机器不能访问这个VM。宿主机和VM之间也可以互相访问。

public网络

VM象宿主机一样对于整个局域网是可见的,而且VM会向局域网的DHCP请求分配网络参数。如果宿主机上有多个可以上网的网卡,则虚机通过vagrant up启动的时候,会提示选择网卡。选择哪个网卡,DHCP就会按那个网卡分配网络参数。

vagrant网络bug

经常碰到vagrant将enp0s3配置了两遍,而enp0s8缺没有配置情况。这导致了错误的网络配置文件/etc/network/interfaces:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp
pre-up sleep 2
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
auto enp0s3
iface enp0s3 inet dhcp
    post-up route del default dev $IFACE || true
#VAGRANT-END

可以看到enp0s3被配置两次。为了修正这一错误,首先将下面的vagrant自动生成的内容修改为:

···
# The contents below are automatically generated by Vagrant. Do not modify.
auto enp0s8
iface enp0s8 inet dhcp
···

然后修改/etc/resolv.conf为正确的nameserver:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.2.3
nameserver 10.100.1.12
nameserver 10.100.1.13

重启网卡:

$ /etc/init.d/networking restart

测试一下是否一下OK:

$ apt-get update

git bash入门

打通了windows和linux,可以在windows文件系统下使用linux命令。
可以将文件在windows和linux之间用scp命令。为了演示scp先建个用户:

$ useradd -d /usr/webb -m webb
$ passwd webb 为webb用户创建密码

在windows利用鼠标右键菜单进入git bash:

$ echo "12345" > t.tt
$ scp t.tt [email protected]:/usr/webb/    (按提示输入webb用户的密码)

上述命令会把windows当前目录下新建的t.tt文件远程复制到linux的/usr/webb/目录下。
如果把linux下的文件复制到windows下则:

$ scp [email protected]:/usr/webb/t.tt .   (t.tt后面跟空格和点)

常用linux命令

$ sudo su - root 切换用户到root
$ rm -rf <dir name>   删除目录及下属
$ alias ll='ls -l' 定义别名
$ export PATH=$PATH:/usr/webb    定义环境变量
$ echo {\"path\": \"$PATH\"} | jq
$ chmod +x run.sh 或 chmod 777 run.sh    修改文件权限
$ netstat -an | grep 8080 查看谁占用了8080端口

### 几个符号

~表示用户的home位置,如cd ~
$PWD表示当前目录,如echo $PWD
. 当前目录,但有时. run.sh表示执行脚本文件run.sh。与./xxx.sh类似,有时让人困扰。
|管道符。如echo '{"name": "webb"}' | jq
\转义符(反斜线),除了前面的echo转义引号外,还用于把长命令拆成多行(忽略回车)。如:

$ curl -X POST http://127.0.0.1:5984/demo \
            -d '{"company": "Example, Inc."}'

解压命令

  1. 对于.tar结尾的文件   tar -xf all.tar
  2. 对于.gz结尾的文件  gzip -d all.gz   gunzip all.gz
  3. 对于.tgz或.tar.gz结尾的文件   tar -xzf all.tar.gz   tar -xzf all.tgz
  4. 对于.bz2结尾的文件   bzip2 -d all.bz2   bunzip2 all.bz2
  5. 对于tar.bz2结尾的文件   tar -xjf all.tar.bz2
  6. 对于.Z结尾的文件   uncompress all.Z
  7. 对于.tar.Z结尾的文件   tar -xZf all.tar.z
  8. 对于.zip结尾文件,apt-get install unzip,然后unzip xxx.zip

进程命令

$ ps -ef | grep docker   查看docker服务的进程号

ps的参数:
-a :all,表示列出所有的连接,服务监听,Socket资料
-t :tcp,列出tcp协议的服务
-u :udp,列出udp协议的服务
-n :port number, 用端口号来显示
-l :listening,列出当前监听服务
-p :program,列出服务程序的PID

更大的box

上面提到的box ubuntu/xenial64默认的虚拟硬盘较小,只有10G,很多时候不大够用。现在发现一个更大的ubuntu box:bento/ubuntu-16.10。具体的操作如下:

$ vagrant box add bento/ubuntu-16.10
$ mkdir temp && cd temp
$ vagrant init bento/ubuntu-16.10
$ vagrant up && vagrant ssh

这个box的官方地址是https://github.com/chef/bento

软符号链接

命令格式:

$ ln -s 目标文件或目录 符号链接名

例如:

$ ln -s ../HDP HDP

对上面命令的解释:由于把HDP目录移动到了上级目录下,建立一个软符号链接保证以前的程序可以在老路径下找到HDP目录。

AWK

语法:

$ awk '{pattern + action}' {filenames}
$ awk -F '分隔符' '{pattern + action}' {filenames}         (默认分隔符是空格,-F参数可以指定其他分隔符)

举个例子:

$ last -n 5             
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)
$ last -n 5 | awk  '{print $1 " " $2}'
root pts/1
root pts/1
root pts/1
dmtsai pts/1
root tty1

vagrant共享目录

通过synced_folder将相对于Vagrantfile目录的某个目录挂载到linux下。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/ubuntu-16.04"
  # share folder
  config.vm.synced_folder "../../../vagrant10/ambari-vagrant/fabric/devenv/images", "/docker_images"
(略)
Clone this wiki locally