安装虚拟机
首先从阿里镜像官网下载centos6.5的ISO镜像文件,然后用VMware安装centos的虚拟机。
填写需要创建的虚拟机的基本配置信息,暂时把内存设为1GB,硬盘最大20GB。然后就是把刚刚下载的ISO镜像放入安装引导,进入centos6.5系统的安装步骤。安装步骤非常简单,就是一直填写一些配置信息即可。之后一直Xshell来连接虚拟机,因为它比自带的centos终端界面更加友好,功能更加强大。由于安装的centos6.5系统自带了图形化界面,但是图形化界面太消耗内容了,所以就关闭了开机启动图形化界面,在/etc/inittab将原先的"id:5:initdefault:"中的5修改为3即可。
配置虚拟机
- 网络配置
虚拟机的配置最主要的是网络,其目的是使得所有的虚拟机既可以访问到外网,也可以相
互之间ping得通。这里采用NAT+仅主机模式实现。
首先给出虚拟机网络通信的原理图
在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。VMware Network Adapter VMnet8虚拟网卡主要是为了实现主机与虚拟机之间的通信。
配置子网和网关
因为虚拟机默认开机是不会加载网络服务的,所以还需要修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,使开机自动启动。
IP地址采用动态主机配置协议dhcp进行自动分配ip地址。
但是考虑到之后所用的一些组件(如zookeeper的配置文件)需要配置ip地址,如果采取动态分配ip地址的方法,ip地址改变后,配置就会随之失败,所以改为静态ip地址的配置方法。
静态ip地址需要修改/etc/sysconfig/network-scripts/ifcfg-eth0文件
首先将BOOTPROTP改为静态获取ip地址,然后填写和上面vmware网络处于一个网段的ip地址和对应的子网掩码,最后网关填写vmware填写的网关,DNS填写自己想要的DNS服务器。
因为改为了静态获取ip地址和网关等,还需要修改宿主机上VMware Network Adapter VMnet8的ip地址的网关,才能使得主机和虚拟机之间相互通信,最后需要注意的是要关闭虚拟机和宿主机的防火墙,不然会使得ping不通。
填写刚刚配置的网关。
然后就可以获得静态ip地址的虚拟机了。
- Java运行环境配置
虽然下载的centos系统中自带了openjdk的,但是openjdk和oracle的JDK之间有很多细节的东西不一样,而且oracle的JDK比openjdk也多了许多功能,所以先卸载openjdk再安装oracle的JDK。
使用rpm -qa | grep java命令先查看系统自带的jdk相关的内容,其中rpm是包管理工具,所以rpm -qa就是获取所有被安装的rpm package.而|符号是管道,意思是前者的输出作为后者的输入。Grep java意思是搜索出所有包含java字符的项目,所以这条命令合起来就是搜索出所有的java相关的包。得到了openjdk相关的包后并将其用rm命令删除。然后在oracle官网下载JDK的tar.gz包,放进新建的/export/server目录,因为linux的目录各有自己表示的意义,所以这里新建一个自己的目录。使用tar zxvf jdk-8u151-linux-x64.tar.gz命令进行解压。最后将Java添加至环境变量即可,在/etc/profile文件末尾添加如下内容并保存。
最后使用source /etc/profile命令使环境变量的配置文件重新加载,然后使用Java-version测试效果。
前几天在配置zookeeper过程中也配置了Java,当时顺便写了篇博客,里面有比较详细的配置过程:https://www.jianshu.com/p/a3ae0332d644
- python运行环境
由于linux操作系统自带python2,而且操作系统的一些命令依赖于python2,,所以不能卸载或者升级,所以选择安装python2和python3共存的环境。wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz下载python的压缩包,并使用tar xf命令进行解压。
1、准备编译环境,这是为了使后面的编译过程顺利
yum groupinstall 'Development Tools'
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel
2、下载 Python3.5代码包
wget <u>https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz</u>
3、编译
tar Jxvf Python-3.5.2.tar.xz
cd Python-3.5.2
./configure --prefix=/usr/local/python3 使用prefix指定python安装的位置,通过执行脚本./configure开始编译, 这一过程可以决定系统的配置并创建相应的Makefile和make文件
make && make install 最后执行相应的Makefile和make文件即可安装好python
4、设置环境变量
echo 'export PATH=$PATH:/usr/local/python3/bin' >> ~/.bashrc
echo是指定输入内容,>>是追加至目标文件
5、设置目录
ln -sv /usr/local/python3/bin/python3.5 /usr/bin/python
通过上面命令可以在/usr/bin/python3路径下创建一软链接文件python,当访问此链接文件,就可以间接地访问/usr/local/python3/bin/python3.5下的python程序了。这种方式与windows下的快捷方式类似。这是为了输入python3执行调用的是python3.5的命令
Python3安装完成。
Python的安装方式和Java有一定的差别。Python包中没有bin文件可以用来直接执行python文件,而需要对源码进行编译,然后创建软链接步骤才行。这个过程补充学习了编译过程:
1).configure 检查编译环境;
2)make对源代码进行编译;
3)make insall 将生成的可执行文件安装到当前计算机中
make和makefile作用,和创建软链接的相应命令ln以及软链接作用。顺带学习了使用echo来写入内容到指定文件,还有>和>>的区别,一个是覆盖,一个是追加。
4、mysql服务端
首先使用rpm -qa | grep mysql查询系统是否自带mysql,然后使用rpm -e mysql删除发现报错,查看错误信息得是因为依赖冲突,因为yum是可以将依赖关系自动解决,所以使用yum remove进行删除。
因为默认yum没有mysql5.7,所以添加第三方软件库
从mysql的官网下载mysql57-community-release-el6-5.noarch.rpm
wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
安装rpm文件
yum install mysql-community-release-el6-5.noarch.rpm
查看mysql的安装源是否可用,如不可用请自行修改配置文件(/etc/yum.repos.d/mysql-community.repo)使mysql57下面的enable=1
若有mysql其它版本的安装源可用,也修改配置文件使其enable=0
使用yum安装mysql:
yum install mysql-community-server
启动mysql服务
修改mysql密码
首先修改mysql的配置文件vim /etc/my.cnf
意思是跳过密码可以直接登陆,然后就直接登陆进mysql数据库,接着进入名字为mysql的数据库修改控制用户密码的字段authentication_string(以前控制密码的字段为password,后来改名为authentication_string了)。
update MySQL.user set authentication_string=password('新密码') where user='root'
修改密码完成后重启数据库服务(service mysqld restart)就可以用密码登陆至数据库了
查看mysqld是否开机自启动,并设置为开机自启动:
修改字符集为UTF-8:
更改配置文件/etc/my.cnf
最后再把刚刚加进配置文件的表示跳过密码登陆的命令去掉。
虽然只是安装了mysql,但是这个过程也重新学习了centos安装软件的几种方式。
rpm:安装本地自己下载的rpm软件包,自己解决软件之间的依赖。 yum:在线安装,可以解决依赖问题。
源码安装:1.下载源代码 2.解压 3.进入解压目录 4../configure 5.make 6.make install
系统目录结构
Linux系统的目录结构整体呈现为树状结构
几个主要的目录作用
/bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令。
/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
/dev : dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
/etc: 这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home: 用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
/lib: 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
/media: linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
/mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/opt: 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/proc: 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/root: 该目录为系统管理员,也称作超级权限者的用户主目录。
/sbin: s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
/selinux: 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/srv: 该目录存放一些服务启动之后需要提取的数据。
/sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
/tmp: 这个目录是用来存放一些临时文件的。
/usr: 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
/usr/bin: 系统用户使用的应用程序。
/usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src:内核源代码默认的放置目录。
/var: 这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
文件操作
基本属性:
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:
第一个字母d表示目录,-表示文件,l表示链接文档。接下来的字符中,以3个为一组,且均为rwx的三个参数的组合,分别表示读写执行,没有相应的权限则用-号表示。
1-3位表示该文件所有者拥有文件的权限,4-6位表示所有者的同组用户拥有的权限,7-9位表示其他用户的权限。若要更改文件的权限,有两种方法,数字和符号,其中rwx分别用421表示,而文件的权限分为3个组,每个组的权限用总和表示,例如4+2+1=7,所以最高权限就是3个组都为7的时候,此时可使用命令chmod 777 文件名。
目录管理:
绝对路径: 路径的写法,由根目录 / 写起,例如:/usr/share/doc 这个目录。
相对路径: 路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。
常用命令:
ls 列出目录
ll 列出目录和详细信息
cd切换目录
pwd显示目前的目录
mkdir创建一个新的目录
rmdir删除一个空的目录
cp 复制文件或目录
rm 移除文件或目录
vim创建文件
cat 查看文件内容
tac 从最后一行开始显示
nl 显示的时候,顺道输出行号
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页
head 只看头几行
tail 只看尾巴几行
Linux链接概念
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
硬连接
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
1).删除符号连接f3,对f1,f2无影响;
2).删除硬连接f2,对f1,f3也无影响;
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
wc命令可以用来查看文件的大致信息 -c显示Bytes数
用户和用户组管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
添加新用户使用useradd命令
更改li用户的密码 passwd li
删除用户
userdel -r li
/etc/passwd文件是用户管理工作涉及的最重要的一个文件。
增加用户组 groupadd 选项 用户组
删除用户组 groupdel 选择 用户组
与用户组相关的信息都存放在/etc/group中
Linux系统资源管理
磁盘管理
df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
df 一般配置参数-h使用,因为-h表示以GBytes等格式显示,比较容易阅读
du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。
进程查看与管理
Linux操作系统和windows一样,都存在着进程机制。
Ps命令查看进程,有几种常用参数
a 显示所有用户的所有进程(包括其它用户); u 按用户名和启动时间的顺序来显示进程; x 显示无控制终端的进程; e 显示所有进程,包括没有控制端的进程; f 用树形格式来显示进程; l 长格式输出; w 为了避免详细参数被截断,可以用多个w来让其显示完整(比如说ww或者是www); o 需要查看的选项
USER:进程的属主;
PID :进程的ID;
%CPU :进程占用的CPU百分比;
%MEM :占用内存的百分比;
VSZ :进程虚拟大小;
RSS :驻留中页的数量;
TTY :终端ID。问号表示是无终端的,也就是系统本身。
STAT :进程状态
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换(从内核2.6开始无效);
X 死掉的进程(从来没见过);
Z 僵尸进程;
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多线程
+ 位于后台的进程组;
WCHAN :正在等待的进程资源;
START : 启动进程的时间;
TIME : 进程消耗CPU的时间;
COMMAND: 启动进程的命令的名称和参数;
表示进程httpd的进程属主为root,PID为2644,cpu和内存使用率为0,处于休眠状态的后台进程,消耗cup的时间为0。
top命令会在当前终端全屏显示系统运行信息,实时跟踪系统资源的使用情况,显示内容包括CPU、内存占用情况,系统运行进程的列表和每一个进程运行的状态等信息,对于分析系统运行中的问题很有帮助。
这里遇到个小BUG,发现时间有问题,应该是因为这里的系统时间取的是硬件时间,这里是虚拟硬件,也就是供电时间。解决办法是将时间与网络时间同步:
安装ntpdate工具 yum -y install ntp ntpdate
设置系统时间与网络时间同步 ntpdate cn.pool.ntp.org
将系统时间写入硬件时间 hwclock --systohc
Top命令
第一行表示当前时间 系统运行时间 当前登录用户数 load average系统负载
第二行表示Tasks: 86 total :系统总的进程数1 running :正在运行的进程数84 sleeping:休眠状态的进程数1 stopped :停止的进程数 0 zombie :僵尸进程数
第三行表示cup的各种使用率
第四行表示 total: 物理内存总量 used :已使用的物理内存 free :未使用的物理内存 buffers :内核缓存占用的物理内存
第五行表示 total :交换分区总容量used:已使用的交换分区容量free:未使用的交换分区容量cached :缓存的总容量
后面各进程的信息意思就是头部字段的表面意思了。
启动进程的方式是根据各程序开始的命令启动程序对应的进程
杀进程是根据进程的ID执行命令kill -9 进程ID
服务添加与管理
Linux系统中的服务和windows系统的服务在概念和作用上是差不多的,只是相关的配置方式发生了改变。
CentOS 6上的服务管理工具为chkconfig,Linux系统所有的预设服务都可以通过查看/etc/init.d/目录得到。
在centos6和7中都可以通过命令service 服务名 start|stop|restart来实现服务的控制。这里的服务名就是/etc/init.d/目录下的这些文件了。启动network除了可以使用命令service network start外,还可以使用/etc/init.d/network start。
我们可以使用命令chkconfig --list列出所有的服务及每个级别的开启状态
这里的级别(数字0~6)为系统启动级别(CentOS 7之前版本的用法,而CentOS 7已经不再严格区分级别的概念了),运行级别0、1和6被系统保留。其中0作为shutdown动作,1作为重启至单用户模式,6为重启。在一般的Linux系统实现中,都是用了2、3、4、5几个级别。在CentOS系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示图形登录方式。
查看服务状态
开启服务
停止服务运行
重新启动服务
使得服务开机自启
查看服务开机自启动状态
服务添加
如果采用yum安装方式完成后一般会自动在系统添加相应的服务,但是如果采取源码安装方式的话,默认是不会添加系统服务的,所以需要手动添加相应的服务。因为服务都存放在/etc/init.d/下的,所以需要创建一个文件,文件名即为服务名,文件具体内容根据服务的工作定义得到。然后修改刚刚创建的文件的权限为755并用命令chkconfig xx on设置开机自启,最后用chkconfig --list检查服务是否成功创建。
最后是Vim的学习,虽然vim在平常使用过程中用得非常多,也很习惯了,但是还有很多非常好的快捷键不知道,用上了可以节约大部分开发时间。比如Ctrl+f可以翻一页之类的。由于快捷键非常的用,不能全部记住,所以在使用的时候再去查询,在多次使用中形成记忆,快捷键查询。
Linux端口监控
lsof -i:端口号
netstat -tunlp|grep 端口号
两种都可以查看指定端口被哪个进程占用
如果后面不跟grep可以查看所有tcp udp端口的占用情况
IDEA
在Java开发环境的选择上,我选择了IDEA,因为IDEA几乎包括了Eclipse的所有功能,并且IDEA的代码补全功能更是十分的强大。由于以前使用IDEA开发过很多Java服务端项目,所以IDEA得使用已经比较熟悉了,就暂时不用再学习了。
复制虚拟机
为了更加方便的得到3台虚拟机,在需要的基本组件安装好后,直接从已有的复制更加方便快捷。复制过程中虽然非常简单,但是特别需要注意的是要修改复制后的虚拟机的MAC地址,因为两台虚拟机的MAC地址一样的话违背了计算机网络中的MAC地址的定义,会出现网络问题。还有就是需要进入/etc/sysconfig/network修改主机名至新的主机名,修改hosts文件内容。
测试得此时三台虚拟机可以相互ping通和ping外网baidu.com
免密登录配置
环境设置
首先根据各虚拟机的主机名配置hosts文件,这样以后就可以直接访问主机名,不用输入ip地址了,3台主机的配置过程相同。
修改sshd的配置文件,去掉以下行的注释。
重启ssh服务
本机生成公钥和私钥
把公钥导入到认证文件
先将自己的公钥导入到本机的认证文件进行测试
将每台虚拟机的公钥文件导入其它两台虚拟机中导入到目标主机(用scp命令)
把公钥加入到授权列表文件中
对node2个node3重复同样的操作
修改权限
最后得到理想的结果,3台虚拟机可以两两免密登录
最后去看了一下免密登录的原理,它的原理大致是将自己的公钥写入目标主机的信任列表中,免密登录目标主机时,目标主机用它的公钥加密一个随机字符串发送给登陆者,登陆者因为有私钥可以解密,所以能识别登录者。
补充常用命令
最后补充一些漏掉的linux常用命令
command > file
将输出重定向到 file,会覆盖文件。
command < file
将输入重定向到 file。
command >> file
将输出以追加的方式重定向到 file。
n > file
将文件描述符为 n 的文件重定向到 file。
n >> file
将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m
将输出文件 m 和 n 合并。
n <& m
将输入文件 m 和 n 合并。
<< tag
将开始标记 tag 和结束标记 tag 之间的内容作为输入。
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 'user1' 的文件和目录
在top动态查看进程时,然后按下大写M按照memory排序,按下大写P按照CPU排序。
time命令用于测试一个命令的运行时间