-
Notifications
You must be signed in to change notification settings - Fork 30
virtualbox vagrant gitbash入门
安装三个软件:
virtualbox的下载页面上,需要额外下载Extension Pack。然后通过virtualbox的菜单全局设定->扩展
来安装扩展包。
virtualbox、vagrant、git三个软件中,git会安装git bash工具,git bash可以充当linux终端窗口软件使用。
- 通过windows开始菜单点git bash快捷项,启动git bash窗口。git bash窗口中可以直接使用linux命令,如cd(进目录)、mkdir(创建目录)等。
- 在git bash窗口中创建vagrant工作目录。如果windows下安装了多个盘符,如c: 、d:等,则需要映射到linux的目录。如当前在c:盘中,要进入d:/temp目录,需要输入
$ cd /d/temp
。如果把windows目录e:/vagrant做为工作目录,则:
$ cd /e
$ mkdir vagrant
$ cd vagrant
- 如下文的“vagrant入门”中说明的编辑Vagrantfile文件,执行vagrant up和vagrant ssh。
- 执行vagrant ssh后就离开了windows,进入了linux。可参照下文的“常用linux命令”来学习基本的linux操作。
- 如果需要docker环境,则需要安装docker引擎,可参考Docker入门。 也可参考docker官方的docker引擎安装说明和docker-compose安装说明。
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所在的目录。
node1.vm.box = <BOX name>
node1.vm.box_url = <BOX_URL>
当需要启动多个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网络,vagrant会自动在宿主机上添加虚拟的网卡。按1的配置,虚拟网卡ip会是192.168.1.1。
hostonly网络,同一宿主机上的各个VM之间可以互相访问,但宿主机之外的其他机器不能访问这个VM。宿主机和VM之间也可以互相访问。
VM象宿主机一样对于整个局域网是可见的,而且VM会向局域网的DHCP请求分配网络参数。如果宿主机上有多个可以上网的网卡,则虚机通过vagrant up
启动的时候,会提示选择网卡。选择哪个网卡,DHCP就会按那个网卡分配网络参数。
经常碰到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
打通了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后面跟空格和点)
$ 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."}'
- 对于.tar结尾的文件 tar -xf all.tar
- 对于.gz结尾的文件 gzip -d all.gz gunzip all.gz
- 对于.tgz或.tar.gz结尾的文件 tar -xzf all.tar.gz tar -xzf all.tgz
- 对于.bz2结尾的文件 bzip2 -d all.bz2 bunzip2 all.bz2
- 对于tar.bz2结尾的文件 tar -xjf all.tar.bz2
- 对于.Z结尾的文件 uncompress all.Z
- 对于.tar.Z结尾的文件 tar -xZf all.tar.z
- 对于.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 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 '{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
通过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"
(略)