Hello World


  • 首页

  • 归档

  • 标签

Docker管理工具Shipyard

发表于 2016-03-02 | 分类于 工具

1.Shipyard介绍

Shipyard是一个基于Web的Docker管理工具,基于Docker Swarm,支持多主机,可以把多个Docker主机上的容器统一管理;可以查看镜像,下拉镜像;可以管理私有镜像仓库;并提供 RESTful API 等。

  • Datastore: 首先启动的就是RethinkDB容器,shipyard采用RethinkDB作为数据库来保存账户,引擎,服务键值以及元信息等信息。
  • Discovery: 为了使用Swarm的选举机制,我们需要一个外部的密钥值存储容器,shipyard默认采用了etcd。
  • Proxy: 默认情况下,Docker引擎只监听Socket,我们可以重新配置引擎使用TLS或者使用一个代理容器,转发请求从TCP到Docker监听的UNIX Socket。
  • Swarm Manager: Swarm管理器
  • Swarm Agent: Swarm代理,运行在每个节点上。
  • Controller: Shipyard控制器,Remote API的实现和web的实现。

2.实例

准备两台服务器,关闭防火墙;

  • 主节点 IP:192.168.0.2
  • 从节点 IP:192.168.0.11

1) 安装主节点(192.168.0.2)

安装官方文档依次安装环境

Datastore

1
2
3
4
5
6
$> sudo docker run \
-ti \
-d \
--restart=always \
--name shipyard-rethinkdb \
rethinkdb

Discovery

1
2
3
4
5
6
7
8
$> sudo docker run \
-ti \
-d \
-p 4001:4001 \
-p 7001:7001 \
--restart=always \
--name shipyard-discovery \
microbox/etcd -name discovery

Proxy

1
2
3
4
5
6
7
8
9
10
$> sudo docker run \
-ti \
-d \
-p 2375:2375 \
--hostname=$HOSTNAME \
--restart=always \
--name shipyard-proxy \
-v /var/run/docker.sock:/var/run/docker.sock \
-e PORT=2375 \
shipyard/docker-proxy:latest

Swarm Manager

1
2
3
4
5
6
7
$> sudo docker run \
-ti \
-d \
--restart=always \
--name shipyard-swarm-manager \
swarm:latest \
manage --host tcp://0.0.0.0:3375 etcd://192.168.0.2:4001

Swarm Agent

1
2
3
4
5
6
7
$> sudo docker run \
-ti \
-d \
--restart=always \
--name shipyard-swarm-agent \
swarm:latest \
join --addr 192.168.0.2:2375 etcd://192.168.0.2:4001

Controller

1
2
3
4
5
6
7
8
9
10
11
$> docker run \
-ti \
-d \
--restart=always \
--name shipyard-controller \
--link shipyard-rethinkdb:rethinkdb \
--link shipyard-swarm-manager:swarm \
-p 8080:8080 \
shipyard/shipyard:latest \
server \
-d tcp://swarm:3375

2) 添加从节点(192.168.0.11)

Proxy

1
2
3
4
5
6
7
8
9
10
$> sudo docker run \
-ti \
-d \
-p 2375:2375 \
--hostname=$HOSTNAME \
--restart=always \
--name shipyard-proxy \
-v /var/run/docker.sock:/var/run/docker.sock \
-e PORT=2375 \
shipyard/docker-proxy:latest

Swarm Manager

1
2
3
4
5
6
7
$> sudo docker run \
-ti \
-d \
--restart=always \
--name shipyard-swarm-manager \
swarm:latest \
manage --replication --addr 192.168.0.11:3375<从节点> --host tcp://0.0.0.0:3375 etcd://192.168.0.2:4001<主节点>

Swarm Agent

1
2
3
4
5
6
7
$> sudo docker run \
-ti \
-d \
--restart=always \
--name shipyard-swarm-agent \
swarm:latest \
join --addr 192.168.0.11:2375<从节点> etcd://192.168.0.2:4001<主节点>

3) 访问Web页面

访问http://192.168.0.2:8080,输入默认用户名和密码:admin/shipyard
login
dashboard

参考:
1.https://shipyard-project.com/docs/deploy/manual/
2.https://docs.docker.com/swarm/multi-manager-setup/
3.http://blog.yaodataking.com/2016/01/docker-shipyard.html

ssh-keygen使用

发表于 2016-01-15 | 分类于 技术

假设 A (192.168.0.10)为客户机器,B(192.168.0.11)为目标机;

1、登录A
2、ssh-keygen -t rsa,生成密钥文件和私钥文件 id_rsa, id_rsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录,并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、ssh 192.168.0.11

问题:

1、设置文件和目录权限:
设置.ssh目录权限
$ chmod 700 -R .ssh
设置authorized_keys权限
$ chmod 600 authorized_keys

Python创建单例模式的三种方式

发表于 2016-01-12 | 分类于 技术

1.使用装饰器

装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def singleton(cls):
instances = {}
def warpper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return warpper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

2.使用基类

new是真正创建实例对象的方法,所以重写基类的new方法,以此来保证创建对象的时候只生成一个实例

1
2
3
4
5
6
7
8
9
10
11
12
13
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

3.使用元类

元类(参考:深刻理解Python中的元类)是用于创建类对象的类,类对象创建实例对象时需要一定会调用call方法,因此在调用call时候保证始终只创建一个实例即可,type是python中的一个元类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

修改mysql的datadir目录

发表于 2016-01-06 | 分类于 技术

1.停止mysql

1
sudo /etc/init.d/mysql stop

2.复制/var/lib/mysql目录到指定的路径

1
sudo cp -R -p /var/lib/mysql /data/mysql

3.修改mysql配置文件my.cnf:

1
2
datadir=/data/mysql
socket=/data/mysql/mysql.sock

4.修改apparmor

1
sudo vim /etc/apparmor.d/usr.sbin.mysqld

将/var/lib/mysql路径替换为/data/mysql

1
2
3
4
#/var/lib/mysql/ r,
#/var/lib/mysql/** rwk,
/data/mysql/ r,
/data/mysql/** rwk,

5.重启

1
2
sudo /etc/init.d/apparmor restart
sudo /etc/init.d/mysql restart

from:
1.How to change MySQL data directory?
2.Linux Ubuntu change datadir / database location dir in 5 minutes Move mysql database to other path

网络文件系统 (NFS)

发表于 2015-12-31 | 分类于 技术

1.安装NFS服务器

1
sudo apt-get install nfs-kernel-server

2.配置

配置共享的目录,在/etc/exports文件中添加共享目录:

1
2
/home/nfs/share *(ro,sync,no_root_squash)
/data/web/ 10.0.0.0/24(rw,sync,no_subtree_check)

其中:
/home/nfs/share是服务器要共享的目录
*代表所有ip
rw为读写,ro为只读
sync为立刻写入硬盘,rsync为先写入缓存
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限
subtree 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置)
no_subtree 与subtree相反

3.启动NFS服务器

1
sudo service nfs-kernel-server start

4.NFS客户端

1
sudo apt-get install nfs-common

使用mount命令来挂载其他机器共享的NFS目录:

1
sudo mount example.hostname.com:/ubuntu /local/ubuntu

挂载点 /local/ubuntu 目录必须已经存在。而且在 /local/ubuntu 目录中没有文件或子目录

另一个挂载其他机器的 NFS 共享的方式就是在 /etc/fstab 文件中添加一行。该行必须指明 NFS 服务器的主机名、服务器输出的目录名以及挂载 NFS 共享的本机目录。

1
example.hostname.com:/ubuntu /local/ubuntu nfs rsize=8192,wsize=8192,timeo=14,intr

卸载挂载点

1
umonut /local/ubuntu

from:
1.网络文件系统 (NFS)
2.Linux NFS服务器的安装与配置

十个JavaScript问题

发表于 2015-12-08 | 分类于 技术

From: http://www.cnblogs.com/zichi/p/4359786.html

1.考察this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);

输出:

1
2
10
2

第一次输出10应该没有问题。我们知道取对象属于除了点操作符还可以用中括号,所以第二次执行时相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2。

2.var和函数的提前声明

1
2
3
4
5
6
7
8
function fn(a) {
console.log(a);
var a = 2;
function a() {}
console.log(a);
}
fn(1);

输出:

1
2
function a() {}
2

我们知道var和function是会提前声明的,而且function是优先于var声明的(如果同时存在的话),所以提前声明后输出的a是个function,然后代码往下执行a进行重新赋值了,故第二次输出是2。

3.局部变量和全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var f = true;
if (f === true) {
var a = 10;
}
function fn() {
var b = 20;
c = 30;
}
fn();
console.log(a);
console.log(b);
console.log(c)

输出:

1
2
3
10
报错
30

这是个我犯了很久的错误,很长一段时间我都以为{…}内的新声明的变量是局部变量,后来我才发现function内的新声明的变量才是局部变量,而没有用var声明的变量在哪里都是全局变量。再次提醒切记只有function(){}内新声明的才能是局部变量,while{…}、if{…}、for(..) 之内的都是全局变量(除非本身包含在function内)。

4.变量隐式声明

1
2
3
4
5
if('a' in window) {
var a = 10;
}
alert(a);

答案:10

前面我说过function和var会提前声明,而其实{…}内的变量也会提前声明。于是代码还没执行前,a变量已经被声明,于是 ‘a’ in window 返回true,a被赋值。

5.给基本类型数据添加属性,不报错,但取值时是undefined

1
2
3
4
5
6
7
var a = 10;
a.pro = 10;
console.log(a.pro + a);
var s = 'hello';
s.pro = 'world';
console.log(s.pro + s);

答案:

1
2
NaN
undefinedhello

给基本类型数据加属性不报错,但是引用的话返回undefined,10+undefined返回NaN,而undefined和string相加时转变成了字符串。

6.函数声明优于变量声明

1
2
3
console.log(typeof fn);
function fn() {};
var fn;

答案:function

因为函数声明优于变量声明。我们知道在代码逐行执行前,函数声明和变量声明会提前进行,而函数声明又会优于变量声明,这里的优于可以理解为晚于变量声明后,如果函数名和变量名相同,函数声明就能覆盖变量声明。所以以上代码将函数声明和变量声明调换顺序还是一样结果。

7.判断一个字符串中出现次数最多的字符,并统计次数

hash table方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var s = 'aaabbbcccaaabbbaaa';
var obj = {};
var maxn = -1;
var letter;
for(var i = 0; i < s.length; i++) {
if(obj[s[i]]) {
obj[s[i]]++;
if(obj[s[i]] > maxn) {
maxn = obj[s[i]];
letter = s[i];
}
} else {
obj[s[i]] = 1;
if(obj[s[i]] > maxn) {
maxn = obj[s[i]];
letter = s[i];
}
}
}
alert(letter + ': ' + maxn);

正则方式:

1
2
3
4
5
6
7
8
9
10
var s = 'aaabbbcccaaabbbaaabbbbbbbbbb';
var a = s.split('');
a.sort();
s = a.join('');
var pattern = /(\w)\1*/g;
var ans = s.match(pattern);
ans.sort(function(a, b) {
return a.length < b.length;
});;
console.log(ans[0][0] + ': ' + ans[0].length);

8.经典闭包

1
2
3
4
5
6
7
8
<!-- 实现一段脚本,使得点击对应链接alert出相应的编号 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<a href='#'> 第一个链接 </a> </br>
<a href='#'> 第二个链接 </a> </br>
<a href='#'> 第三个链接 </a> </br>
<a href='#'> 第四个链接 </a> </br>
</body>

dom污染法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 实现一段脚本,使得点击对应链接alert出相应的编号 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<a href='#'> 第一个链接 </a> </br>
<a href='#'> 第二个链接 </a> </br>
<a href='#'> 第三个链接 </a> </br>
<a href='#'> 第四个链接 </a> </br>
<script type="text/javascript">
var lis = document.links;
for(var i = 0, length = lis.length; i < length; i++) {
lis[i].index = i;
lis[i].onclick = function() {
alert(this.index);
};
}
</script>
</body>

闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 实现一段脚本,使得点击对应链接alert出相应的编号 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<a href='#'> 第一个链接 </a> </br>
<a href='#'> 第二个链接 </a> </br>
<a href='#'> 第三个链接 </a> </br>
<a href='#'> 第四个链接 </a> </br>
<script type="text/javascript">
var lis = document.links;
for(var i = 0, length = lis.length; i < length; i++) {
(function(i) {
lis[i].onclick = function() {
alert(i + 1);
};
})(i);
}
</script>
</body>

9.this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function JSClass() {
this.m_Text = 'division element';
this.m_Element = document.createElement('div');
this.m_Element.innerHTML = this.m_Text;
this.m_Element.addEventListener('click', this.func);
// this.m_Element.onclick = this.func;
}
JSClass.prototype.Render = function() {
document.body.appendChild(this.m_Element);
}
JSClass.prototype.func = function() {
alert(this.m_Text);
};
var jc = new JSClass();
jc.Render(); // add div
jc.func(); // 输出 division element
//click添加的div元素division element会输出underfined,为什么?

答案:

1
2
3
division
element
undefined

第一次输出很好理解,第二次的话仔细看,this其实已经指向了this.m_Element,因为是this.m_Element调用的addEventListener函数,所以内部的this全指向它了。可以试着加上一行代码this.m_Element.m_Text = ‘hello world’,就会alert出hello world了。

10.split

请编写一个JavaScript函数 parseQueryString,它的用途是把URL参数解析为一个对象,如: var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function parseQueryString(url) {
var obj = {};
var a = url.split('?');
if(a.length === 1) return obj;
var b = a[1].split('&');
for(var i = 0, length = b.length; i < length; i++) {
var c = b[i].split('=');
obj[c[0]] = c[1];
}
return obj;
}
var url = 'http://witmax.cn/index.php?key0=0&key1=1&key2=2';
var obj = parseQueryString(url);
console.log(obj.key0, obj.key1, obj.key2); // 0 1 2

php判断是否为移动端浏览器

发表于 2015-08-07 | 分类于 技术

方法1: 简答的通过user-agent判断是否为手机访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function isMobile() {
//判断手机发送的客户端标志
if(isset($_SERVER['HTTP_USER_AGENT'])) {
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
$clientkeywords = array(
'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-'
,'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu',
'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini',
'operamobi', 'opera mobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if(preg_match("/(".implode('|',$clientkeywords).")/i",$userAgent)&&strpos($userAgent,'ipad') === false)
{
return true;
}
}
return false;
}
?>

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
function is_mobile()
{
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
{
return true;
}
// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if (isset ($_SERVER['HTTP_VIA']))
{
// 找不到为flase,否则为true
return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
}
// 脑残法,判断手机发送的客户端标志,兼容性有待提高
if (isset ($_SERVER['HTTP_USER_AGENT']))
{
$clientkeywords = array (
'nokia',
'sony',
'ericsson',
'mot',
'samsung',
'htc',
'sgh',
'lg',
'sharp',
'sie-',
'philips',
'panasonic',
'alcatel',
'lenovo',
'iphone',
'ipod',
'blackberry',
'meizu',
'android',
'netfront',
'symbian',
'ucweb',
'windowsce',
'palm',
'operamini',
'operamobi',
'openwave',
'nexusone',
'cldc',
'midp',
'wap',
'mobile',
'mobi',
'kindle',
'opera mini',
'opera',
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])))
{
return true;
}
}
// 协议法,因为有可能不准确,放到最后判断
if (isset ($_SERVER['HTTP_ACCEPT']))
{
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
{
return true;
}
}
return false;
}
?>

方法3:下面是一个从PHP框架剥离的判断是否为手机移动终端的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
function is_mobile_request()
{
$_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTTP'] : '';
$mobile_browser = '0';
if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|ipad|ipod|android|xoom)/i', strtolower($_SERVER['HTTP_USER_AGENT'])))
$mobile_browser++;
if((isset($_SERVER['HTTP_ACCEPT'])) and (strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') !== false))
$mobile_browser++;
if(isset($_SERVER['HTTP_X_WAP_PROFILE']))
$mobile_browser++;
if(isset($_SERVER['HTTP_PROFILE']))
$mobile_browser++;
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-'
);
if(in_array($mobile_ua, $mobile_agents))
$mobile_browser++;
if(strpos(strtolower($_SERVER['ALL_HTTP']), 'operamini') !== false)
$mobile_browser++;
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') !== false)
$mobile_browser=0;
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone') !== false)
$mobile_browser++;
if($mobile_browser>0)
return true;
else
return false;
}
?>

ubuntu14.04 下载源

发表于 2015-07-25 | 分类于 技术

中国科学技术大学源

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.ustc.edu.cn/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ trusty-backports main restricted universe multiverse

阿里云源

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

163源

1
2
3
4
5
6
7
8
9
10
11
12
13
deb http://mirrors.163.com/ubuntu/ trusty main restricted
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

sohu源

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

Linux系统中增加Swap分区大小

发表于 2015-07-25 | 分类于 技术

1.检查当前的分区情况:

1
[root@localhost]#free -m

2.增加交换分区文件及大小,如果要增加2G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小。

1
[root@localhost]# dd if=/dev/zero of=/home/swap bs=1024 count=2048000

3.设置交换文件:

1
[root@localhost]# mkswap /home/swap

4.立即启用交换分区文件

1
[root@localhost]# swapon /home/swap

5.如果要在引导时自动启用,则编辑 /etc/fstab 文件,添加行:

1
/home/swap swap swap defaults 0 0

系统下次引导时,它就会启用新建的交换文件,再查看SWAP分区大小发现增加了2G。

运维人员必须熟悉的运维工具汇总

发表于 2015-06-25 | 分类于 工具

classic

1234
DW

DW

37 日志
5 分类
20 标签
© 2018 DW
由 Hexo 强力驱动
主题 - NexT.Muse