├── .gitignore ├── README.md ├── algorithm ├── .gitkeep └── swap函数陷阱.md ├── cloud ├── Openstack Sahara组件和架构简介.md ├── docker安装和使用.md ├── docker网络原理.md ├── docker部署gitlab.md ├── sahara-architecture.png ├── sahara-architecture.svg ├── sahara-inter.png ├── static │ └── img │ │ ├── docker-and-vm.jpg │ │ ├── docker-filesystems-multilayer.png │ │ └── network.png └── 虚拟机、Docker和Hyper.md ├── docker ├── hadoop ├── .gitkeep ├── hive单机安装.md ├── kafka集群配置总结.md ├── nutch集成solr和中文分词.md ├── resources │ └── IK Analyzer 2012FF_hf1.zip ├── spark-streaming读取flume.md ├── sqoop2安装.md ├── 构建hadoop2.5.2环境下的spark1.1.1.md └── 设置sbt代理.md ├── java └── .gitkeep ├── linux ├── HowToInstallJekyll.md ├── bashArray.md ├── bashRedirect.md ├── bash字符串前美元符号的作用.md ├── cluster-arch.png ├── json格式化神器jq.md ├── kvm启动虚拟机的一些参数.md ├── nc命令实例.md ├── scriptnote.md ├── src │ └── wordCount.sh ├── ubuntu ceph安装以及使用.md ├── ubuntu终端显示中文乱码.md ├── windows安装puppet-agent问题.md ├── wordCount.md ├── 使用ansible远程执行命令.md ├── 使用moderncv创建个人简历.md ├── 使用并行ssh提高工作效率.md ├── 修改sbt和maven镜像源.md ├── 减少qcow文件大小.md ├── 制作windows-puppet镜像过程.md ├── 安装nvidia驱动.md └── 设置ssh连接会话复用.md └── packages ├── IK-Analyzer-2012FF_hf1.zip ├── linuxwangwang ├── PKGBUILD ├── aliwangwang-1.03.00-7-x86_64.pkg.tar.xz ├── aliwangwang-1.03.00-7.x86_64.rpm ├── aliwangwang_1.02.00-3_i386.deb ├── aliwangwang_1.03.00-6_amd64.deb └── aliwangwang_1.03.00-7_amd64.deb ├── pssh-2.3.1.tar.gz └── remarkable_1.61_all.deb /.gitignore: -------------------------------------------------------------------------------- 1 | test* 2 | *.class 3 | *.o 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 目录 2 | 3 | ## Linux(关于命令行工具、Devops、高可用等) 4 | 5 | 1. [ubuntu安装Nvidia驱动](/linux/安装nvidia驱动.md) 6 | 2. [ubuntu终端显示中文乱码](/linux/ubuntu终端显示中文乱码.md) 7 | 3. [bash字符串前美元符号的作用](/linux/bash字符串前美元符号的作用.md) 8 | 4. [kvm启动虚拟机的一些参数](/linux/kvm启动虚拟机的一些参数.md) 9 | 5. [中文版windows系统安装puppet agent问题](/linux/windows安装puppet-agent问题.md) 10 | 6. [制作windows-puppet镜像过程](/linux/制作windows-puppet镜像过程.md) 11 | 7. [使用bash关联数组统计词频](/linux/wordCount.md) 12 | 8. [bash数组操作总结](/linux/bashArray.md) 13 | 9. [使用moderncv创建个人简历](/linux/使用moderncv创建个人简历.md) 14 | 10. [shell碎片](/linux/scriptnote.md) 15 | 11. [ubuntu14.04安装jekyll](linux/HowToInstallJekyll.md) 16 | 12. [nc命令实例](linux/nc命令实例.md) 17 | 13. [修改sbt和maven镜像源](linux/修改sbt和maven镜像源.md) 18 | 14. [减少qcow文件大小](linux/减少qcow文件大小.md) 19 | 15. [设置ssh连接会话复用](linux/设置ssh连接会话复用.md) 20 | 16. [使用并行ssh提高工作效率](linux/使用并行ssh提高工作效率.md) 21 | 17. [ubuntu ceph安装以及使用](linux/ubuntu ceph安装以及使用.md) 22 | 18. [使用ansible远程执行命令](linux/使用ansible远程执行命令.md) 23 | 24 | ## 算法 25 | 26 | 1. [swap函数陷阱](/algorithm/swap函数陷阱.md) 27 | 28 | ## Hadoop & Spark(关于大数据、Hadoop、Spark等) 29 | 30 | 1. [hive单机安装](/hadoop/hive单机安装.md) 31 | 2. [构建hadoop2.5.2环境下的spark1.1.1](/hadoop/构建hadoop2.5.2环境下的spark1.1.1.md) 32 | 3. [设置sbt代理](hadoop/设置sbt代理.md) 33 | 4. [spark-streaming读取flume](hadoop/spark-streaming读取flume.md) 34 | 5. [nutch集成solr和中文分词](hadoop/nutch集成solr和中文分词.md) 35 | 6. [sqoop2安装](hadoop/sqoop2安装.md) 36 | 7. [kafka集群配置总结](hadoop/kafka集群配置总结.md) 37 | 38 | 39 | ## 云计算(关于Docker技术、Openstack、Mesos等技术) 40 | 41 | 1. [docker网络原理](cloud/docker网络原理.md) 42 | 2. [docker安装和使用](cloud/docker安装和使用.md) 43 | 3. [使用Docker部署Gitlab](cloud/docker部署gitlab.md) 44 | 4. [使用docker创建数据容器](cloud/使用docker创建数据容器.md) 45 | 5. [虚拟机、Docker和Hyper技术](cloud/虚拟机、Docker和Hyper.md) 46 | 6. [Openstack Sahara组件和架构简介](cloud/Openstack Sahara组件和架构简介.md) 47 | 48 | ## 笔记 49 | 50 | 1. 判断主机是虚拟机还是物理机 51 | 52 | ``` 53 | dmidecode -s system-product-name 54 | ``` 55 | 56 | **更多文章,请参考[我的博客](http://int32bit.github.io)!** 57 | -------------------------------------------------------------------------------- /algorithm/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/algorithm/.gitkeep -------------------------------------------------------------------------------- /algorithm/swap函数陷阱.md: -------------------------------------------------------------------------------- 1 | # swap函数陷阱 2 | 3 | 使用c实现一个交换两个数的函数,代码很简单: 4 | ```c 5 | void swap(int *a, int *b) 6 | { 7 | *a ^= *b; 8 | *b ^= *a; 9 | *a ^= *b; 10 | } 11 | ``` 12 | 只有3行代码,且没有引入中间变量,使用了位运算,效率高! 13 | 14 | 但一个明显的缺陷是没有检查空指针,于是代码修正为: 15 | ```c 16 | void swap(int *a, int *b) 17 | { 18 | if (a == NULL || b == NULL) 19 | return; 20 | *a ^= *b; 21 | *b ^= *a; 22 | *a ^= *b; 23 | } 24 | ``` 25 | 似乎这样就完美了? 26 | 27 | 看看以下代码: 28 | ```c 29 | static int count = 0; 30 | void permutation(int *a, int from, int to) 31 | { 32 | if (from == to) { 33 | cout << ++count << ":"; 34 | for (int i = 0; i <= to; ++i) 35 | cout << a[i] << " "; 36 | cout << endl; 37 | return; 38 | } 39 | for (int i = from; i <= to; ++i) { 40 | swap(&a[from], &a[i]); 41 | permutation(a, from + 1, to); 42 | swap(&a[from], &a[i]); 43 | } 44 | } 45 | ``` 46 | 以上代码功能很简单,使用递归的方式输出数组的全排列,核心算法肯定是没有问题的。可是运行以上代码,输出大量的0!! 47 | 48 | *why ?* 49 | 50 | 答案在于swap函数还没有考虑当a,b是同一个指针的情况,当*a == b*时, *\*a ^= \*b*,结果必然为0,因此结果为*\*a == \*b == 0*, 51 | 因此正确的swap函数应该是这样的: 52 | ```c 53 | void swap(int* a, int* b) 54 | { 55 | if (a == NULL || b == NULL || a == b) 56 | return; 57 | *a ^= *b; 58 | *b ^= *a; 59 | *a ^= *b; 60 | } 61 | ``` 62 | -------------------------------------------------------------------------------- /cloud/Openstack Sahara组件和架构简介.md: -------------------------------------------------------------------------------- 1 | # Openstack Sahara组件和架构简介 2 | 3 | ## 1.简介 4 | 5 | Apache Hadoop是目前被广泛使用的主流大数据处理计算框架,Sahara项目旨在使用用户能够在Openstack平台上便于创建和管理Hadoop以及其他计算框架集群,实现类似AWS的EMR(Amazon Elastic MapReduce service)服务。用户只需要提供简单的参数,如版本信息、集群拓扑、节点硬件信息等,利用Sahara服务能够在数分钟时间内快速地部署Hadoop、Spark、Storm集群。Sahara还支持节点的弹性扩展,能够方便地按需增加或者减少计算节点,实现弹性数据计算服务。它特别适合开发人员或者QA在Openstack平台上快速部署大数据处理计算集群。 6 | 7 | 它特效包括: 8 | 9 | * Openstack的标准组件之一; 10 | * 通过REST API和Dashboard UI界面管理集群; 11 | * 支持多种数据处理计算框架,包括: 12 | * 多种Hadoop厂商发行版,比如CDH等; 13 | * Apache Spark和Storm; 14 | * 可插除的Hadoop安装引擎; 15 | * 集成厂商的特定管理工具,如Apache Ambari and Cloudera Management Console。 16 | * 支持配置模板。 17 | 18 | 它和其他Openstack组件交互,如图: 19 | ![sahara交互图](sahara-inter.png) 20 | 21 | ## 2.工作流程 22 | 23 | sahara提供两个层次的API,分别为集群管理(cluster provisioning)和任务管理(analytics as a service)。 24 | 25 | 集群管理工作流包括: 26 | 27 | 1. 选择Hadoop发行版本; 28 | 2. 选择base镜像,base镜像用于生成工作节点,base镜像或者已经预先安装了Hadoop的必要组件,或者提供可插除的可自动快速部署Hadoop的工具。base镜像可以自己制作,也可以直接下载: http://sahara-files.mirantis.com/images/upstream/liberty/ 29 | 3. 集群配置,包括集群大小、集群拓扑(配置组件角色)和一些附加参数(如堆大小、HDFS冗余份数等); 30 | 4. 创建集群,sahara将自动创建虚拟机、部署和配置数据分析计算框架集群; 31 | 5. 集群管理,如增加或者删除节点; 32 | 6. 集群销毁,用户不需要时,可以删除集群,释放所有的资源。 33 | 34 | 任务管理工作流包括: 35 | 36 | 1. 选择预先定义的数据处理计算框架以及版本; 37 | 2. 任务配置: 38 | 39 | * 选择任务类型:pig,hive,java-jar等; 40 | * 提供任务脚本源或者jar包地址; 41 | * 选择输入、输出地址。 42 | 43 | 3. 限制集群大小; 44 | 4. 执行任务,注意所有底层的集群管理和任务执行流程对用户是完全透明的,当任务执行完后,集群将会自动移除提交的任务; 45 | 5. 获取处理结果(如Swift)。 46 | 47 | ## 3.用户视角 48 | 通过sahara管理集群,用户主要需要操作以下三个实体对象:Node Group Templates, Cluster Templates and Clusters: 49 | 50 | * Node Group Templates:设置单一节点的模板,包括启动虚拟机的flavor、安全组、可用域、镜像等,以及配置Hadoop角色,比如namenode、secondarynamenode、resourcemanager。比如我们可以创建Master节点模板,flavor为m1.large,启动镜像为sahara-mitaka-vanilla-hadoop-2.7.1-ubuntu-14.04,配置namenode、resourcemanager、secondarynamenode角色,创建Slave节点模板,flavor为m1.large,镜像为sahara-mitaka-vanilla-hadoop-2.7.1-ubuntu-14.04,配置角色为datanode、nodemanager等。 51 | * Cluster Templates:即集群拓扑,包括节点数量(如Master数量、Slave数量)、Hadoop参数配置,比如HDFS配置、YARN配置等。 52 | * Clusters:集群管理,包括集群扩容、集群启动、集群删除等。 53 | 54 | sahara允许用户自由组合节点角色,比如Job Tracker和NameNode可以运作在同一个虚拟机中,也可以分离在不同的虚拟机中。但是sahara会检查集群是否有效,比如不允许创建只有一系列DataNode节点但不存在NameNode节点的集群。 55 | 56 | sahara遵从Openstack的通用访问策略,即支持租户、用户等权限管理。 57 | 58 | ## 4.集成对象存储服务 59 | 60 | sahara支持从Swift对象存储读取数据和保存结果数据,集成文档参考http://docs.openstack.org/developer/sahara/userdoc/hadoop-swift.html。 61 | 62 | ## 5.集群监控 63 | 64 | 除了支持Hadoop厂商提供的监控工具,sahara还提供可插除集成其他外部监控工具,比如Nagios Zabbix,这些外部工具完全和集群分离,可以单独部署在一个单独的虚拟机,因此可以同时监控多个集群。 65 | 66 | ## 6.架构 67 | sahara架构如图所示: 68 | ![sahara架构图](sahara-architecture.png) 69 | 70 | 主要包括以下几个组件: 71 | 72 | * Auth component(认证组件) - 负责和认证服务交互完成客户认证。 73 | * DAL - 数据访问层, 负责为持久化数据提供数据库访问接口。 74 | * Secure Storage Access Layer(安全存储访问层) - 保存用户认证信息,比如用户密码、密钥等。 75 | * Provisioning Engine - 该组件负责和Openstack其他组件交互,比如Nova组件、Heat组件、Cinder组件以及Glance组件等。 76 | * Vendor Plugins(厂商插件) - 负责配置和启动计算框架,不同的计算框架启动方式和配置都不一样,因此提供插件机制,使sahara同时可支持多种计算框架。已经完成集成的插件包括Apache Ambari和Cloudera Management Console等。 77 | * EDP - Elastic Data Processing,负责调度和管理任务。 78 | * REST API - 通过REST HTTP API接口暴露sahara管理功能。 79 | * Python Sahara Client - sahara命令行管理工具。 80 | * Sahara pages - Openstack Dashboard显示页面。 81 | 82 | ## 参考 83 | 84 | 1. sahara开发文档:http://docs.openstack.org/developer/sahara 85 | -------------------------------------------------------------------------------- /cloud/docker安装和使用.md: -------------------------------------------------------------------------------- 1 | ## 安装docker 2 | 3 | 测试环境: `ubuntu14.04` 64位 4 | 5 | ### 一命令式安装 6 | 7 | ```bash 8 | wget -qO- https://get.docker.com/ | sh 9 | ``` 10 | 11 | ### 把用户加入docker组 12 | 13 | 默认只有root用户能进行操作,不过docker组也具有权限,因此若需要当前用户不需要root 14 | 也能访问docker,需要把用户加入到docker组: 15 | 16 | ```bash 17 | sudo usermod -a -G docker username 18 | ``` 19 | 20 | ### 启动docker服务 21 | 22 | ```bash 23 | sudo service docker start 24 | ``` 25 | 26 | ### 测试是否安装好 27 | 28 | ```bash 29 | docker info 30 | ``` 31 | 若输出以下则说明安装成功 32 | ``` 33 | Containers: 0 34 | Images: 0 35 | Storage Driver: aufs 36 | Root Dir: /var/lib/docker/aufs 37 | Backing Filesystem: extfs 38 | Dirs: 0 39 | Dirperm1 Supported: true 40 | Execution Driver: native-0.2 41 | Logging Driver: json-file 42 | Kernel Version: 3.16.0-41-generic 43 | Operating System: Ubuntu 14.04.2 LTS 44 | CPUs: 4 45 | Total Memory: 7.707 GiB 46 | Name: Alibaba-fgp 47 | ID: GA2K:3OV2:GNVU:PETS:DBZR:OYYP:FHWE:3QM5:QZPW:XNCM:IHP6:U2KN 48 | ``` 49 | 50 | ### 启动第一个实例 51 | 52 | ```bash 53 | docker run -t -i --rm busybox 54 | ``` 55 | 56 | 此时应该会先从docker hub中拉取镜像,然后启动容器实例 57 | 58 | ### 其他命令 59 | 60 | ```bash 61 | docker images #查看本地镜像 62 | docker search hadoop #搜索hadoop相关镜像 63 | docker pull krystism/openstackclient # 下载krystism/openstackclient镜像到本地 64 | docker ps # 查看运行实例 65 | docker ps -a # 查看所有实例,包括没有运行的 66 | docker run -t -i ubuntu:14.04 # 运行ubuntu 14.04镜像 67 | docker start id # 启动指定id实例(开机) 68 | docker stop id # 停止指定id实例(关机) 69 | docker rm id # 删除指定id实例(移除) 70 | docker rmi id # 删除指定i镜像 71 | ``` 72 | -------------------------------------------------------------------------------- /cloud/docker网络原理.md: -------------------------------------------------------------------------------- 1 | 以下内容引用[Docker —— 从入门到实践](http://dockerpool.com/static/books/docker_practice/advanced_network/README.html) 2 | > 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。 3 | 同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。 4 | 当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。如图 5 | ![docker network](static/img/network.png "docker network") 6 | > 7 | 8 | 下面以自定义的容器方式,一步步配置网络, 达到以下目标: 9 | 10 | * 容器间能够通信 11 | * 容器能够联外网 12 | 13 | 首先创建一个容器,但不使用默认网络配置,使用`--net=none`选项: 14 | ```bash 15 | docker run -t -i --net=none ubuntu:14.04 bash 16 | docker ps # 获取容器id=d344e6e05a99 17 | ``` 18 | 19 | 获取容器pid: 20 | ```bash 21 | docker inspect d344e6e05a99 | grep -i "\8080`, 因此设置为 52 | ``` 53 | external_url "http://10.103.240.36:8080" 54 | ``` 55 | 后来发现**`external_url`只能配置ip或者域名,不能有端口,否则不能启动**。 56 | 于是只能把端口设置为`80->80`,然后`external_url`设置为: 57 | ``` 58 | external_url "http://10.103.240.36" 59 | ``` 60 | 61 | ## 4. 重启gitlab 62 | 63 | ```bash 64 | docker restart gitlab 65 | ``` 66 | -------------------------------------------------------------------------------- /cloud/sahara-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/cloud/sahara-architecture.png -------------------------------------------------------------------------------- /cloud/sahara-inter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/cloud/sahara-inter.png -------------------------------------------------------------------------------- /cloud/static/img/docker-and-vm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/cloud/static/img/docker-and-vm.jpg -------------------------------------------------------------------------------- /cloud/static/img/docker-filesystems-multilayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/cloud/static/img/docker-filesystems-multilayer.png -------------------------------------------------------------------------------- /cloud/static/img/network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/cloud/static/img/network.png -------------------------------------------------------------------------------- /cloud/虚拟机、Docker和Hyper.md: -------------------------------------------------------------------------------- 1 | ## 操作系统 2 | 3 | 我们知道: 4 | ``` 5 | 完整的操作系统=内核+apps 6 | ``` 7 | 内核负责管理底层硬件资源,包括CPU、内存、磁盘等等,并向上为apps提供系统调用接口,上层apps应用必须通过系统调用方式使用硬件资源,通常并不能直接访问资源。apps就是用户直接接触的应用,比如命令行工具、图形界面工具等(linux的图形界面也是作为可选应用之一,而不像windows是集成到内核中的)。同一个内核加上不同的apps,就构成了不同的操作系统发行版,比如ubuntu、rethat、android(当然内核通常针对不同的发行版会有修改)等等。因此我们可以认为,不同的操作系统发行版本其实就是由应用apps构成的环境的差别(比如默认安装的软件以及链接库、软件包管理、图形界面应用等等)。我们把所有这些apps环境打成一个包,就可以称之为镜像。问题来了,假如我们同时有多个apps环境,能否在同一个内核上运行呢?因为操作系统只负责提供服务,而并不管为谁服务,因此同一个内核之上可以同时运行多个apps环境。比如假设我们现在有ubuntu和fedora的apps环境,即两个发行版镜像,分别位于`/home/int32bit/ubuntu`和`/home/int32bit/fedora`,我们最简单的方式,采用`chroot`工具即可快速切换到指定的应用环境中,相当于同时有多个apps环境在运行。 8 | 9 | ## 容器技术 10 | 11 | 我们以上通过chroot方式,好像就已经实现了容器的功能,但其实容器并没有那么简单,工作其实还差得远。首先要作为云资源管理还必须满足: 12 | 13 | ### 1.资源隔离 14 | 因为云计算本质就是集中资源再分配(社会主义),再分配过程就是资源的逻辑划分,提供资源抽象的实现方式比如我们熟悉的虚拟机等,我们把资源抽象一次划分称为单元。单元必须满足隔离性,包括用户隔离(或者说权限隔离)进程隔离、网络隔离、文件系统隔离等,即单元内部只能感知其内部的资源,而不能感知单元以外的资源(包括宿主资源以及其他单元的资源)。 15 | ### 2.资源控制 16 | 即为单元分配资源量,能控制单元的资源最大使用量。单元不能使用超过分配的资源量。 17 | 18 | 当然还包括其他很多条件,本文主要基于这两个基本条件进行研究。 19 | 20 | 显然满足以上两个条件,虚拟机是一种实现方式,这是因为: 21 | 22 | * 隔离毋容置疑,因为不同的虚拟机运行在不同的内核,虚拟机内部是一个独立的隔离环境 23 | * hypervisor能够对虚拟机分配指定的资源 24 | 25 | 基于虚拟机快速构建应用环境比如`vagrant`等。 26 | 27 | 但是虚拟机也带来很多问题,比如: 28 | 29 | * 镜像臃肿庞大,不仅包括apps,还必须包括一个庞大的内核 30 | * 创建和启动时间开销大,不利于快速构建重组 31 | * 额外资源开销大,部署密度小 32 | * 性能损耗 33 | * ... 34 | 35 | 有没有其他实现方式能符合以上两个条件呢?容器技术便是另一种实现方式。表面上和我们使用chroot方式相似,即所有的容器实例内部的应用是直接运行在宿主机中,所有实例共享宿主机的内核,而虚拟机实例内部的进程是运行在GuestOS中。由以上原理可知,容器相对于虚拟机有以上好处: 36 | 37 | * 镜像体积更小,只包括应用以及所依赖的环境,没有内核。 38 | * 创建和启动快,不需要启动GuestOS,应用启动开销基本就是应用本身启动的时间开销。 39 | * 无GuestOS,无hypervisor,无额外资源开销,资源控制粒度更小,部署密度大。 40 | * 使用的是真实物理资源,因此不存在性能损耗。 41 | * 轻量级 42 | * ... 43 | 44 | 但如何实现资源隔离和控制呢? 45 | 46 | ### 1. 隔离性 47 | 48 | 主要通过内核提供namespace技术实现隔离性,以下参考[酷壳](http://coolshell.cn/articles/17010.html): 49 | >Linux Namespace是Linux提供的一种内核级别环境隔离的方法。不知道你是否还记得很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。 50 | > 51 | 52 | Linux Namespace 有如下种类,官方文档在这里[《Namespace in Operation》](http://lwn.net/Articles/531114/) 53 | 54 | | 分类 | 系统调用参数 | 相关内核版本 55 | |---------|------------------------|----------------------| 56 | |Mount namespaces| CLONE_NEWNS | Linux 2.4.19 57 | |UTS namespaces | CLONE_NEWUTS|Linux 2.6.19 58 | |IPC namespaces |CLONE_NEWIPC|Linux 2.6.19 59 | |PID namespaces |CLONE_NEWPID| Linux 2.6.24 60 | |Network namespaces|CLONE_NEWNET|始于Linux 2.6.24 完成于 Linux 2.6.29 61 | |User namespaces|CLONE_NEWUSER|始于 Linux 2.6.23 完成于 Linux 3.8) 62 | 63 | 由上表可知,通过Namespaces技术可以实现隔离性,比如网络隔离,我们可以通过`sudo ip netns ls`查看网络命名空间,通过`ip netns add NAME`增加网络命名等。 64 | 65 | ### 2.资源控制 66 | 内核实现了对进程组的资源控制,即Linux Control Group,简称cgoup,它能为系统中运行进程组根据用户自定义组分配资源。简单来说,可以实现把多个进程合成一个组,然后对这个组的资源进行控制,比如CPU使用时间,内存大小、网络带宽、磁盘读写等,linux把cgroup抽象成一个虚拟文件系统,可以挂载到指定的目录下,ubuntu14.04默认自动挂载在`/sys/fs/cgroup`下,用户也可以手动挂载,比如挂载memory子系统(子系统一类资源的控制,比如cpu、memory,blkio等)到`/mnt`下: 67 | 68 | ```bash 69 | sudo mount -t cgroup -o memory memory /mnt 70 | ``` 71 | 挂载后就能像查看文件一样方便浏览进程组以及资源控制情况,控制组并不是孤立的,而是组织成树状结构构成进程组树,控制组的子节点会继承父节点。下面以memory子系统为例, 72 | 73 | ```bash 74 | ls /sys/fs/cgroup/memory/ 75 | ``` 76 | 输出: 77 | 78 | ``` 79 | cgroup.clone_children memory.kmem.failcnt memory.kmem.tcp.usage_in_bytes memory.memsw.usage_in_bytes memory.swappiness 80 | cgroup.event_control memory.kmem.limit_in_bytes memory.kmem.usage_in_bytes memory.move_charge_at_immigrate memory.usage_in_bytes 81 | cgroup.procs memory.kmem.max_usage_in_bytes memory.limit_in_bytes memory.numa_stat memory.use_hierarchy 82 | cgroup.sane_behavior memory.kmem.slabinfo memory.max_usage_in_bytes memory.oom_control notify_on_release 83 | docker memory.kmem.tcp.failcnt memory.memsw.failcnt memory.pressure_level release_agent 84 | memory.failcnt memory.kmem.tcp.limit_in_bytes memory.memsw.limit_in_bytes memory.soft_limit_in_bytes tasks 85 | memory.force_empty memory.kmem.tcp.max_usage_in_bytes memory.memsw.max_usage_in_bytes memory.stat user 86 | ``` 87 | 88 | 以上是根控制组的资源限制情况,我们以创建控制内存为4MB的Docker容器为例: 89 | 90 | ```bash 91 | docker run -m 4MB -d busybox ping localhost 92 | ``` 93 | 94 | 返回id为`0532d4f4af67`,自动会创建以docker实例id为为名的控制组,位于`/sys/fs/cgroup/memory/docker/0532d4f4af67...`,我们查看该目录下的`memory.limit_in_bytes`文件内容为: 95 | 96 | ```bash 97 | cat memory.limit_in_bytes 98 | 4194304 99 | ``` 100 | 即最大的可使用的内存为4MB,正好是我们启动Docker所设定的。 101 | 102 | 由以上可知,容器实现了资源的隔离性以及控制性。容器的具体实现如LXC、LXD等。 103 | 104 | ## Docker技术 105 | 106 | Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,简单说Docker提供了一个能够方便管理容器的工具。使用Docker能够: 107 | 108 | * 快速构建基于容器的分布式应用 109 | * 具有容器的所有优点 110 | * 提供原生的资源监控 111 | * ... 112 | 113 | Docker与虚拟机原理对比: 114 | 115 | ![Docker与虚拟机原理对比](static/img/docker-and-vm.jpg) 116 | 117 | 由于容器技术很早就有,Docker最核心的创新在于它的镜像管理,因此有人说: 118 | 119 | ``` 120 | Docker = 容器 + Docker镜像 121 | ``` 122 | Docker镜像的创新之处在于使用了类似层次的文件系统AUFS,简单说就是一个镜像是由多个镜像层层叠加的,从一个base镜像中通过加入一些软件构成一个新层的镜像,依次构成最后的镜像,如图 123 | 124 | ![Docker镜像分层](static/img/docker-filesystems-multilayer.png) 125 | 126 | [知乎:docker的几点疑问](https://www.zhihu.com/question/25394149/answer/30671258): 127 | 128 | > Image的分层,可以想象成photoshop中不同的layer。每一层中包含特定的文件,当container运行时,这些叠加在一起的层就构成了container的运行环境(包括相应的文件,运行库等,不包括内核)。Image通过依赖的关系,来确定整个镜像内到底包含那些文件。之后的版本的docker,会推出squash的功能,把不同的层压缩成为一个,和Photoshop中合并层的感觉差不多。 129 | 作者:Honglin Feng 130 | 链接:https://www.zhihu.com/question/25394149/answer/30671258 131 | 来源:知乎 132 | 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 133 | > 134 | 135 | 这样的好处是: 136 | 137 | * 节省存储空间 - 多个镜像共享base image存储 138 | * 节省网络带宽 - 拉取镜像时,只需要拉取本地没有的镜像层,本地已经存在的可以共享,避免多次传输拷贝 139 | * 节省内存空间 - 多个实例可共享base image, 多个实例的进程命中缓存内容的几率大大增加。如果基于某个镜像启动一个虚拟机需要资源k,则启动n个同一个镜像的虚拟机需要占用资源kn,但如果基于某个镜像启动一个Docker容器需要资源k,无论启动多少个实例,资源都是k。 140 | * 维护升级方便 - 相比于 copy-on-write 类型的FS,base-image也是可以挂载为可writeable的,可以通过更新base image而一次性更新其之上的container 141 | * 允许在不更改base-image的同时修改其目录中的文件 - 所有写操作都发生在最上层的writeable层中,这样可以大大增加base image能共享的文件内容。 142 | 143 | 使用容器技术,带来了很多优点,但同时也存在一些问题: 144 | 145 | * 隔离性相对虚拟机弱-由于和宿主机共享内核,带来很大的安全隐患,容易发生逃逸。 146 | * 如果某些应用需要特定的内核特性,使用容器不得不更换宿主机内核。 147 | * ... 148 | 149 | 更多关于AUFS参考[酷壳:Docker基础技术-AUFS](http://coolshell.cn/articles/17061.html) 150 | ## Hyper 151 | 152 | 上文提到容器也存在问题,并且Docker的核心创新在于镜像管理,即: 153 | 154 | ``` 155 | Docker = 容器 + Docker镜像 156 | ``` 157 | 有人提出把容器替换成最初的hypervisor,即接下来介绍的Hyper,[官方](https://hyper.sh/)定义: 158 | 159 | ``` 160 | Hyper - a Hypervisor-based Containerization solution 161 | ``` 162 | 即 163 | 164 | ``` 165 | Hyper = Hypervisor + Docker镜像 166 | ``` 167 | 168 | Hyper是一个基于虚拟化技术(hypervisor)的Docker引擎。[官方](http://mt.sohu.com/20150625/n415640410.shtml)认为 169 | >虽然Hyper同样通过VM来运行Docker应用,但HyperVM里并没有GuestOS,相反的,一个HyperVM内部只有一个极简的HyperKernel,以及要运行的Docker镜像。这种Kernel+Image的"固态"组合使得HyperVM和Docker容器一样,实现了Immutable Infrastructure的效果。借助VM天然的隔离性,Hyper能够完全避免LXC共享内核的安全隐患. 170 | 171 | 创建一个基于Hyper的ubuntu: 172 | 173 | ```bash 174 | sudo hyper run -t ubuntu:latest bash 175 | ``` 176 | 创建时间小于1秒,确实达到启动容器的效率。 177 | 查看内核版本: 178 | 179 | ``` 180 | root@ubuntu-latest-7939453236:/# uname -a 181 | Linux ubuntu-latest-7939453236 4.4.0-hyper+ #0 SMP Mon Jan 25 01:10:46 CST 2016 x86_64 x86_64 x86_64 GNU/Linux 182 | ``` 183 | 184 | 宿主机内核版本: 185 | 186 | ``` 187 | $ uname -a 188 | Linux lenovo 3.13.0-77-generic #121-Ubuntu SMP Wed Jan 20 10:50:42 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 189 | ``` 190 | 启动基于Docker的ubuntu并查看内核版本: 191 | 192 | ``` 193 | $ docker run -t -i ubuntu:14.04 uname -a 194 | Linux 73a88ca16d94 3.13.0-77-generic #121-Ubuntu SMP Wed Jan 20 10:50:42 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 195 | ``` 196 | 我们发现Docker和宿主机的内核版本是一样的,即`3.13.0-77-generic`,而Hyper内核不一样,版本为`4.4.0-hyper`。 197 | 198 | 以下为[官方数据](https://github.com/hyperhq/hyper): 199 | 200 | **Hyper combines the best from both world: VM and Container**. 201 | 202 | | - | Container | VM | Hyper | 203 | |---|---|---|---| 204 | | Isolation | Weak, shared kernel | Strong, HW-enforced | Strong, HW-enforced | 205 | | Portable | Yes, but kernel dependent sometimes | No, hypervisor dependent | Yes, hypervisor agnostic and portable image | 206 | | Boot | Fast, sub-second | Slow, tens of seconds | Fast, sub-second | 207 | | Performance | Great | OK| Good, minimal resource footprint and overhead | 208 | | Immutable | Yes | No, configuration management required | Yes, only kernel+image | 209 | | Image Size| Small, MBs | Big, GBs | Small, MBs | 210 | | Compatibility | No, need new tools | Great, everything just works | Good, it is still a "Machine", much less changes | 211 | | Mature | Not yet | Production ready, SDN, SDS, LiveMigration, etc. | Yes, just plug-&-play| 212 | | ROI| Rebuild everything with container | - | Reuse your virtual infrastructure 213 | 214 | Hyper确实是容器和虚拟机的一种很好的折衷技术,未来可能前景广大,但需要进一步观察,我个人主要存在以下疑问: 215 | 216 | * 使用极简的内核,会不会导致某些功能丢失? 217 | * 是不是需要为每一个应用维护一个微内核? 218 | * 有些应用需要特定内核,这些应用实际多么?可以通过其他方式避免么? 219 | * Hyper引擎能否提供和Docker引擎一样的api,能否在生态圈中相互替代? 220 | * 隔离性加强的同时也牺牲了部分性能,这如何权衡? 221 | 222 | ## 总结 223 | 224 | 本文首先介绍了操作系统,然后引出容器技术以及虚拟机技术,最后介绍了Docker和Hyper技术。通过本文可以清楚地对三者有了感性认识。 225 | 近年来容器技术以及微服务架构非常火热,CaaS有取代传统IaaS的势头,未来云计算市场谁成为主流值得期待。 226 | -------------------------------------------------------------------------------- /docker: -------------------------------------------------------------------------------- 1 | cloud -------------------------------------------------------------------------------- /hadoop/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/hadoop/.gitkeep -------------------------------------------------------------------------------- /hadoop/hive单机安装.md: -------------------------------------------------------------------------------- 1 | # hive单机安装 2 | 3 | ## 安装要求 4 | 5 | 1. java1.7+ 6 | 2. hadoop2.x 7 | 3. mysql5.5+(非必须,建议使用mysql存储元数据) 8 | 9 | ## 安装前的环境 10 | 11 | 1. JAVA_HOME: java安装目录 12 | 2. HADOOP_HOME: hadoop安装目录 13 | 3. CLASSPATH: 除了hadoop和hive的必须包,还需要包括mysql java驱动,这里使用的是mysql-connector-java-5.1.25.jar, 14 | 并把它放入到lib下 15 | 16 | ## 安装过程 17 | 18 | ### Step 1 下载tar包 19 | 20 | 在[hive官网](http://www.apache.org/dyn/closer.cgi/hive/)下载最新的tar包,当前最新包为apache-hive-0.14.0-bin.tar.gz。 21 | 22 | ### Step 2 解压包 23 | 24 | 假定安装路径为/opt/hive: 25 | ```bash 26 | sudo mv apache-hive-0.14.0-bin.tar.gz /opt 27 | sudo tar xvf apache-hive-0.14.0-bin.tar.gz 28 | sudo ln -s apache-hive-0.14.0-bin hive 29 | sudo mv mysql-connector-java-5.1.25.jar /opt/hive/lib 30 | ``` 31 | ### Step 3 配置 32 | * 创建配置文件,直接从模板文件创建即可 33 | ```bash 34 | sudo rename 's/\.template//' * 35 | sudo touch hive-site.xml 36 | ``` 37 | * 编辑hive-env.sh文件,设置HADOOP_HOME=${HADOOP_HOME-:/opt/hadoop} 38 | * 创建hive-site-xml文件,添加以下内容: 39 | ```xml 40 | 41 | javax.jdo.option.ConnectionURL 42 | jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true 43 | the URL of the MySQL database 44 | 45 | 46 | 47 | javax.jdo.option.ConnectionDriverName 48 | com.mysql.jdbc.Driver 49 | 50 | 51 | 52 | javax.jdo.option.ConnectionUserName 53 | hive 54 | 55 | 56 | 57 | javax.jdo.option.ConnectionPassword 58 | HIVE_DBPASS 59 | 60 | 61 | 62 | datanucleus.autoCreateSchema 63 | true 64 | 65 | 66 | 67 | datanucleus.fixedDatastore 68 | false 69 | 70 | 71 | 72 | datanucleus.autoCreateTables 73 | true 74 | 75 | 76 | 77 | datanucleus.autoCreateColumns 78 | true 79 | 80 | 81 | 82 | datanucleus.autoStartMechanism 83 | SchemaTable 84 | 85 | 86 | 87 | hive.metastore.warehouse.dir 88 | /user/hive/warehouse 89 | 90 | 91 | 103 | 104 | 105 | hbase.zookeeper.quorum 106 | localhost 107 | 108 | 109 | 110 | hive.support.concurrency 111 | Enable Hive's Table Lock Manager Service 112 | true 113 | 114 | 115 | 116 | ``` 117 | * mysql设置。修改/etc/mysql/my.cnf,修改bind-address 为0.0.0.0,重启mysql服务。 118 | * 在hdfs创建必要目录: 119 | ```bash 120 | $HADOOP_HOME/bin/hdfs dfs -mkdir /tmp 121 | $HADOOP_HOME/bin/hdfs dfs -mkdir /user/hive 122 | $HADOOP_HOME/bin/hdfs dfs -chown hive /user/hive 123 | $HADOOP_HOME/bin/hdfs dfs -mkdir /user/hive/warehouse 124 | $HADOOP_HOME/bin/hdfs dfs -chmod g+w /tmp 125 | $HADOOP_HOME/bin/hdfs dfs -chmod 777 /user/hive/warehouse 126 | $HADOOP_HOME/bin/hdfs dfs -chmod a+t /user/hive/warehouse 127 | ``` 128 | * 运行$HIVE_HOME/bin/hive, OK! 129 | -------------------------------------------------------------------------------- /hadoop/kafka集群配置总结.md: -------------------------------------------------------------------------------- 1 | # 配置kafka集群 2 | 虽然很简单,但会遇到很多奇怪的坑,而且网上解决方法搜不到。 3 | 首先下载kafka包,解压缩后,修改`conf/server.properties`文件,基本配置项如下(省略了部分默认配置项 : 4 | ``` 5 | broker.id=0 6 | advertised.host.name=master 7 | zookeeper.connect=master:2181,node1:2181,node2:2181 8 | ``` 9 | 以上需要注意的是`advertised.host.name`必须修改为主机名,否则会导致很多问题。 10 | 每个主机的`broker.id`必须不一样。`zookeeper.connect`需要填写所有的zookeeper服务器地址端口,并且以上的主机名对应的node1,node2,...必须和`/etc/hosts`一致,并且集群外可以ping通(集群内可以使用内部ip,集群外使用外部ip,但主机名对应的机器必须一一对应,否则会出现`Leader not local for partition`错误,这是其中一个坑,搞了很久没有搞清楚. 11 | 12 | 配置修改后,创建一个topic(topic一旦创建不能删除?只能标记为已删除?): 13 | ```sh 14 | bin/kafka-topics.sh --create --partitions 5 --replication-factor 3 --topic test3 --zookeeper master,node1,node2 15 | ``` 16 | 获取主题信息 17 | ```sh 18 | bin/kafka/bin$ ./kafka-topics.sh --describe --topic test3 --zookeeper master,node1 19 | ``` 20 | 输出: 21 | ``` 22 | Topic:test3 PartitionCount:5 ReplicationFactor:3 Configs: 23 | Topic: test3 Partition: 0 Leader: 4 Replicas: 4,2,3 Isr: 4,2,3 24 | Topic: test3 Partition: 1 Leader: 5 Replicas: 5,3,4 Isr: 5,3,4 25 | Topic: test3 Partition: 2 Leader: 6 Replicas: 6,4,5 Isr: 6,4,5 26 | Topic: test3 Partition: 3 Leader: 7 Replicas: 7,5,6 Isr: 7,5,6 27 | Topic: test3 Partition: 4 Leader: 0 Replicas: 0,6,7 Isr: 0,6,7 28 | ``` 29 | 以上的Replicas和lsr必须一样,否则说明对应的broker down掉了。 -------------------------------------------------------------------------------- /hadoop/nutch集成solr和中文分词.md: -------------------------------------------------------------------------------- 1 | # nutch集成solr和中文分词 2 | 3 | ## 一、构建nutch环境 4 | 5 | ### 1. 设置代理 6 | 7 | 由于nutch使用ant构建,ant调用ivy,会从maven仓库中下载依赖包,因此若公司需要代理才能上网,需要设置代理,***如果公司不需要代理即可上网,此步骤直接省略.*** 8 | 9 | 总结设置代理遇到的几个坑: 10 | 11 | * 强制使用系统代理,即 ant -autoproxy , 结果失败! 12 | * 修改 build.xml , 增加 setproxy ,设置代理,结果失败! 13 | * 设置 ANT_OPTS ,添加选项 14 | * -Dhttp.proxyHost=http://proxy.xxx.com 15 | * -Dhttp.proxyPort=xxx , 结果失败! 16 | * 传递 http_proxy ,结果失败! 17 | 18 | 失败原因: `proxyHost`只需要包括主机名,而不需要指定协议 19 | 20 | 成功编译为修改`build.xml`文件,设置代理,内容如下: 21 | 22 | ```xml 23 | 24 | 25 | 26 | ``` 27 | 28 | 并修改`ivy-init`指令,如下: 29 | ```xml 30 | 31 | 32 | 33 | ``` 34 | 35 | ### 2. 设置hadoop环境 36 | 37 | ***若只是构建单机模式,此步骤省略!*** 38 | 39 | 否则需要设置并`export HADOOP_HOME`环境变量: 40 | 41 | ```bash 42 | export HADOOP_HOME=${HADOOP_HOME:-/opt/hadoop} 43 | echo $HADOOP_HOME 44 | ``` 45 | ### 3. nutch配置 46 | 在编译之前首先需要配置nutch,***每次更新配置文件,都需要重新编译!*** 47 | 配置文件位于`$NUTCH_HOME/conf`下,务必设置`http.agent.name`,否则编译后不能运行, 编辑`conf/nutch-site.xml`, 内容为: 48 | ```xml 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | http.agent.name 57 | My Spider 58 | 59 | 60 | ``` 61 | 62 | 如果需要设置nutch运行时代理,需要配置代理,修改文件`$NUTCH_HOME/conf/nutch-default.xml`, 修改`http.proxyHost`和`http.proxyPort`值,内容如下: 63 | ```xml 64 | 65 | http.proxy.host 66 | proxy.xxx.com 67 | The proxy hostname. If empty, no proxy is used. 68 | 69 | 70 | 71 | http.proxy.port 72 | xxx 73 | The proxy port. 74 | 75 | ``` 76 | 77 | ### 4.编译构建nutch 78 | 在此之前,请确保以上步骤已经正确完成,否则会导致编译失败或者运行失败! 79 | 编译: 80 | ```bash 81 | ant -v runtime 82 | ``` 83 | 构建开始,大约需要30分钟的时间 84 | ## 二、集成solr 85 | 86 | 目前solr的版本是5.x,但好像5.x版本差别较大,nutch没有集成支持!因此我们使用当前的4.x版本,目前该版本的latest是4.10.4,点击[此处下载](http://www.carfab.com/apachesoftware/lucene/solr/4.10.4/solr-4.10.4.tgz). 87 | 88 | ### 1.初始化 89 | 90 | 解压缩,复制example/solr/collection1下的core `collection1`为`nutch`: 91 | 92 | ```bash 93 | cp -rf collection1 nutch 94 | ``` 95 | 并修改`$SOLR_HOME/example/solr/nutch/core.properties`文件,设置name为nutch: 96 | ``` 97 | name=nutch 98 | ``` 99 | 100 | 把`$NUTCH_HOME/conf/schema-solr4.xml`复制到`$SOLR_HOME/example/solr/nutch/conf`下,并重命名为`schema.xml`: 101 | 102 | ```bash 103 | cp $NUTCH_HOME/conf/schema-solr4.xml $SOLR_HOME/example/solr/nutch/conf/schema.xml 104 | ``` 105 | 106 | ### 2. 修改配置 107 | 108 | 此时启动solr会出现以下错误: 109 | ``` 110 | org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: copyField dest :'location' is not an explicit field and doesn't match a dynamicField 111 | ``` 112 | 应该是配置文件schema.xml的一个bug, 修复办法为在``下增加一个location `field`, 内容为: 113 | ``` 114 | 115 | ``` 116 | 117 | 118 | 若没有`_version`属性,则增加`_version_`属性: 119 | ``` 120 | 121 | ``` 122 | ### 3. 增加中文分词 123 | 首先从google code上下载[IKAnalyzer](http://code.google.com/p/ik-analyzer/downloads/list),下载版本为`IK Analyzer 2012FF_hf1.zip`,如果被GFW, 点击[此处下载](./resources). 124 | 解压缩文件,把IKAnalyzer2012FF_u1.jar文件复制到`$SOLR_HOME/example/solr-webapp/webapp/WEB-INF/lib`,把IKAnalyzer.cfg.xml和stopword.dic复制到`$SOLR_HOME/example/solr/nutch/conf`,与schema.xml一个目录下: 125 | 126 | ```bash 127 | cp IKAnalyzer2012FF_u1.jar $SOLR_HOME/example/solr-webapp/webapp/WEB-INF/lib 128 | cp IKAnalyzer.cfg.xml stopword.dic $SOLR_HOME/example/solr/nutch/conf 129 | ``` 130 | 131 | 修改core的schema.xml,在配置项间加一段如下配置: 132 | ```xml 133 | 134 | 135 | 136 | ``` 137 | 在这个core的schema.xml里面配置field类型的时候就可以使用text_cn 138 | ```xml 139 | 140 | ``` 141 | 启动solr服务 142 | ```sh 143 | cd $SOLR_HOME/example 144 | java -jar start.jar 145 | ``` 146 | 浏览器访问[http://172.16.182.23:8983/solr/#/nutch](http://172.16.182.23:8983/solr/#/nutch),在左下边点击`Analysis`连接,选择`Analyse Fieldname / FieldType`为`text_cn`,在`Field Value (Index)`下输入: 147 | ``` 148 | 我喜欢solr 149 | ``` 150 | 然后点击蓝色按钮`Analyse Values`,查看效果,看是否正确分词! 151 | 152 | ## 三、单机运行测试 153 | 154 | 具体过程可以查看[官方教程](https://wiki.apache.org/nutch/NutchTutorial) 。 155 | 156 | 总结过程如下: 157 | 158 | ### 1. 创建种子列表 159 | ```sh 160 | mkdir urls 161 | cd urls 162 | touch seeds.txt 163 | echo "http://nutch.apache.org/" >> seeds.txt # 每行一个URL 164 | ``` 165 | 166 | ### 2.使用`crawl`脚本运行 167 | 168 | ```sh 169 | bin/crawl -i -D solr.server.url=http://localhost:8983/solr/nutch urls/ TestCrawl/ 2 170 | ``` 171 | 172 | ### 3. 验证结果 173 | 174 | 打开[http://localhost:8983/solr/](http://localhost:8983/solr/),点击`solr admin`, 在`Querty String`输入`nutch`, 点击`Search`查看效果 175 | 176 | ## 四、分布式运行 177 | 178 | 与单机过程类型,首先创建`urls`目录作为种子url,然后上传到hdfs上: 179 | ```sh 180 | mkdir urls 181 | cd urls 182 | echo "http://apache.org" >>seeds.txt 183 | hdfs dfs -put urls 184 | ``` 185 | 假定solr已经配置完成,url为`localhost:8983` 186 | 187 | 运行以下命令运行: 188 | ```sh 189 | cd $NUTCH_HOME/runtime/runtime/deploy/ 190 | bin/crawl -i -D solr.server.url=http://localhost:8983/solr/nutch urls/ TestCrawl/ 2 191 | ``` 192 | 193 | 194 | -------------------------------------------------------------------------------- /hadoop/resources/IK Analyzer 2012FF_hf1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/hadoop/resources/IK Analyzer 2012FF_hf1.zip -------------------------------------------------------------------------------- /hadoop/spark-streaming读取flume.md: -------------------------------------------------------------------------------- 1 | # 配置spark-streaming读取flume数据 2 | 3 | ## 1.依赖配置 4 | 5 | 由于我们使用`sbt`构建项目,因此所有依赖库写入`build.sbt`的`libraryDependencies`即可,格式 6 | 为`groupId % artifactId % version`,具体字段含义建议参考maven. 7 | 8 | 我们这次代码除了需要`spark-core`外,还需要第三方库`spark-streaming-flume`,因此`build.sbt` 9 | 大致内容为: 10 | 11 | ```scala 12 | name := "FlumeEventCount" 13 | 14 | version := "1.0" 15 | 16 | scalaVersion := "2.10.4" 17 | 18 | libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" 19 | 20 | libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.4.0" 21 | 22 | libraryDependencies += "org.apache.spark" % "spark-streaming-flume_2.10" % "1.4.0" 23 | ``` 24 | 注意`build.sbt`行与行之间要有空行,这是语法要求! 25 | 26 | ## 2.测试代码 27 | 28 | 通过调用`FlumeUtils.createStream()`方法创建flume流,本次测试仅仅统计每次(每隔2秒)获取 29 | 的数据行数(事件数),代码为: 30 | 31 | ```scala 32 | package com.huawei.test 33 | 34 | import org.apache.spark.SparkConf 35 | import org.apache.spark.storage.StorageLevel 36 | import org.apache.spark.streaming._ 37 | import org.apache.spark.streaming.flume._ 38 | import org.apache.spark.util.IntParam 39 | 40 | /** 41 | * Produces a count of events received from Flume. 42 | * 43 | * This should be used in conjunction with an AvroSink in Flume. It will start 44 | * an Avro server on at the request host:port address and listen for requests. 45 | * Your Flume AvroSink should be pointed to this address. 46 | * 47 | * Usage: FlumeEventCount 48 | * is the host the Flume receiver will be started on - a receiver 49 | * creates a server and listens for flume events. 50 | * is the port the Flume receiver will listen on. 51 | * 52 | * To run this example: 53 | * `$ bin/run-example org.apache.spark.examples.streaming.FlumeEventCount ` 54 | */ 55 | object FlumeEventCount{ 56 | def main(args: Array[String]) { 57 | if (args.length < 2) { 58 | System.err.println( 59 | "Usage: FlumeEventCount ") 60 | System.exit(1) 61 | } 62 | 63 | val host = args(0) 64 | val port = args(1).toInt 65 | 66 | val batchInterval = Milliseconds(2000) 67 | 68 | // Create the context and set the batch size 69 | val sparkConf = new SparkConf().setAppName("FlumeEventCount") 70 | val ssc = new StreamingContext(sparkConf, batchInterval) 71 | 72 | // Create a flume stream 73 | val stream = FlumeUtils.createStream(ssc, host, port, StorageLevel.MEMORY_ONLY_SER_2) 74 | 75 | // Print out the count of events received from this server in each batch 76 | stream.count().map(cnt => "Received " + cnt + " flume events." ).print() 77 | 78 | ssc.start() 79 | ssc.awaitTermination() 80 | } 81 | } 82 | ``` 83 | 84 | ## 3.配置flume 85 | 86 | 只需要把sink配置成SparkSink即可 87 | ```conf 88 | agent.sinks = spark 89 | agent.sinks.spark.type = org.apache.spark.streaming.flume.sink.SparkSink 90 | agent.sinks.spark.hostname = 91 | agent.sinks.spark.port = 92 | agent.sinks.spark.channel = memoryChannel 93 | ``` 94 | 95 | ## 4.打包程序 96 | 97 | ```bash 98 | cd $PROJECT_ROOT # PROJECT_ROOT为项目根路径,即build.sbt的位置 99 | ant package 100 | ``` 101 | 102 | ## 5.运行 103 | 104 | 注意:除了`spark-core`依赖包会由`spark-submit`自动引入,其他依赖包比如 105 | `spark-streaming-flume`必须手动引入: 106 | * 设置`CLASSPATH`,把依赖包放入CLASSPATH中 107 | * 使用`--jars`参数手动加入 108 | 109 | 此次测试采用后种方法,即使用`--jars`参数。这个工程只差`spark-streaming-flume`包,sbt编译 110 | 时已经自动下载到本地,位于`~/.ivy2/cache/org.apache.spark/spark-streaming-flume_2.10/jars`, 111 | 把所有的jar包复制到工程的lib目录下. 112 | 113 | ```bash 114 | cp ~/.ivy2/cache/org.apache.spark/spark-streaming-flume_2.10/jars/*.jar lib 115 | ``` 116 | 117 | 使用spark-submit 提交程序,为了避免每次重复输入命令,写一个脚本用于提交: 118 | ```bash 119 | #!/bin/sh 120 | spark-submit --master local[*] --class com.huawei.test.FlumeEventCount\ 121 | --jars lib/*.jar\ 122 | target/scala-2.10/flumeeventcount_2.10-1.0.jar localhost 50000 123 | ``` 124 | 其中`localhost`表示flume写入的主机名,`50000`表示flume写入端口 125 | 126 | ## 6.运行结果 127 | 128 | 当flume有数据流时,程序会捕捉事件,统计每次的事件总数。 129 | 130 | ## 6.运行结果 131 | 132 | 当flume有数据流时,程序会捕捉事件,统计每次的事件总数。 133 | ``` 134 | ------------------------------------------- 135 | Time: 1436942874000 ms 136 | ------------------------------------------- 137 | Received 1345 flume events. 138 | 139 | ------------------------------------------- 140 | Time: 1436942876000 ms 141 | ------------------------------------------- 142 | Received 2132 flume events. 143 | 144 | ------------------------------------------- 145 | Time: 1436942878000 ms 146 | ------------------------------------------- 147 | Received 0 flume events. 148 | 149 | ``` 150 | -------------------------------------------------------------------------------- /hadoop/sqoop2安装.md: -------------------------------------------------------------------------------- 1 | # sqoop2安装 2 | 3 | ## 1. 下载解压缩 4 | 5 | 此次安装版本为1.99.6 6 | 7 | ```sh 8 | # Decompress Sqoop distribution tarball 9 | tar -xvf sqoop--bin-hadoop.tar.gz 10 | 11 | 12 | ln -s sqoop--bin-hadoop.tar.gz sqoop 13 | 14 | export SQOOP_HOME=`pwd`/sqoop 15 | # Change working directory 16 | cd $SQOOP_HOME 17 | ``` 18 | 19 | ## 2. 配置服务 20 | 21 | 配置文件在`$SQOOP_HOME/server/conf`下,大多数默认配置即可。需要注意的配置是`catalina.properties`文件下`common_loader`需要正确配置hadoop库文件,包括hdfs、mapreduce、hive等所有jar包. 我的配置为: 22 | ``` 23 | common.loader=${catalina.base}/lib,\ 24 | ${catalina.base}/lib/*.jar,\ 25 | ${catalina.home}/lib,\ 26 | ${catalina.home}/lib/*.jar,\ 27 | ${catalina.home}/../lib/*.jar,\ 28 | /opt/cloudera/parcels/CDH/lib/hadoop/*.jar,\ 29 | /opt/cloudera/parcels/CDH/lib/hadoop/lib/*.jar,\ 30 | /opt/cloudera/parcels/CDH/lib/hadoop-hdfs/*.jar,\ 31 | /opt/cloudera/parcels/CDH/lib/hadoop-hdfs/lib/*.jar,\ /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/*.jar,\ 32 | /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/lib/*.jar,\ 33 | /opt/cloudera/parcels/CDH/lib/hadoop-yarn/*.jar,\ 34 | /opt/cloudera/parcels/CDH/lib/hadoop-yarn/lib/*.jar,\ 35 | /opt/cloudera/parcels/CDH/lib/hive/lib/*.jar 36 | ``` 37 | 38 | `sqoop.properties`文件的`org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/etc/hadoop/conf/`配置hadoop 39 | 配置文件路径,默认为`/etc/hadoop/conf` 40 | 41 | ## 3. 测试配置是否正确 42 | 43 | 运行 44 | ``` 45 | sqoop2-tool verify 46 | ``` 47 | 若正确,则输出为: 48 | 49 | ``` 50 | Verification was successful. 51 | Tool class org.apache.sqoop.tools.tool.VerifyTool has finished correctly 52 | ``` 53 | 54 | ## 4. 下载derby 包 55 | 56 | 自带derby版本过低运行时会由于不兼容而出现以下错误: 57 | ``` 58 | org.apache.sqoop.common.SqoopException: JDBCREPO_0007:Unable to lease link 59 | at org.apache.sqoop.repository.JdbcRepositoryTransaction.begin(JdbcRepositoryTransaction.java:63) 60 | at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:85) 61 | at org.apache.sqoop.repository.JdbcRepository.doWithConnection(JdbcRepository.java:61) 62 | at org.apache.sqoop.repository.JdbcRepository.createOrUpgradeRepository(JdbcRepository.java:127) 63 | at org.apache.sqoop.repository.RepositoryManager.initialize(RepositoryManager.java:123) 64 | at org.apache.sqoop.tools.tool.UpgradeTool.runToolWithConfiguration(UpgradeTool.java:39) 65 | at org.apache.sqoop.tools.ConfiguredTool.runTool(ConfiguredTool.java:35) 66 | at org.apache.sqoop.tools.ToolRunner.main(ToolRunner.java:75) 67 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 68 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 69 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 70 | at java.lang.reflect.Method.invoke(Method.java:606) 71 | at org.apache.sqoop.tomcat.TomcatToolRunner.main(TomcatToolRunner.java:77) 72 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 73 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 74 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 75 | at java.lang.reflect.Method.invoke(Method.java:606) 76 | at org.apache.catalina.startup.Tool.main(Tool.java:225) 77 | Caused by: java.sql.SQLException: No suitable driver found for 78 | ``` 79 | 80 | 解决办法为[下载derby](http://db.apache.org/derby/derby_downloads.html)最新版本,先删除`/sqoop-1.99.6-bin-hadoop200/server/webapps/sqoop/WEB-INF/lib`下的derby旧包,然后把新下载的derby目录下的lib下的jar包拷贝到`/sqoop-1.99.6-bin-hadoop200/server/webapps/sqoop/WEB-INF/lib` 81 | 82 | ## 5. 验证 83 | 84 | 运行bin/sqoop2-shell,进入sqoop shell模式, 运行`show version --all`,若能正确输出server版本,则安装成功: 85 | ``` 86 | sqoop:000> show version --all 87 | client version: 88 | Sqoop 1.99.6 source revision 07244c3915975f26f03d9e1edf09ab7d06619bb8 89 | Compiled by root on Wed Apr 29 10:40:43 CST 2015 90 | server version: 91 | Sqoop 1.99.6 source revision 07244c3915975f26f03d9e1edf09ab7d06619bb8 92 | Compiled by root on Wed Apr 29 10:40:43 CST 2015 93 | API versions: 94 | [v1] 95 | ``` 96 | -------------------------------------------------------------------------------- /hadoop/构建hadoop2.5.2环境下的spark1.1.1.md: -------------------------------------------------------------------------------- 1 | # 构建hadoop2.5.2环境下的spark1.1.1 2 | 3 | 当前已编译的spark二进制包只有hadoop2.4和cdh4版本的,如果搭的是hadoop2.5.x,则需要自己从源码中构建。 4 | 5 | ## 下载源码 6 | 7 | 从[官网](spark.apache.org/downloads.html)中下载源码,在**Chose a package type** 中选择**Source Code**, 下载后解压缩。 8 | ```bash 9 | tar xvf spark-1.1.1.tgz 10 | ``` 11 | 12 | ## 编译 13 | 14 | ### Step1 设置maven内存限制 15 | 16 | ```bash 17 | export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" 18 | ``` 19 | 20 | ### Step2 增加hadoop-2.5的profile 21 | 22 | 注意hadoop版本2.x.x需要指定profile,在根下的pom.xml下只有2.4.0的profile, 23 | 如果要在hadoop-2.5.x下,需要手动加上hadoop-2.5的profile,即添加pom.xml: 24 | ```xml 25 | 26 | hadoop-2.5 27 | 28 | 2.5.2 29 | 2.5.0 30 | 0.9.0 31 | 32 | 33 | ``` 34 | 否则编译的结果得到的protobuf版本不对,无法读取hdfs上的文件,抛java.lang.VerifyError: class org.apache.hadoop.hdfs 35 | .protocol.proto.ClientNamenodeProtocolProtos$CreateSnapshotRequestProto overrides final method getUnknownFields.() 36 | Lcom/google/protobuf/UnknownFieldSet; 37 | 38 | ### Step3 编译 39 | 40 | 运行: 41 | ```bash 42 | mvn -Pyarn -Phadoop-2.5 -Dhadoop.version=2.5.2 -Phive -DskipTests clean package 43 | ``` 44 | -------------------------------------------------------------------------------- /hadoop/设置sbt代理.md: -------------------------------------------------------------------------------- 1 | # 设置sbt代理 2 | 3 | sbt默认并不读取环境变量`http_proxy`,而是使用java系统属性(property), 我们使用`SBT_OPTS` 4 | 进行设置,具体如下: 5 | ```bash 6 | SBT_OPTS="$SBT_OPTS -Dhttp.proxyHost=proxy.xxx.com\ 7 | -Dhttp.proxyPort=xxx\ 8 | -Dhttp.proxyUser=username -Dhttp.proxyPassword=password" 9 | ``` 10 | 需要注意一下几点: 11 | * `http_proxyHost`**只需要设置代理主机名,不需要协议名**,不能在前面有`http://`或者`https://` 12 | * `http_proxyUser`使用域账户名时,**务必切记需要转义`\`字符**,需要输入两个`\\` 13 | * 建议把值放入引号内,尤其是密码包含`#`字符时,若没有引号,后面会当作注释而截取掉 14 | 15 | `SBT_OPTS`需要export,务必保证sbt能够读取到,为了简易,可以直接编辑`bin/sbt`文件,在开头 16 | 加上: 17 | ```sh 18 | export SBT_OPTS="$SBT_OPTS -Dhttp.proxyHost=proxy.xxx.com\ 19 | -Dhttp.proxyPort=xxx\ 20 | -Dhttp.proxyUser=CHINA\\username -Dhttp.proxyPassword=password" 21 | ``` 22 | 23 | 验证是否成功: 24 | 25 | ```bash 26 | sbt -v # 使用-v参数,输出系统变量 27 | ``` 28 | 输出: 29 | 30 | ``` 31 | [process_args] java_version = '1.7.0_55' 32 | # Executing command line: 33 | java 34 | -Dhttp.proxyHost=proxy.xxx.com 35 | -Dhttp.proxyPort=xxx 36 | -Dhttp.proxyUser=CHINA\username 37 | -Dhttp.proxyPassword=password 38 | -Xms1024m 39 | -Xmx1024m 40 | -XX:ReservedCodeCacheSize=128m 41 | -XX:MaxPermSize=256m 42 | -jar 43 | /home/fgp/sbt/bin/sbt-launch.jar 44 | ``` 45 | **请务必检查以上java属性是否设置正确**,如果是第一次运行,会先下载sbt版本依赖库,可能堵塞几分钟, 46 | 需要耐心等下,如果没有抛超时异常,则说明配置成功! 47 | -------------------------------------------------------------------------------- /java/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/java/.gitkeep -------------------------------------------------------------------------------- /linux/HowToInstallJekyll.md: -------------------------------------------------------------------------------- 1 | ## ubuntu14.04 安装jekyll 2 | 3 | 注意不要使用apt-get直接安装jekyll,默认是老版本的,运行不了。 4 | 5 | 首先需要安装依赖包,注意不仅要安装ruby,还需要ruby-dev和nodejs 6 | ```bash 7 | sudo apt-get install ruby ruby-dev make gcc nodejs 8 | ``` 9 | 10 | 然后使用gem 安装jekyll 11 | ```bash 12 | sudo gem install jekyll --no-rdoc --no-ri 13 | ``` 14 | 15 | 但是会出现 16 | ``` 17 | ERROR: While executing gem ... (NoMethodError) 18 | undefined method `size' for nil:NilClass 19 | ``` 20 | 解决方法是删除cache文件, 21 | ``` 22 | krystism@lenovo:~/notes/linux$ gem env 23 | RubyGems Environment: 24 | - RUBYGEMS VERSION: 1.8.23 25 | - RUBY VERSION: 1.9.3 (2013-11-22 patchlevel 484) [x86_64-linux] 26 | - INSTALLATION DIRECTORY: /var/lib/gems/1.9.1 27 | - RUBY EXECUTABLE: /usr/bin/ruby1.9.1 28 | - EXECUTABLE DIRECTORY: /usr/local/bin 29 | - RUBYGEMS PLATFORMS: 30 | - ruby 31 | - x86_64-linux 32 | - GEM PATHS: 33 | - /var/lib/gems/1.9.1 34 | - /home/fgp/.gem/ruby/1.9.1 35 | - GEM CONFIGURATION: 36 | - :update_sources => true 37 | - :verbose => true 38 | - :benchmark => false 39 | - :backtrace => false 40 | - :bulk_threshold => 1000 41 | - REMOTE SOURCES: 42 | - http://rubygems.org/ 43 | ``` 44 | 得到`GEM PATHS`, 进去删除cache文件。 45 | -------------------------------------------------------------------------------- /linux/bashArray.md: -------------------------------------------------------------------------------- 1 | # bash数组操作 2 | 3 | bash支持两种数组,一种是索引数组,一种是关联数组 4 | 5 | ## 索引数组 6 | 7 | 数组的值类型是任意的,索引也未必一定要连续,当做列表理解更好 8 | 9 | 下面总结下索引数组,即列表: 10 | 11 | ### 1. 声明 12 | 13 | ```bash 14 | declare -a a 15 | ``` 16 | ### 2. 初始化 17 | 18 | ```bash 19 | a=(1 2 3 4) 20 | # OR 21 | a=([0]=2 [3]=8) # 注意长度为2,不是4 22 | ``` 23 | ### 3. 获取列表长度 24 | 25 | ```bash 26 | size=${a[@]} 27 | ``` 28 | ### 4. 追加元素 29 | ```bash 30 | a+=(11 12 13 14) 31 | ``` 32 | ### 5. 赋值 33 | ``` 34 | a[1]=9 35 | ``` 36 | ### 6. 按索引读取 37 | ``` 38 | value=${a[0]} # 读取索引0的值 39 | ``` 40 | ### 7. 删除某元素 41 | ```bash 42 | unset a[0] 43 | ``` 44 | ### 8. 清空数组 45 | ```bash 46 | unset a 47 | ``` 48 | ### 9. 切片 49 | ```bash 50 | echo ${a[@]:1:3} # 从索引1开始的3个元素 51 | # 也支持负数索引,-1表示最后一个,但负数必须用括号括住 52 | last=${a[@]:(-1):1} 53 | ``` 54 | ### 10. 遍历 55 | ```bash 56 | for i in ${a[@]} 57 | do 58 | echo $i 59 | done 60 | ``` 61 | ## 关联数组 62 | 63 | ### 1. 声明 64 | ```bash 65 | declare -A map 66 | ``` 67 | ### 2. 初始化 68 | ``` 69 | map[key1]=value1 70 | map[key2]=value2 71 | # or 72 | map=([key1]=value1 [key2]=value2) 73 | ``` 74 | ### 3. 长度 75 | ```bash 76 | size=${!map[@]} 77 | ``` 78 | ### 4. 获取键集合 79 | ```bash 80 | keyset=${!map[@]} 81 | ``` 82 | ### 5. 获取值集合 83 | ``` 84 | values=${map[@]} 85 | ``` 86 | ### 6. 遍历 87 | ```bash 88 | for key in ${!map[$@]} 89 | do 90 | echo $key:${map[$key]} 91 | done 92 | -------------------------------------------------------------------------------- /linux/bashRedirect.md: -------------------------------------------------------------------------------- 1 | # bash重定向 2 | 3 | 总结下bash重定向: 4 | 1. linux中文件是一种广义的概念, 5 | -------------------------------------------------------------------------------- /linux/bash字符串前美元符号的作用.md: -------------------------------------------------------------------------------- 1 | # bash字符串前美元符号的作用 2 | 3 | ## problem 4 | 5 | bash内置变量IFS作为内部单词分隔符,其默认值为\\\, 我想设置它仅为\n,于是: 6 | ```bash 7 | OLD_IFS=$IFS 8 | IFS='\n' 9 | # do some work here 10 | IFS=$OLD_IFS 11 | ``` 12 | 但结果为:IFS把单独的字符当作了分隔符,即分隔符被设置成下划线和字母n 。 13 | 14 | **Why ?** 15 | 16 | ## Solution 17 | 18 | 通过google搜索,得知需要把\n转化成[ANSI-C Quoting](http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html), 19 | 方法是把字符串放入$'string'中,即应该设置成: 20 | ```bash 21 | IFS=$'\n' 22 | ``` 23 | 顺便搜了下$字符的用途,在[Unix & Linux](http://unix.stackexchange.com/questions/48106/what-does-it-mean-to-have-a-dollarsign-prefixed-string-in-a-script), 24 | 中解释了字符串前面加$字符的两种形式,一种是单引号,一种是双引号,即 25 | > There are two different things going on here, both documented in the bash manual 26 | ### $' 27 | Dollar-sign single quote is a special form of quoting: 28 | ANSI C Quoting 29 | Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. 30 | ### $" 31 | Dollar-sign double-quote is for localization: 32 | Locale translation 33 | A double-quoted string preceded by a dollar sign (‘$’) will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. 34 | If the string is translated and replaced, the replacement is double-quoted. 35 | 36 | 因此单引号表示转化成ANSI-C字符,双引号则表示将字符串本地化。 37 | 38 | 以下是一个实例,ping /etc/hosts的主机名为video-开头的主机名,检查网络状况! 39 | 40 | ```bash 41 | #!/bin/bash 42 | trap "echo 'interrupted!';exit 1" SIGHUP SIGINT SIGTERM 43 | OLD_IFS=$IFS 44 | IFS=$'\n' 45 | for i in `awk '$0!~/^$/ && $0!~/^#/ && $2~/^video/ {print $1,$2}' /etc/hosts` 46 | do 47 | ADDR=$(echo $i | cut -d' ' -f 1) 48 | DOMAIN=$(echo $i | cut -d' ' -f 2) 49 | if ping -c 2 $ADDR &>/dev/null 50 | then 51 | echo $DOMAIN ok! 52 | else 53 | echo $DOMIN dead! 54 | fi 55 | done 56 | IFS=$OLD_IFS 57 | ``` 58 | -------------------------------------------------------------------------------- /linux/cluster-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/linux/cluster-arch.png -------------------------------------------------------------------------------- /linux/json格式化神器jq.md: -------------------------------------------------------------------------------- 1 | # json 格式化神器jq 2 | 3 | ### 官方简介 4 | > 5 | **jq is a lightweight and flexible command-line JSON processor.** 6 | > 7 | jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text. 8 | > 9 | jq is written in portable C, and it has zero runtime dependencies. You can download a single binary, scp it to a far away machine of the same type, and expect it to work. 10 | > 11 | jq can mangle the data format that you have into the one that you want with very little effort, and the program to do so is often shorter and simpler than you’d expect. 12 | 13 | ### 安装 14 | 15 | ubuntu自带软件包,直接使用`apt-get`安装 16 | 17 | ```sh 18 | sudo apt-get install -y jq 19 | ``` 20 | ### 使用 21 | 22 | `jq`和`awk`、`sed`、`grep`类似先过滤或者转换,即使用方法为 23 | 24 | ```sh 25 | jq [options...] filter [files...] 26 | ``` 27 | 下面以[test.txt](static/test.txt) json文件作为demo,内容如下: 28 | 29 | ```json 30 | [{"name":"Mary", "age":26, "sponse":{"name":"Jim", "age":27}, "children":[{"name":"Lucy", "age":8}, {"name":"Lily", "age":5}]}, {"name":"Hery", "age":54, "sponse":{"name":"Sane", "age":55}, "children":[{"name":"Jim", "age":12}, {"name":"John", "age":18}]}] 31 | ``` -------------------------------------------------------------------------------- /linux/kvm启动虚拟机的一些参数.md: -------------------------------------------------------------------------------- 1 | # kvm启动虚拟机的一些参数 2 | 3 | kvm(qemu)启动虚拟机时,参数比较多,也很灵活,相对图形界面Virtalbox & virt-manager操作要复杂,但更灵活,功能更强大. 4 | 5 | * -smp 指定虚拟个数 6 | * -m 指定分配的内存大小 7 | * -cpu 指定cpu model, 使用-cpu ?查看可用的model 8 | * -name 指定虚拟机名称 9 | * -vga 指定显卡类型,默认为cirrus,一般指定std。 10 | * -usb 开启usb设备,在图形界面,为了鼠标指针精确定位,一般还有加上usb设备tablet 11 | * -usbdevice增加usb设备 12 | * -hda 第一块IDE硬盘 13 | * -rtc 设置实时时钟,一般设置utc,但windows需要设置为localtime 14 | * -soundhw 增加声卡设备,使用all,加载所有可用声卡类型 15 | * -net nic 增加网卡 16 | * -net tap 使用tap作为网络连接方式,即网桥。 17 | * -drive 增加IDE,cdrom等设备 18 | * -balloon使用balloon内存管理 19 | * -full-screen 全屏模式 20 | 21 | ## DEMO 22 | 23 | 启动windows7 24 | ```bash 25 | sudo kvm -m $RAM -smp $VCPUS -cpu $CPUS_MODEL -name $NAME -soundhw all -rtc base=localtime -balloon virtio \ 26 | -net nic,model=virtio -net tap,vnet_hdr=on,vhost=on -usb -usbdevice tablet -vga std -drive\ 27 | file=$SECOND_DISK,if=virtio,index=2 -hda $ROOT_DISK 28 | ``` 29 | 30 | 启动ubuntu-server 31 | ```bash 32 | sudo kvm -smp 2 -m 1024 -balloon virtio -net nic,model=virtio -net tap,vnet_hdr=on,vhost=on \ 33 | -drive file=vdb.disk,if=virtio -usb -name ubuntu14.04 ubuntu.qcow2 34 | ``` 35 | -------------------------------------------------------------------------------- /linux/nc命令实例.md: -------------------------------------------------------------------------------- 1 | ## nc命令实例 2 | 3 | nc命令可用于发送任务tcp/udp连接和监听. 4 | 5 | 官方描述的主要功能包括: 6 | 7 | * simple TCP proxies 8 | * shell-script based HTTP clients and servers 9 | * network daemon testing 10 | * a SOCKS or HTTP ProxyCommand for ssh(1) 11 | * and much, much more 12 | 13 | 下面看看官方的几个例子: 14 | 15 | ### 1. p2p简单聊天工具 16 | 17 | 在A机器运行(假设A机器主机名为`node1`: 18 | ```bash 19 | nc -l 1234 # -l表示监听 20 | ``` 21 | 在B机器运行: 22 | ```bash 23 | nc node1 1234 24 | ``` 25 | 26 | 此时从A或者B机器输入任何信息,都会在对方的机器中回显,实现了简单的即时聊天工具. 27 | 28 | ### 2. 文件传输 29 | 30 | 假设B机器有一个文件data.txt,需要传输到A机器: 31 | 32 | 在A机器: 33 | 34 | ```bash 35 | nc -l 1234 >data.txt # data.txt需要保存的目标文件名 36 | ``` 37 | 38 | 在B机器: 39 | ```bash 40 | nc node1 1234 &1 | nc -l 127.0.0.1 1234 > /tmp/f 52 | ``` 53 | 54 | 在B机器: 55 | 56 | ``` 57 | nc node1 1234 58 | ``` 59 | 60 | ### 4.发送HTTP请求 61 | 62 | ```bash 63 | echo "GET / HTTP/1.0\r\n\r\n" | nc localhost 80 64 | ``` 65 | 66 | ### 5.端口扫描 67 | 68 | ```bash 69 | # 查看主机名为node1的80端口是否开放 70 | nc -zv node1 80 71 | # 扫描主机名为node1的1~1024哪些端口是开放的 72 | nc -zc node1 1-1024 73 | ``` 74 | -------------------------------------------------------------------------------- /linux/scriptnote.md: -------------------------------------------------------------------------------- 1 | ## 1. 删除所有的换行符和空格符 2 | 3 | ```bash 4 | sed -e ':a;N;s/\n//;s/ //g;ba' test.txt 5 | ``` 6 | or 7 | 8 | ```bash 9 | cat test.txt | tr -d '\n ' 10 | ``` 11 | 12 | ## 2. spark on hive 13 | 14 | * spark编译了hive 15 | * 必须把hive-site.xml 复制到spark配置目录中 16 | * 必须把hive使用的元数据库的驱动加入到SPARK_CLASSPATH中 17 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCe17+08pqcvLq16DX8ZklIYcYBVZBoodiWKyBZdK2d+iJvvzYfWi8kbuWhZT6H9cGeOn3VfBrdVAgVISSS0zjGvNzc1ndzxFwl/AcG7k2F8dt3KQiCSMXckCBO2nOhW9EcQU88NHlISUlXT5hacps0Gl/nhDeO9ayYRL+Kf40/gmtuSo3CcoFlxPin2Q3cxnCULjJjBVzLpXSnOoPqBf8BRh3Se8b4adHh6cIcvuwevbXzByalj3YC12KlSEM0vtC93CmD3YyQUV/kJuzZt4PwOM0YavI36m7grFvysZjnOCMESiF65nMH5gxgca/SpNkMWvttdDzI2/+FP99zMFPh bupt@controller 18 | 19 | ## shell 笔记 20 | 21 | ### 1. 获取当前shell的环境变量,按行输出 22 | `xargs -0` 或者 `--null` 表示分隔符为`0`字符, `-n`表示每次传参数的最大个数 23 | ```bash 24 | cat /proc/$$/environ | xargs -0 -n 1 25 | cat /proc/$$/environ | tr '\0' '\n' 26 | ``` 27 | ### 2. 设置动态库路径 28 | ```bash 29 | export LD_LIBRARY_PATH=/opt/myapp/lib 30 | ``` 31 | ### 3. let算术操作 32 | 支持 `++` `--` `+` `-` `*` `/` `**` `&` `|`等 33 | ```bash 34 | a=$((5 ** 5)) # a = 3125, 等价a = let 5 ** 5 35 | echo "scale=3; 10 / 3" | bc # 浮点数 36 | ``` 37 | ### 4. bash正则表达式匹配 38 | ```bash 39 | [[ 'a5a' =~ [a-zA-Z][0-9][a-z] ]] && echo "YES" || echo "NO" 40 | # 注意 =~ 后面的正则表达式不能用引号 41 | ``` 42 | ### 5. 重定向 43 | `>&` 实际复制了文件描述符, `ls >dirlist 2>&1` 与 `ls 2>&1 >dirlist` 不一样 44 | ### 6. 关联数组 45 | 46 | * `declare -a a` 把变量a声明为索引数组 47 | * `declare -A a` 把变量a声明为关联数组 48 | * `${a[@]}`获取所有的值, `${!a[@]}` 获取所有的键 49 | ### 7. exec & source 50 | * source: 在当前进程中执行参数文件中的各个命令,而不是另起子进程 51 | * exec: 以当前命令替换shell的上下文,并不起子进程,使用这一命令时任何现有环境都将会被清除。 exec在对文件描述符进行操作的时候,也只有在这时,exec不会覆盖你当前的 shell 环境。 52 | `\(command1;command2\)\`: 将命令置于新进程,继承父进程所有文件描述符 53 | 54 | ### 8. 关联数组 55 | ```bash 56 | declare -A map 57 | map[key]=value 58 | map=([key1]=value1 [key2]=value2) 59 | keyset: ${!map[@]} 60 | values: ${map[@]} 61 | map[count]=0 62 | let map[count]++ 63 | ``` 64 | ### 9. tput stty 65 | ### 10. 通过引用子shell保留空格和回车,使用引号 66 | `out="$(ls)"` 67 | ### 11. read -n 字符个数 -s 禁止回显 -p 提示符 -t 时间 -d 分隔符 68 | ### 12. true命令可能会生成一个新进程,使用冒号效率更高 69 | ### 13. 字段分隔符、参数分隔符`IFS` 70 | ```bash 71 | IFS=',' 72 | line='1,2,3,4,5' 73 | for i in line 74 | do 75 | echo $i 76 | done 77 | ``` 78 | ### 14. for 循环 79 | ```bash 80 | # 迭代 81 | for i in list 82 | do 83 | echo $i 84 | done 85 | # range 86 | for i in {1..50} 87 | do 88 | echo $i 89 | done 90 | # c 风格 91 | for((i = 0; i <= 50; ++i)) 92 | do 93 | echo $i 94 | done 95 | ``` 96 | ### 15. cat 97 | ```bash 98 | cat - a >out # 从标准输入流输入内容插入a中 99 | cat -s 过滤多余空行 100 | ``` 101 | ### 16. script & scriptreplay 102 | ### 17. find 命令 103 | ```bash 104 | #删除所有的swp文件 105 | find . -maxdepth 1 -type f -name "*.swp" -delete 106 | # 将10天前的文件复制到OLD目录 107 | find . -maxdepth 1 -type -f -mtime +10 -name ".txt" -exec cp {} OLD \; 108 | ``` 109 | ### 18. xargs 命令 110 | ```bash 111 | echo -n "split:split:split:split" | xargs -d : -n 2 112 | split split 113 | split split 114 | #output 115 | split split 116 | split split 117 | # 统计c代码行数 118 | find . -maxdepth 1 -type f -name ".c" -print0 | xargs -0 wc -l 119 | # 注意print0 和-0 表示以null作为分隔符,防止文件名包括空格回车造成错误 120 | ``` 121 | ### 19. tr命令 122 | ```bash 123 | # 小写转化大写 124 | echo "heLLo" | tr 'a-z' 'A-Z' 125 | echo "heLLo" | tr '[:lower:]' ''[:upper:]' 126 | # 空格转化为回车 127 | echo "1 2 3 4" | tr ' ' '\n' 128 | # 删除数字 129 | echo "abcd123dd" | tr -d '0-9' # abcddd 130 | # 保留数字 131 | echo "abcd123dd" | tr -d -c '0-9' # 123 132 | # 压缩字符 133 | echo "aaabbbccc" | tr -s 'ab' # abccc 134 | # 求和 135 | echo '1 2 3 4 5' | echo $[ $(tr ' ' '+') ] 136 | ``` 137 | ### 20. 文件校验 138 | ```bash 139 | # 产生校验 140 | md5sum test.txt >test.md5 141 | # 校验 142 | md5sum -c test.md5 143 | ``` 144 | ### 21. 文件加密crypt gpg base64 145 | ### 22. sort 146 | ```bash 147 | # 默认按字典序排列 148 | echo "3 2 1 13 11 12" |tr ' ' '\n' | sort | tr '\n' ' ' # 1 11 12 13 2 3 149 | # 使用-n按大小排序 150 | echo "3 2 1 13 11 12" |tr ' ' '\n' | sort -n | tr '\n' ' ' # 1 2 3 11 12 13 151 | # 使用-r表示逆序 152 | # 检查文件是否排序 153 | sort -C test1 && echo "sorted" || echo "unsorted" 154 | # 使用-k指定哪个列作为键 155 | # -b 忽略前导空白行 156 | # -m 把已排好序的文件归并 157 | ``` 158 | ### 23. uniq 159 | ```bash 160 | # 注意该文件必须保证是已排好序的文件 161 | # 过滤重复行 162 | echo "1 2 2 3 3 3" | tr ' ' '\n' | uniq # 1 2 3 163 | # 只输出唯一行 164 | echo "1 2 2 3 3 3" | tr ' ' '\n' | uniq -u # 1 165 | # 统计重复次数 166 | echo "a b b c c c c" | tr ' ' '\n' | uniq -c # 1 a 2 b 4 c 167 | # 输出重复行 168 | echo "a b b c c c c" | tr ' ' '\n' | uniq -d # b c 169 | ``` 170 | ### 24. mktemp 创建临时文件 171 | ### 25. 切分文件名 172 | ```bash 173 | # 获取文件扩展名 174 | ${file#*.} 175 | # 或者文件名 176 | ${file%.*} 177 | ``` 178 | ### 26. 批量重名名文件 179 | ```bash 180 | # 把*.JPG 重命名为*.jpg 181 | rename *.JPG *.jpg 182 | # 将文件名的空格替换为_ 183 | rename 's/ /_/g' * 184 | # 转化文件大小写 185 | rename 'y/a-z/A-Z/' * 186 | ``` 187 | ### 27. look单词查找 188 | ### 28. 数组追加 189 | ```bash 190 | a=() # 声明一个空数组 191 | a+=(1 2) # 追加1 2 到数组a中 192 | ``` 193 | ### 29. 并行进程加速命令执行 194 | ```bash 195 | PIDS=() 196 | for i in {1..50} 197 | do 198 | echo $i >>out & 199 | PIDS+=("$!") # $!表示最后一个后台进程pid,追加到PIDS数组中 200 | done 201 | wait ${PIDS[@]} 202 | ``` 203 | ### 30. 文件交集、差集 204 | ```bash 205 | # 两个文件必须是排好序的 206 | comm A.txt b.txt 207 | # 第1列包含只在A文件(A的差集),2列包含只在B文件(B 的差集), 208 | # 第3列包含A、B相同的行(A、B的交集) 209 | # -1 -2 -3 分布表示删除第1,2,3列 210 | ``` 211 | ### 31. 文件差异和修补 212 | ```bash 213 | # 查看文件差异 214 | diff a.txt b.txt 215 | # 打补丁 216 | diff a.txt b.txt >patch 217 | patch a.txt < patch 218 | # 取消补丁 219 | patch -p1 a.txt " 5 | exit 1 6 | fi 7 | file=$1 8 | declare -A count 9 | for word in $(grep -P -o '\b\w+\b' $file) 10 | do 11 | let count[$word]++ 12 | done 13 | for word in ${!count[@]} 14 | do 15 | printf "%-14s%s\n" $word ${count[$word]} 16 | done 17 | -------------------------------------------------------------------------------- /linux/ubuntu ceph安装以及使用.md: -------------------------------------------------------------------------------- 1 | # ubuntu ceph安装以及使用 2 | 3 | ## 1.安装环境 4 | 本文主要根据官方文档使用ubuntu14.04安装ceph集群,并且简单熟悉其基本操作。整个集群包括一个admin节点(admin node,主机名为node0)和3个存储节点(主机名分别为node1,node2,node3),所有节点均安装ubuntu 14.04操作系统,除了admin节点,其余三个节点除了根磁盘,还额外配置一个磁盘作为单独的osd: 5 | 6 | ```bash 7 | lsblk 8 | ``` 9 | 10 | 输出结果: 11 | 12 | ``` 13 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 14 | sr0 11:0 1 422K 0 rom 15 | vda 253:0 0 20G 0 disk 16 | ├─vda1 253:1 0 19G 0 part / 17 | ├─vda2 253:2 0 1K 0 part 18 | └─vda5 253:5 0 1022M 0 part [SWAP] 19 | vdb 253:16 0 50G 0 disk 20 | ``` 21 | 由于我们使用ustack的公有云申请的云主机,因此磁盘是虚拟的,根磁盘为vda,附加磁盘为vdb。 22 | 所有主机均处于`192.168.0.0/24`这个网络,ip为: 23 | 24 | ``` 25 | 192.168.0.2 node0 26 | 192.168.0.5 node1 27 | 192.168.0.7 node2 28 | 192.168.0.6 node3 29 | ``` 30 | 我们先设置一个mon节点,两个osd节点,后续我们再增加节点,其架构如图所示: 31 | 32 | ![集群架构图](cluster-arch.png) 33 | 34 | 其中node1作为mon节点,其余node2,node3作为osd节点。 35 | 36 | **注意:**后续操作均使用root账号,如果不使用root账号登录,需要创建一个新的账号,该账号必须具有免密码sudo权限,否则后续使用`ceph-deploy`时会失败! 37 | 38 | ## 2.安装前工作 39 | 40 | ### 1.设置admin节点root免密码登录其他节点 41 | 首先使用`ssh-keygen`生成密钥,位于`~/.ssh/id_rsa.pub`,分别拷贝`id_rsa.pub`文件到所有节点中,若没有设置root密码,可以先拷贝到管理员账号(安装操作系统时使用的用户,具有`sudo`权限)home目录,然后使用管理员账号操作: 42 | 43 | ```bash 44 | cat id_rsa.pub | sudo tee -a /root/.ssh/authorized_keys 45 | ``` 46 | 在node0节点分别测试,是否可以免密码登录其他节点: 47 | 48 | ```bash 49 | ssh node0 uptime 50 | ssh node1 uptime 51 | ssh node2 uptime 52 | ssh node3 uptime 53 | ``` 54 | 结果应该不需要输入密码。 55 | 56 | ### 2.安装并行ssh命令 57 | 在admin节点安装pssh包: 58 | 59 | ```bash 60 | apt-get install -y pssh 61 | ``` 62 | 63 | 设置以下别名: 64 | 65 | ```bash 66 | alias pssh='parallel-ssh' 67 | alias pscp='parallel-scp' 68 | ``` 69 | 70 | 创建host文件列表`hosts.txt`: 71 | 72 | ``` 73 | node0 74 | node1 75 | node2 76 | node3 77 | ``` 78 | 79 | 测试下pssh是否工作: 80 | 81 | ```bash 82 | pssh -h hosts.txt uptime 83 | ``` 84 | 如果全部结果都为`SUCCESS`,则说明正常工作。 85 | 86 | ### 3.使用国内镜像源 87 | 为了提高访问速度,建议修改为国内镜像源,我们使用的是阿里云镜像源: 88 | 89 | ``` 90 | root@node0:~# cat /etc/apt/sources.list 91 | deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 92 | deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 93 | deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 94 | deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 95 | deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 96 | deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 97 | deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 98 | deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 99 | deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 100 | deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 101 | ``` 102 | 拷贝该文件到所有的节点: 103 | 104 | ```bash 105 | pscp -h ~/hosts.txt /etc/apt/sources.list /etc/apt/ 106 | ``` 107 | 108 | 更新源: 109 | 110 | ```bash 111 | pssh -h ~/hosts.txt 'apt-get update -y' 112 | ``` 113 | 114 | ### 4.安装ceph-deploy 115 | 116 | 以下操作只需要在admin节点执行,首先需要增加ceph源: 117 | 118 | ```bash 119 | wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - 120 | echo deb http://download.ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list 121 | ``` 122 | 安装ceph-deploy: 123 | 124 | ```bash 125 | sudo apt-get update && sudo apt-get install ceph-deploy 126 | ``` 127 | 128 | 生产环境还需要安装ntp服务,保证集群的时钟一致,这次只是为了测试,故省略这一步。另外由于ubuntu默认防火墙是关的,SELinux也没有安装,故不需要任何操作。使用centos安装时需要打开必要端口。 129 | 130 | ## 3.开始安装ceph集群 131 | 132 | 我们使用`ceph-deploy`部署,后续操作均在admin节点操作。 133 | 首先需要创建工作环境,该环境会保存所有的配置文件: 134 | 135 | ```bash 136 | mkdir my-cluster 137 | cd my-cluster 138 | ``` 139 | 接下分别执行以下步骤: 140 | 141 | ### 1.创建集群 142 | 143 | ```bash 144 | ceph-deploy new node1 145 | ``` 146 | 其中node1是mon节点,执行该命令会生成ceph配置文件、monitor密钥文件以及日志文件。 147 | 148 | ### 2.修改默认冗余份数 149 | 150 | 由于我们目前只有两个osd节点,而默认的冗余份数是3,因此我们需要设置为2,如果osd节点大于2,则此步骤省略。 151 | 152 | 修改`ceph.conf`文件,在`[global]`下增加以下内容: 153 | 154 | ``` 155 | osd pool default size = 2 156 | ``` 157 | 158 | ### 3.配置网卡和网络 159 | 160 | 如果主机有多余一个网卡,需要设置使用的网卡和网络地址,由于我们主机只有一张网卡,此步骤省略。 161 | 162 | ### 4.开始安装ceph 163 | 164 | ```bash 165 | ceph-deploy install node0 node1 node2 node3 166 | ``` 167 | 168 | ### 5.初始化mon节点和收集密钥信息 169 | 170 | ```bash 171 | ceph-deploy mon create-initial 172 | ``` 173 | 174 | 执行完毕,目录应该有以下文件: 175 | 176 | ``` 177 | {cluster-name}.client.admin.keyring 178 | {cluster-name}.bootstrap-osd.keyring 179 | {cluster-name}.bootstrap-mds.keyring 180 | {cluster-name}.bootstrap-rgw.keyring 181 | ``` 182 | 183 | 完成以上步骤,安装完成,但还没有配置osd节点。 184 | 185 | ### 6.配置osd节点 186 | 187 | 首先格式化磁盘,注意我们使用的是`/dev/vdb`: 188 | 189 | ```bash 190 | ceph-deploy disk zap node2:vdb 191 | ceph-deploy disk zap node3:vdb 192 | ``` 193 | 以上步骤会清空磁盘的所有数据。 194 | 接下来创建osd,注意由于我们只是测试,故没有使用单独的磁盘作为journal,实际在生产环境下,需要配备SSD分区作为journal,能够最大化IO吞吐量。 195 | 196 | ``` 197 | ceph-deploy osd create node2:vdb 198 | ceph-deploy osd create node3:vdb 199 | ``` 200 | 201 | ### 7.配置admin节点 202 | admin节点同时也作为我们的client节点,需要拷贝其他节点的配置文件以及密钥,使得不需要指定mon地址以及用户信息就可以直接管理我们的ceph集群,执行以下命令即可: 203 | 204 | ```bash 205 | ceph-deploy admin node0 node1 node2 node3 206 | sudo chmod +r /etc/ceph/ceph.client.admin.keyring # 保证具有读取的密钥的权限 207 | ``` 208 | 209 | ### 8.测试结果 210 | 211 | 运行以下命令: 212 | 213 | ```bash 214 | ceph health 215 | ``` 216 | 217 | 结果若返回`active + clean`状态,则说明部署成功! 218 | 219 | ## 4.扩展节点 220 | 221 | 增加node1也作为osd节点: 222 | 223 | ```bash 224 | ceph-deploy disk zap node1:vdb 225 | ceph-deploy osd create node1:vdb 226 | ceph-deploy osd create node1:vdb 227 | ``` 228 | 229 | 若需要cephFS支持,即需要提供文件系统支持,需要部署metadata server: 230 | 231 | ```bash 232 | ceph-deploy mds create node1 233 | ``` 234 | 若需要Ceph Object Gateway支持,即对象存储节点,需要部署一个RGW实例, 235 | 236 | ```bash 237 | ceph-deploy rgw create node1 238 | ``` 239 | 240 | ceph集群至少需要一个mon节点,为了实现高可用,通常需要设置多个(一般设置为3个)mon节点,我们把node2,node3也作为mon节点: 241 | 242 | ```bash 243 | ceph-deploy mon add node2 node3 244 | ``` 245 | 246 | 当有多个mon节点时,ceph将使用quorum算法进行同步,查看状态: 247 | 248 | ```bash 249 | ceph quorum_status --format json-pretty 250 | ``` 251 | 252 | ## 5.块存储rbd使用 253 | 254 | 我们使用默认的rbd池,首先创建一个新的块设备(cinder称为volume,ceph称为image): 255 | 256 | ```bash 257 | rbd create foo --size 4096 258 | ``` 259 | 查看刚刚创建的实例: 260 | 261 | ```bash 262 | rbd ls 263 | # foo 264 | ``` 265 | 映射实例到虚拟设备中: 266 | 267 | ```bash 268 | rbd map foo 269 | # /dev/rbd1 270 | ``` 271 | 创建文件系统并挂载到/mnt: 272 | 273 | ```bash 274 | mkfs.ext4 /dev/rbd1 275 | mount /dev/rbd1 /mnt 276 | df -h 277 | Filesystem 1K-blocks Used Available Use% Mounted on 278 | udev 1014072 12 1014060 1% /dev 279 | tmpfs 204988 808 204180 1% /run 280 | /dev/vda1 19478204 1936088 16529636 11% / 281 | none 4 0 4 0% /sys/fs/cgroup 282 | none 5120 0 5120 0% /run/lock 283 | none 1024932 0 1024932 0% /run/shm 284 | none 102400 0 102400 0% /run/user 285 | /dev/rbd1 3997376 8184 3763096 1% /mnt 286 | ``` 287 | 把实例扩容到8GB: 288 | 289 | ```bash 290 | rbd resize foo --size 8192 291 | resize2fs /dev/rbd1 292 | df -h 293 | Filesystem Size Used Avail Use% Mounted on 294 | udev 991M 12K 991M 1% /dev 295 | tmpfs 201M 808K 200M 1% /run 296 | /dev/vda1 19G 1.9G 16G 11% / 297 | none 4.0K 0 4.0K 0% /sys/fs/cgroup 298 | none 5.0M 0 5.0M 0% /run/lock 299 | none 1001M 0 1001M 0% /run/shm 300 | none 100M 0 100M 0% /run/user 301 | /dev/rbd1 7.8G 9.0M 7.4G 1% /mnt 302 | ``` 303 | 创建实例快照: 304 | 305 | ```bash 306 | rbd snap create test@test-snap 307 | ``` 308 | 309 | ## 6.分布式文件系统使用 310 | 311 | 创建一个文件系统: 312 | 313 | ```bash 314 | ceph osd pool create cephfs_data 128 315 | ceph osd pool create cephfs_metadata 128 316 | ceph fs new test_fs cephfs_metadata cephfs_data 317 | ceph fs ls 318 | # name: test_fs, metadata pool: cephfs_metadata, data pools: [cephfs_data ] 319 | ``` 320 | 321 | 创建secret文件: 322 | 323 | ```bash 324 | cat ceph.client.admin.keyring 325 | ``` 326 | 输出结果: 327 | 328 | ```bash 329 | [client.admin] 330 | key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w== 331 | ``` 332 | 把key值拷贝到secret文件: 333 | 334 | ```bash 335 | echo "AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==" >admin.secret 336 | ``` 337 | 安装mount ceph插件: 338 | 339 | ```bash 340 | apt-get install ceph-fs-common 341 | ``` 342 | 343 | 挂载到本地文件系统`/mnt`: 344 | 345 | ```bash 346 | sudo mount -t ceph 192.168.0.5:6789:/ /mnt -o name=admin,secretfile=admin.secret 347 | ``` 348 | 其中`192.168.0.5`是node1 ip,也即mon节点ip地址。 349 | 350 | 运行`df`命令查看是否挂载成功,成功即可像本地文件系统一样操作。 351 | 352 | ### 7.对象存储 353 | 354 | 省略。。。 355 | 356 | ### 参考 357 | 358 | http://docs.ceph.com/docs/master/ 359 | -------------------------------------------------------------------------------- /linux/ubuntu终端显示中文乱码.md: -------------------------------------------------------------------------------- 1 | # ubuntu终端显示中文乱码 2 | 3 | ## Problem 4 | 5 | 终端突然无法输入中文,并且无法显示中文,中文显示为*???*。切换其他用户,可以正常工作,并且nautilus中文显示正常. 6 | 7 | ## Solution 8 | 可以排除是编码设置问题,因为其他应用都显示正常。于是问题一定在于软件配置。由于使用的是gnome-terminal, 9 | 因此可能是这个app的问题。尝试修改profile preferences无果。尝试gconf,该app的配置在~/.gconf/apps/gnome-terminal下, 10 | 为了还原默认设置,只需要删除gnome-terminal这个目录即可,恢复正常。 11 | -------------------------------------------------------------------------------- /linux/windows安装puppet-agent问题.md: -------------------------------------------------------------------------------- 1 | # 中文版本windows系统安装puppet agent问题 2 | 3 | ## 1. How to install 4 | 5 | windows pupppet只能安装agent,安装过程,在[这里](https://docs.puppetlabs.com/pe/latest/install_windows.html). 6 | 安装过程比较简单,但在运行agent时会遇到几个问题。 7 | 8 | ## 2. Error: Could not run: ”\xB2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE 9 | 10 | 这是win32-dir库bug,需要升级,使用管理员身份运行*start command prompt with puppet*,然后运行: 11 | ```sh 12 | gem install win32-dir 13 | gem list 14 | ``` 15 | 确保运行gem list后win32-dir版本大于0.4.3。 16 | 17 | ## 3. could not intern from pson XXXX 18 | 19 | 这是由于编码问题造成的,master在获取facter变量时不能有中文(或者保证传输的编码和master一致),运行facter后发现*timezone* 20 | 输出中文。简单的解决办法是,修改facter的timezone,位于 21 | ``` 22 | 安装路径:C:\Program Files\Puppet Labs\Puppet\facter\lib\facter. 23 | ``` 24 | 根据实际情况修改setcode值,我是直接硬编码为"UTC+8",或者可以参照世界时区标准记法。 25 | 26 | ## certificate verify failed: [CRL is not yet valid for /CN controller 27 | 28 | 这是由于agent和master clock不同步造成的,openstack中创建windows云主机时需要指os_type为windows,才能社会之RTC为localtime,否则时间会不准。 29 | -------------------------------------------------------------------------------- /linux/wordCount.md: -------------------------------------------------------------------------------- 1 | # 使用bash关联数组统计单词 2 | 3 | 从bash 4开始支持关联数组,使用前需要声明,即 4 | ```bash 5 | declare -A map 6 | map[key1]=value1 7 | map[key2]=value2 8 | map=([key1]=value1 [key2]=value2) 9 | # 获取keys 10 | keys=${!map[@]} 11 | # 获取values 12 | values=${map[@]} 13 | ``` 14 | 利用关联数组,很容易实现单词统计,源码文件[wordCount.sh](src/wordCount.sh) 15 | ```bash 16 | #!/bin/bash 17 | if [[ $# -lt 1 ]] 18 | then 19 | echo "Usage: $0 " 20 | exit 1 21 | fi 22 | file=$1 23 | declare -A count 24 | for word in $(grep -P -o '\b\w+\b' $file) 25 | do 26 | let count[$word]++ 27 | done 28 | for word in ${!count[@]} 29 | do 30 | printf "%-14s%s\n" $word ${count[$word]} 31 | done 32 | ``` 33 | 使用方法 34 | ```bash 35 | ./wordCount.sh filename 36 | ``` 37 | 或者从标准流中使用,如 38 | ```bash 39 | echo "Hello World! GoodBye World!" | ./wordCount.sh - 40 | ``` 41 | 输出为 42 | ``` 43 | Hello 1 44 | World 2 45 | GoodBye 1 46 | ``` 47 | 48 | -------------------------------------------------------------------------------- /linux/使用ansible远程执行命令.md: -------------------------------------------------------------------------------- 1 | # 使用ansible远程执行命令 2 | ## 1.ansible简介 3 | ansible的官方定义:“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标: 4 | 5 | * 自动化部署APP 6 | * 自动化管理配置项 7 | * 自动化的持续交付 8 | * 自动化的(AWS)云服务管理。 9 | 10 | 其本质上就是在远程在多台服务器执行一系列命令和文件同步,和以前的介绍的[使用并行ssh提高工作效率](https://github.com/int32bit/notes/blob/master/linux/使用并行ssh提高工作效率.md)功能类似,他们都是使用ssh协议进行远程操作,但ansible比pssh功能更强大,比如支持主机列表分组、支持playbook模板文件等。本文仅仅介绍ansible的Ad-Hoc用法,即默认的command模块,直接在shell执行命令。 11 | 12 | ## 2.安装 13 | 14 | ubuntu14.04直接使用`apt-get`安装: 15 | 16 | ```bash 17 | sudo apt-get install -y ansible 18 | ``` 19 | 也可以使用pip命令安装: 20 | 21 | ```bash 22 | sudo pip install ansible 23 | ``` 24 | 25 | 为了支持输入远程主机用户密码,还需要安装`sshpass`工具: 26 | 27 | ```bash 28 | sudo apt-get install -y sshpass 29 | ``` 30 | 安装完成后创建~/.hosts文件,内容如下: 31 | 32 | ``` 33 | [local] 34 | ceph-0 35 | [mon] 36 | ceph-1 37 | [osd] 38 | ceph-2 39 | ceph-3 40 | ``` 41 | 以上配置文件定义了三个主机组,分别为`local`、`mon`、`osd`,`ceph-x`是主机名。ansible执行需要指定主机列表文件,默认为`/etc/hosts`,用户也可以通过`-i hosts_file`指定,我们修改默认文件为我们刚刚创建的新文件,创建`~/.ansible.cfg`,增加以下内容: 42 | 43 | ```cfg 44 | [defaults] 45 | hostfile=~/.hosts 46 | ``` 47 | 48 | ## 3.使用ansible 49 | ansible的简单语法为: 50 | 51 | ```bash 52 | ansible [-f forks] [-m module_name] [-a args] 53 | ``` 54 | 其中`host-pattern`指定主机组,比如上面的`osd`、`local`等,`-f`指定并行数,默认为`5`,`-m`指定模块名,比如`ping`表示探测远程主机是否可访问,`command`表示执行`shell`命令,`copy`表示传输文件等,默认为`command`,`-a`是指定选项参数,不同的模块具有不同的参数,比如`ping`不需要选项,`command`需要指定执行的命令,`copy`需要指定`src`和`dest`等。另外还有以上提到的`-i`指定主机列表文件、`-u`指定远程执行用户名等。 55 | 在所有的osd节点执行`uptime`操作,远程主机必须有一样的用户名和密码,如果不指定用户名,则默认使用当前登录主机的用户名,否则如果和登录主机用户名不一样,必须通过`-u username`指定远程主机: 56 | 57 | ```bash 58 | ansible osd -a 'uptime' 59 | ``` 60 | 输出: 61 | 62 | ``` 63 | ceph-3 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue 64 | ceph-2 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue 65 | ``` 66 | 命令执行失败,我们使用`-vvvv`选项查看详细信息: 67 | 68 | ```bash 69 | ansible -vvvv osd -a 'uptime' 70 | ``` 71 | 输出: 72 | 73 | ``` 74 | ebug1: Trying private key: /home/fgp/.ssh/id_rsa 75 | debug3: no such identity: /home/fgp/.ssh/id_rsa: No such file or directory 76 | debug1: Trying private key: /home/fgp/.ssh/id_dsa 77 | debug3: no such identity: /home/fgp/.ssh/id_dsa: No such file or directory 78 | debug1: Trying private key: /home/fgp/.ssh/id_ecdsa 79 | debug3: no such identity: /home/fgp/.ssh/id_ecdsa: No such file or directory 80 | debug1: Trying private key: /home/fgp/.ssh/id_ed25519 81 | debug3: no such identity: /home/fgp/.ssh/id_ed25519: No such file or directory 82 | debug2: we did not send a packet, disable method 83 | debug1: No more authentication methods to try. 84 | Permission denied (publickey,password). 85 | ``` 86 | 说明我们既没有密钥文件也没有输入用户密码,因此无法通过ssh认证,需要输入密码,使用`-k`选项: 87 | 88 | ``` 89 | ➜ ~ ansible osd -a 'uptime' -k 90 | SSH password: 91 | ceph-2 | success | rc=0 >> 92 | 11:01:17 up 1 day, 6 min, 5 users, load average: 0.02, 0.02, 0.05 93 | 94 | ceph-3 | success | rc=0 >> 95 | 11:01:17 up 1 day, 6 min, 5 users, load average: 0.03, 0.03, 0.05 96 | ``` 97 | 执行成功了,输入一次密码后,ansible会保存认证session,在session有效期内,不需要重复输入密码,即在执行了以上命令后,不需要再传递`-k`参数: 98 | 99 | ``` 100 | ➜ ~ ansible osd -a 'uptime' 101 | ceph-2 | success | rc=0 >> 102 | 11:02:14 up 1 day, 7 min, 5 users, load average: 0.01, 0.02, 0.05 103 | 104 | ceph-3 | success | rc=0 >> 105 | 11:02:14 up 1 day, 7 min, 5 users, load average: 0.01, 0.02, 0.05 106 | ``` 107 | 有效期只有几分钟时间,为了避免每次输入密码,建议还是通过设置密钥来实现免密码登录,若本地还没有生成密钥文件,则先使用`ssh-keygen`命令生成密钥文件: 108 | 109 | ``` 110 | ➜ ~ ssh-keygen [1/1877] 111 | Generating public/private rsa key pair. 112 | Enter file in which to save the key (/home/fgp/.ssh/id_rsa): 113 | Enter passphrase (empty for no passphrase): 114 | Enter same passphrase again: 115 | Your identification has been saved in /home/fgp/.ssh/id_rsa. 116 | Your public key has been saved in /home/fgp/.ssh/id_rsa.pub. 117 | The key fingerprint is: 118 | 49:8b:d0:a0:29:69:c8:32:50:3d:fc:8a:0a:4e:c8:1d fgp@ceph-0 119 | The key's randomart image is: 120 | +--[ RSA 2048]----+ 121 | |...o. | 122 | |+. o+o | 123 | |*oo .o. . | 124 | |oo E ..o o | 125 | |o ..... S | 126 | |oo... | 127 | |+. | 128 | |.. | 129 | | | 130 | +-----------------+ 131 | ``` 132 | 我们把`~/.ssh/id_rsa.pub`文件拷贝到所有的主机,拷贝文件需要指定`-m`模块名为`copy`,指定所有的主机的`host-pattern`为`all`: 133 | 134 | ```bash 135 | ansible all -m copy -a 'src=~/.ssh/id_rsa.pub dest=~' -k 136 | ansible all -a 'ls' -k # 查看是否传输成功 137 | ``` 138 | 接下来把公钥追加到`~/.ssh/authorized_keys`中,我们需要执行`cat ~/id_rsa.pub >> ~/.ssh/`命令,但默认的`command`模块是不支持重定向和管道的,为了使用重定向和管道,我们使用`shell`模块: 139 | 140 | ```bash 141 | ansible all -m shell -a 'mkdir -p .ssh' # assure ~/.ssh exist! 142 | ansible all -m shell -a 'cat ~/id_rsa.pub >> ~/.ssh/authorized_keys' -k 143 | ``` 144 | 验证下是否工作,注意下面的命令没有指定`-k`选项: 145 | 146 | ```bash 147 | ansible all -m shell -a 'cat .ssh/authorized_keys' 148 | ``` 149 | 输出: 150 | 151 | ``` 152 | ➜ ~ ansible all -m shell -a 'cat .ssh/authorized_keys' [1/1839] 153 | ceph-0 | success | rc=0 >> 154 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxjl++nrmghoRVQnnJALR8Ia6eD87hdewZ9XZP9Ay3ZU1eU9F5MF0A7I7UY08kY7az7+14YJeP0T+zhEl8trc6NDV47LJnMG8ONVePokCeCvFgukUa8QpAhMWXSRSyUFA3Q4LpVmRu2nat$lSrwhu0W7uazq9OA5YxSCZRV/lb6bTsrrywBT4s9Crr5DWKUeZ1uKeUVghz0KmxH/ICWyFGE3v3OsqTMvtWM/R5m6FIgb86bd3CsM4UAP4v5I4FEx4+iqsbtvww3qOkY3Qj91AGOuYq8yNhFmQVN7VZZ9OR/8Vc0iI1wOG+vylbEJjr0/pjX$pPzPrOtW0Q6PjTKZXL fgp@ceph-0 155 | 156 | ceph-3 | success | rc=0 >> 157 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxjl++nrmghoRVQnnJALR8Ia6eD87hdewZ9XZP9Ay3ZU1eU9F5MF0A7I7UY08kY7az7+14YJeP0T+zhEl8trc6NDV47LJnMG8ONVePokCeCvFgukUa8QpAhMWXSRSyUFA3Q4LpVmRu2nat$lSrwhu0W7uazq9OA5YxSCZRV/lb6bTsrrywBT4s9Crr5DWKUeZ1uKeUVghz0KmxH/ICWyFGE3v3OsqTMvtWM/R5m6FIgb86bd3CsM4UAP4v5I4FEx4+iqsbtvww3qOkY3Qj91AGOuYq8yNhFmQVN7VZZ9OR/8Vc0iI1wOG+vylbEJjr0/pjX$pPzPrOtW0Q6PjTKZXL fgp@ceph-0 158 | 159 | ceph-2 | success | rc=0 >> 160 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxjl++nrmghoRVQnnJALR8Ia6eD87hdewZ9XZP9Ay3ZU1eU9F5MF0A7I7UY08kY7az7+14YJeP0T+zhEl8trc6NDV47LJnMG8ONVePokCeCvFgukUa8QpAhMWXSRSyUFA3Q4LpVmRu2nat$lSrwhu0W7uazq9OA5YxSCZRV/lb6bTsrrywBT4s9Crr5DWKUeZ1uKeUVghz0KmxH/ICWyFGE3v3OsqTMvtWM/R5m6FIgb86bd3CsM4UAP4v5I4FEx4+iqsbtvww3qOkY3Qj91AGOuYq8yNhFmQVN7VZZ9OR/8Vc0iI1wOG+vylbEJjr0/pjX$pPzPrOtW0Q6PjTKZXL fgp@ceph-0 161 | 162 | ceph-1 | success | rc=0 >> 163 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxjl++nrmghoRVQnnJALR8Ia6eD87hdewZ9XZP9Ay3ZU1eU9F5MF0A7I7UY08kY7az7+14YJeP0T+zhEl8trc6NDV47LJnMG8ONVePokCeCvFgukUa8QpAhMWXSRSyUFA3Q4LpVmRu2nat$lSrwhu0W7uazq9OA5YxSCZRV/lb6bTsrrywBT4s9Crr5DWKUeZ1uKeUVghz0KmxH/ICWyFGE3v3OsqTMvtWM/R5m6FIgb86bd3CsM4UAP4v5I4FEx4+iqsbtvww3qOkY3Qj91AGOuYq8yNhFmQVN7VZZ9OR/8Vc0iI1wOG+vylbEJjr0/pjX$pPzPrOtW0Q6PjTKZXL fgp@ceph-0 164 | ``` 165 | 可见我们免密码执行远程命令,并且验证了公钥已经追加到`~/.ssh/authorized_keys`中。 166 | 下面我们执行一下更新操作,命令为`apt-get update -y`: 167 | 168 | ```bash 169 | ansible all -m shell -a 'apt-get update -y' 170 | ``` 171 | 输出结果: 172 | 173 | ``` 174 | ceph-1 | FAILED | rc=100 >> 175 | E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) 176 | E: Unable to lock directory /var/lib/apt/lists/ 177 | E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) 178 | E: Unable to lock the administration directory (/var/lib/dpkg/), are you root? 179 | 180 | ceph-2 | FAILED | rc=100 >> 181 | E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) 182 | E: Unable to lock directory /var/lib/apt/lists/ 183 | E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) 184 | E: Unable to lock the administration directory (/var/lib/dpkg/), are you root? 185 | 186 | ceph-3 | FAILED | rc=100 >> 187 | E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) 188 | E: Unable to lock directory /var/lib/apt/lists/ 189 | E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied) 190 | E: Unable to lock the administration directory (/var/lib/dpkg/), are you root? 191 | ``` 192 | 执行失败了,显然是由于没有root权限,需要使用sudo执行命令,需要`--sudo``选项: 193 | 194 | ```bash 195 | ansible all --sudo -m shell -a 'apt-get update -y' 196 | ``` 197 | 如果没有密钥,需要输入sudo密码,需要指定`-K`选项(大写的K)。 198 | 199 | ## 4.总结 200 | ansible的功能非常强大,以上只介绍了如何在命令行远程执行命令,ansible还有更强大的playbook功能,playbook通过yaml文件定义,类似puppet的模板文件,具体可以参考官方文档。 201 | -------------------------------------------------------------------------------- /linux/使用moderncv创建个人简历.md: -------------------------------------------------------------------------------- 1 | # 使用moderncv创建个人简历 2 | ## 0. 编译环境 3 | * 操作系统ubuntu14.04 64 位 4 | * pdfTeX 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) 5 | * kpathsea version 6.1.1 6 | 7 | 8 | ## 1. 安装latex 以及必要包 9 | ```bash 10 | sudo apt-get install texlive-latex-base 11 | sudo apt-get install texlive-latex-extra 12 | sudo apt-get install latex-cjk-chinese # 支持中文 13 | sudo apt-get install texlive-fonts-recommended texlive-font-extra #安装字体 14 | ``` 15 | ## 2. 下载moderncv 16 | 17 | 进入官网[modernc](http://www.ctan.org/tex-archive/macros/latex/contrib/moderncv/)下载,解压缩 18 | 19 | ## 3. 创建个人简历 20 | 21 | ```bash 22 | cd moderncv && mkdir me 23 | cp examples/template-zh.tex me/me.tex 24 | cd me && cp ../*.sty . 25 | 26 | #编译 27 | pdflatex me.tex 28 | ``` 29 | 30 | ## 4. 从模版中修改,创建个人简历 31 | 32 | 修改me.tex,编译成pdf就OK了 33 | -------------------------------------------------------------------------------- /linux/使用并行ssh提高工作效率.md: -------------------------------------------------------------------------------- 1 | 我们经常需要`ssh`到多个主机上执行相同的命令,为了提高效率,我们通常会自己写个脚本,循环遍历执行我们的命令,比如: 2 | 3 | ```bash 4 | for host in `cat hosts.txt`;do 5 | ssh username@$host cmd 6 | done 7 | ``` 8 | 采用这种方式的问题是: 9 | 10 | * 必须自己写脚本,且正确性没法保证。 11 | * 各个主机执行任务是串行的,必须前一台主机执行完毕后,下一台主机才能执行,难以实现并行执行。 12 | 13 | 我们可以使用`parallel-ssh`工具来实现并行`ssh`远程执行命令,它是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,目标也是简化大量计算机的管理,项目地址:https://code.google.com/p/parallel-ssh/ 14 | `pssh` 包安装5个实用程序:`parallel-ssh`、`parallel-scp`、`parallel-slurp`、`parallel-nuke`和`parallel-rsync`。每个实用程序都并行地操作多个主机。 15 | 16 | * parallel-ssh 在多个主机上并行地运行命令。 17 | * parallel-scp 把文件并行地复制到多个主机上。 18 | * parallel-rsync 通过 rsync 协议把文件高效地并行复制到多个主机上。 19 | * parallel-slurp 把文件并行地从多个远程主机复制到中心主机上。 20 | * parallel-nuke 并行地在多个远程主机上杀死进程。 21 | 22 | 使用它首先需要安装,ubuntu已经集成到软件包中,直接使用`apt-get`安装: 23 | 24 | ```bash 25 | sudo apt-get install pssh 26 | ``` 27 | 28 | 为了简便,设置以下alias: 29 | 30 | ```bash 31 | alias pssh='parallel-ssh' 32 | alias pscp='parallel-scp' 33 | ``` 34 | 35 | 编写需要远程操作的host列表`hosts.txt`: 36 | 37 | ``` 38 | node1 39 | node2 40 | node3 41 | ... 42 | node100 43 | ``` 44 | 45 | 使用时需要指定用户名和输入用户密码(必须所有主机的用户和密码相同)以及远程主机列表,通过`-l username`选项指定用户名,使用`-A`选项指定需要输入密码,使用`-h`指定主机列表,比如在所有的主机执行`uptime`操作: 46 | 47 | ```bash 48 | pssh -P -l foo -A -h hosts.txt uptime 49 | ``` 50 | 51 | 若我们当前主机的登录名为`fgp`,且`fgp`能够免密码登录`hosts.txt`的所有主机,则可以省略用户名和密码。比如,所有的主机执行`uptime`操作,并打印结果: 52 | 53 | ```bash 54 | pssh -P -h hosts.txt uptime 55 | ``` 56 | 57 | 主机太多了,把输出保存到文件中: 58 | 59 | ```bash 60 | pssh -o uptime_result -h hosts.txt uptime 61 | ``` 62 | 63 | 传输本地文件到所有的主机中: 64 | 65 | ```bash 66 | pscp -h hosts.txt local_file.txt ~/target_file.txt 67 | ``` 68 | 69 | 以上是简单使用方法,掌握以上的这些操作足够完成我们大多数工作,提高工作效率。 70 | 71 | LikeBe the first to like this 72 | No labels Edit Labels 73 | User icon: Add a picture of yourself 74 | Write a comment… 75 | -------------------------------------------------------------------------------- /linux/修改sbt和maven镜像源.md: -------------------------------------------------------------------------------- 1 | # 修改sbt和maven镜像源 2 | 3 | sbt运行时经常需要下载大量的jar包,默认连接到maven官网,官方默认的镜像,由于各种原因,访问速度极慢,使用国内源会大大提高速度 4 | 5 | ## 修改sbt镜像源 6 | 7 | 以使用oschina镜像源为例,在`~/.sbt/`下添加一个`repositories`文件,里面内容如下: 8 | ``` 9 | [repositories] 10 | local 11 | osc: http://maven.oschina.net/content/groups/public/ 12 | typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly 13 | sonatype-oss-releases 14 | maven-central 15 | sonatype-oss-snapshots 16 | ``` 17 | 18 | ## maven添加方法 19 | 20 | 修改`/etc/maven/settings.xml`文件,在``中添加以下内容: 21 | ```xml 22 | 23 | CN 24 | OSChina Central 25 | http://maven.oschina.net/content/groups/public/ 26 | central 27 | 28 | ``` 29 | -------------------------------------------------------------------------------- /linux/减少qcow文件大小.md: -------------------------------------------------------------------------------- 1 | # 减少qcow文件大小 2 | 3 | 当做虚拟机备份快照时,镜像的大小一般会大于实际数据大小,you'll need to zero out all free space of the partitions contained within the guest first. 4 | 5 | 参考维基百科:[https://pve.proxmox.com/wiki/Shrin\_Qcow2\_Disk\_Files](https://pve.proxmox.com/wiki/Shrink_Qcow2_Disk_Files) 6 | 7 | 针对linux镜像: 8 | 9 | ## 1. 删除无用文件 10 | 11 | 尽量删除一些无用文件 12 | 13 | ## 2. Zero out磁盘 14 | 15 | ``` 16 | dd if=/dev/zero of=/mytempfile 17 | # that could take a some time 18 | rm -f /mytempfile 19 | ``` 20 | 21 | ## 3.减少磁盘大小 22 | 23 | ### 备份 24 | mv image.qcow2 image.qcow2_backup 25 | 26 | ### #1: Shrink your disk without compression (better performance, larger disk size): 27 | ```sh 28 | qemu-img convert -O qcow2 image.qcow2_backup image.qcow2 29 | ``` 30 | ### #2: Shrink your disk with compression (smaller disk size, takes longer to shrink, performance impact on slower systems): 31 | ```sh 32 | qemu-img convert -O qcow2 -c image.qcow2_backup image.qcow2 33 | ``` 34 | -------------------------------------------------------------------------------- /linux/制作windows-puppet镜像过程.md: -------------------------------------------------------------------------------- 1 | # 制作windows puppet镜像过程 2 | 3 | 由于电信需要远程部署软件,拟使用puppet进行远程服务管理 4 | ## 前提 5 | 1. windows系统已经安装 6 | 2. windows已经安装virtio driver 7 | 3. 远程桌面开启,最好关闭防火墙 8 | 9 | ## 设置MTU 10 | 11 | 在没有安装cloudinit情况下需要手动配置mtu大小为1454,否则无法上网。 12 | 13 | ## 设置hosts文件 14 | 15 | 把一些常用的host放到C:/windows/system32/driver/etc/host,**尤其是master的,务必设置!!** 16 | 17 | ## 设置时间同步 18 | 19 | agent需要和master保持时间同步,因此需要设置windows更新时间服务器为master 20 | 21 | ## 安装win32-dir 22 | 23 | 需要安装win32-dir 版本大于0.43, 安装方法为管理员start command prompt with puppet, run: 24 | ```sh 25 | gem install win32-dir 26 | ``` 27 | 28 | ## 修改puppet facter下的timezone 29 | 30 | timezone默认输出中文,会出现编码错误,设置setcode 为英文字符,最好是世界时区标准格式 31 | 32 | ## 安装clouinit 33 | 下载地址:[官网](http://www.cloudbase.it/cloud-init-for-windows-instances/) 34 | ## 关机 35 | 在这前清空puppet ssl目录,位于C:/programdata,并根据实际情况可以设置puppet.conf 。为了减少磁盘文件大小,最好运行下磁盘 36 | 清理,并删除掉一些无用文件。 37 | 38 | ## 格式转化 39 | 40 | 把格式转化,一方面为了合并base image,另一方面也可以起到重新整理磁盘文件,减少文件大小,run: 41 | 42 | ```sh 43 | qemu-img convert -O qcow2 origin.qcow2 new.qcow2 44 | ``` 45 | 46 | ## 上传镜像 47 | 48 | 把镜像上传到glance下,记得**设置os_type = windows**否则,会出现RTC时间问题 49 | 50 | ## 启动主机 51 | 启动云主机,记得设置**os_type = windows**, 原因同上! 52 | -------------------------------------------------------------------------------- /linux/安装nvidia驱动.md: -------------------------------------------------------------------------------- 1 | # How to install the latest Nvidia drivers on ubuntu 2 | 3 | ## Step1 Find out your graphics card model 4 | 5 | 使用lspci命名查看显卡系列 6 | ```bash 7 | lspci -vnn | grep -i VGA 12 8 | ``` 9 | 输出 10 | ``` 11 | 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GT 630 OEM] [10de:0fc2] (rev a1) (prog-if 00 [VGA controller]) 12 | Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:275c] 13 | Flags: bus master, fast devsel, latency 0, IRQ 46 14 | Memory at f6000000 (32-bit, non-prefetchable) [size=16M] 15 | Memory at e0000000 (64-bit, prefetchable) [size=256M] 16 | Memory at f0000000 (64-bit, prefetchable) [size=32M] 17 | I/O ports at e000 [size=128] 18 | Expansion ROM at f7000000 [disabled] [size=512K] 19 | Capabilities: 20 | Kernel driver in use: nouveau 21 | ``` 22 | 可以看到显卡系列是GeForce GT 630 OEM 23 | 24 | ## Step2 Find out the right driver version for your graphics card 25 | 26 | 访问[Nvidia官方网址](http://www.nvidia.com/Download/index.aspx),输入显卡类型,点击search按钮,则会显示需要安装的驱动版本。 27 | ``` 28 | Version: 340.58 29 | Release Date: 2014.11.5 30 | Operating System: Linux 64-bit 31 | Language: English (US) 32 | File Size: 69.00 MB 33 | ``` 34 | 35 | ## Step3 Setup the xorg-edgers ppa 36 | 37 | 运行以下命令更新源: 38 | ```bash 39 | sudo add-apt-repository ppa:xorg-edgers/ppa -y 40 | sudo apt-get update 41 | ``` 42 | 43 | ## Step4 Install the driver 44 | 45 | 运行以下命令安装驱动: 46 | ```bash 47 | sudo apt-get install nvidia-340 48 | ``` 49 | ## Step5 Verify the installation 50 | 51 | 运行以下命令: 52 | ```bash 53 | lspci -vnn | grep -i VGA 12 54 | ``` 55 | 输出 56 | ``` 57 | 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GT 630 OEM] [10de:0fc2] (rev a1) (prog-if 00 [VGA controller]) 58 | Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:275c] 59 | Flags: bus master, fast devsel, latency 0, IRQ 46 60 | Memory at f6000000 (32-bit, non-prefetchable) [size=16M] 61 | Memory at e0000000 (64-bit, prefetchable) [size=256M] 62 | Memory at f0000000 (64-bit, prefetchable) [size=32M] 63 | I/O ports at e000 [size=128] 64 | Expansion ROM at f7000000 [disabled] [size=512K] 65 | Capabilities: 66 | Kernel driver in use: nvidia 67 | ``` 68 | 可见Kernel driver in user显示使用的内核驱动为nvidia 69 | 70 | ## Step6 Nvidia settings tool 71 | 72 | 使用nvidia-settings命令配置驱动。 73 | 74 | # Removing the drivers 75 | 76 | 如果安装驱动导致系统无法启动,需要卸载驱动,运行以下命令: 77 | ```bash 78 | sudo apt-get purge nvidia* 79 | ``` 80 | # Additional Notes 81 | 82 | 很多教程说安装了nvidia驱动后需要把nouveau放入黑名单,其实并不需要,因为nvidia驱动会自动把它放入黑名单。 83 | 运行以下命令: 84 | ```bash 85 | grep 'nouveau' /etc/modprobe.d/* | grep nvidia 86 | ``` 87 | 输出: 88 | ``` 89 | /etc/modprobe.d/nvidia-340_hybrid.conf:blacklist nouveau 90 | /etc/modprobe.d/nvidia-340_hybrid.conf:blacklist lbm-nouveau 91 | /etc/modprobe.d/nvidia-340_hybrid.conf:alias nouveau off 92 | /etc/modprobe.d/nvidia-340_hybrid.conf:alias lbm-nouveau off 93 | /etc/modprobe.d/nvidia-graphics-drivers.conf:blacklist nouveau 94 | /etc/modprobe.d/nvidia-graphics-drivers.conf:blacklist lbm-nouveau 95 | /etc/modprobe.d/nvidia-graphics-drivers.conf:alias nouveau off 96 | /etc/modprobe.d/nvidia-graphics-drivers.conf:alias lbm-nouveau off 97 | ``` 98 | 说明已经把它放到黑名单了,即系统启动时不会自动加载这些模块。 99 | 100 | # References 101 | 102 | 参照[英文博客](www.binarytides.com/install-nvidia-drivers-ubuntu-14-04/) 103 | -------------------------------------------------------------------------------- /linux/设置ssh连接会话复用.md: -------------------------------------------------------------------------------- 1 | # 设置ssh连接会话复用 2 | 3 | 我们经常使用ssh连接远程主机,为了方便,避免每次登录输入密码,通常使用密钥登录。如果没有设置密钥, 4 | 则需要使用密码登录了,若每次都输入密码则十分繁琐。我们可以设置ssh连接会话复用,则登录成功后,会保持一段时间的会话, 5 | 在会话的生命周期内,再次登录同一台主机不需要输入密码。设置方法为: 6 | 7 | ## Step 1 创建会话保存目录 8 | 9 | ```bash 10 | mkdir ~/.ssh/socks 11 | ``` 12 | 13 | ## Step 2 配置ssh 14 | 修改`~/.ssh/config`文件,若该文件不存在,则创建。增加以下内容: 15 | 16 | ``` 17 | Host * 18 | KeepAlive yes 19 | ServerAliveInterval 60 20 | ControlMaster auto 21 | ControlPersist yes 22 | ControlPath ~/.ssh/socks/%h-%p-%r 23 | ``` 24 | 25 | 设置完成后验证是否work: 26 | 27 | ```bash 28 | ssh foo@bar 29 | ``` 30 | 此时需要输入密码,退出重试,若成功则不需要输入密码。 31 | -------------------------------------------------------------------------------- /packages/IK-Analyzer-2012FF_hf1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/IK-Analyzer-2012FF_hf1.zip -------------------------------------------------------------------------------- /packages/linuxwangwang/PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: 謝致邦 2 | 3 | pkgname=aliwangwang 4 | pkgver=1.03.00 5 | pkgrel=7 6 | pkgdesc="AliWangWang for Linux" 7 | arch=('i686' 'x86_64') 8 | url="http://www.taobao.com/wangwang" 9 | license=('Commercial') 10 | depends=('qt4' 'qtwebkit' 'openssl' 'zlib' 'kdelibs' 'qjson' 'libnotify' 'libx11') 11 | if [ "$CARCH" = "i686" ]; then 12 | source=("aliwangwang_1.03.00-7_i386.deb") 13 | md5sums=('8da2c5d2cfa9e37a0d681a93f9bab53b') 14 | elif [ "$CARCH" = "x86_64" ]; then 15 | source=("aliwangwang_1.03.00-7_amd64.deb") 16 | md5sums=('79ce6a16141e3a73cd7925792bf86f5e') 17 | fi 18 | 19 | package() { 20 | cd $pkgdir 21 | tar xf $srcdir/data.tar.gz 22 | } 23 | -------------------------------------------------------------------------------- /packages/linuxwangwang/aliwangwang-1.03.00-7-x86_64.pkg.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/linuxwangwang/aliwangwang-1.03.00-7-x86_64.pkg.tar.xz -------------------------------------------------------------------------------- /packages/linuxwangwang/aliwangwang-1.03.00-7.x86_64.rpm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/linuxwangwang/aliwangwang-1.03.00-7.x86_64.rpm -------------------------------------------------------------------------------- /packages/linuxwangwang/aliwangwang_1.02.00-3_i386.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/linuxwangwang/aliwangwang_1.02.00-3_i386.deb -------------------------------------------------------------------------------- /packages/linuxwangwang/aliwangwang_1.03.00-6_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/linuxwangwang/aliwangwang_1.03.00-6_amd64.deb -------------------------------------------------------------------------------- /packages/linuxwangwang/aliwangwang_1.03.00-7_amd64.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/linuxwangwang/aliwangwang_1.03.00-7_amd64.deb -------------------------------------------------------------------------------- /packages/pssh-2.3.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/pssh-2.3.1.tar.gz -------------------------------------------------------------------------------- /packages/remarkable_1.61_all.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/int32bit/notes/586a1adb390a87ee6a869f2470cc4b8d94418bf6/packages/remarkable_1.61_all.deb --------------------------------------------------------------------------------