在Ubuntu 12.04上配置iSCSI Target服务

By , March 25, 2013 2:29 pm

今天自己按照网上搜来的教程自己在Ubuntu 12.04上配置了iSCSI Target服务,在这里简单地做个纪录。操作系统是全新安装的Ubuntu 12.04,配置一块500 GB的SATA笔记本硬盘。安装操作系统时将硬盘划分为两个分区,其中一个50 GB的分区(/dev/sda1)挂载为操作系统的根分区;另外一个450 GB的分区(/dev/sda2)作为提供存储服务的空间,暂时不挂载。

安装完操作系统之后,安装必要的软件:

$ sudo apt-get install chkconfig lvm2 iscsitarget iscsitarget-dkms

创建物理卷/dev/sda2:

$ sudo pvcreate /dev/sda2

在物理卷/dev/sda2上创建一个volume group:

$ sudo vgcreate -s 32M vg_target00 /dev/sda2

看一下刚才创建的volume group:

$ sudo vgdisplay

--- Volume group ---
VG Name vg_target00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 419.19 GiB
PE Size 32.00 MiB
Total PE 13414
Alloc PE / Size 0 / 0
Free PE / Size 13414 / 419.19 GiB
VG UUID vZplQx-DRjE-Kd4k-tr4e-RV6m-nIr2-k7SEvt

在如上volume group中创建一个逻辑卷lv_target00:

$ sudo lvcreate -L 50G -n lv_target00 vg_target00

看一下刚才创建的逻辑卷:

$ sudo lvdisplay

--- Logical volume ---
LV Name /dev/vg_target00/lv_target00
VG Name vg_target00
LV UUID gD9RO2-xAqr-3u5c-mM1H-O3l8-E3ra-XRT9QT
LV Write Access read/write
LV Status available
# open 0
LV Size 50.00 GiB
Current LE 1600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0

修改文件/etc/default/iscsitarget,启用iSCSI Target服务:

ISCSITARGET_ENABLE=true

修改文件/etc/iet/ietd.conf,配置iSCSI Target服务的参数(这里假定使用iSCSI Target服务的机器IP为192.168.100.104):

Target iqn.2013-03.world.server:target0
Lun 0 Path=/dev/mapper/vg_target00-lv_target00,Type=blockio
initiator-address 192.168.100.104
incominguser test_user test_pass

重启一下iscsitarget服务:

$ sudo service iscsitarget restart

将iscsitarget服务设置为开机后自动启动:

$ sudo chkconfig iscsitarget on

看一下刚刚启动的iscsitarget服务:

$ sudo ietadm --op show --tid=1

Wthreads=8
Type=0
QueuedCommands=32
NOPInterval=0
NOPTimeout=0

到这里为止,iSCSI Target服务就已经配置完毕了。接下来我们在需要挂载iSCSI Target的机器(也称为iSCSI Initiator)上做一些配置:

$ sudo apt-get install open-iscsi

修改配置文件/etc/iscsi/iscsid.conf:

# line 39: uncomment
node.session.auth.authmethod = CHAP

# line 43,44: uncomment and set username and password which set on iSCSI Target
node.session.auth.username = test_user
node.session.auth.password = test_pass

使用下面这个命令发现iSCSI Target服务(这里假定提供iSCSI Target服务的机器IP为192.168.100.5):

$ sudo iscsiadm -m discovery -t sendtargets -p 192.168.100.5 
192.168.100.5:3260,1 iqn.2013-03.world.server:target0

使用下面这个命令确认iSCSI Target服务的具体信息:

$ sudo iscsiadm -m node -o show

使用下面这个命令登陆到iSCSI Target服务:

$ sudo iscsiadm -m node --login

使用下面这个命令确认登录session的情况:

$ sudo iscsiadm -m session -o show

这个时候你应该能够通过/proc/partitions看到多出来一个分区(sdb):

$ more /proc/partitions

major minor  #blocks  name

  11        0    1048575 sr0
   8        0    8388608 sda
   8        1     248832 sda1
   8        2          1 sda2
   8        5    8136704 sda5
 252        0    7581696 dm-0
 252        1     520192 dm-1
   8       16   52428800 sdb

也可以使用fdisk命令查看分区情况,应该可以看到/dev/sdb的相关信息:

$ sudo fdisk -l

Disk /dev/sdb: 53.7 GB, 53687091200 bytes
64 heads, 32 sectors/track, 51200 cylinders, total 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

这个时候就可以正常地格式化、挂载、和使用/dev/sdb了。

如果不打算继续使用这个分区了,可以从iSCSI Target退出服务:

$ sudo iscsiadm -m node --logout

使用PHP-AWS操作Eucalyptyus私有云(1)

By , March 12, 2013 7:22 pm

PHP-AWS是一个用来操作各种AWS服务的类库,目前支持EC2、S3、SQS和AWIS四种服务,也可以用来操作各种与AWS相兼容的其他云服务。这篇博客文章以EC2服务为例,演示如何使用PHP-AWS对基于Eucalyptus的私有云进行操作。

首先从github上下载PHP-AWS类库:

git clone https://github.com/tylerhall/php-aws/

进入php-aws目录,修改class.ec2.php文件,主要是设定身份认证信息和EC2端点。在这里我使用的是桉树社区云(Eucalyptus Community Cloud,ECC)服务的帐号进行测试。

var $_key = “EC2_ACCESS_KEY”;
var $_secret = “EC2_SECRET_KEY”;
var $_server = “http://eucalyptus.ecc.eucalyptus.com:8773/services/Eucalyptus”;

下面这段程序,列出所有可用的映像:

require_once(“class.ec2.php”);
$ec2 = new EC2();
$images = $ec2->getImages();
foreach ($images as $image_id=>$image)
{
$image_location = $image["location"];
print_r($image_id . ” ” . $image_location . “\n”);
}

下面这段程序,启动一个虚拟机实例(需要将emi-XXXXXXXX替换成实际的EMI名称):

$ec2->runInstances(“emi-575A398B”, 1, 1, “key_name”);

下面这段程序,列出所有虚拟机实例:

$instances = $ec2->getInstances();
foreach ($instances as $instance_id=>$instance)
{
$image_id = $instance["imageId"];
$state = $instance["state"];
$dns = $instance["dns"];
print_r($instance_id . ” ” . $image_id . ” ” . $state . ” ” . $dns . “\n”);
}

下面这段程序,销毁一个虚拟机实例(需要将i-XXXXXXXX替换成实际的实例名称):
 
$ec2->terminateInstances(“i-0DF73F93″);

通过AWS SDK for Java操作Eucalyptus私有云(2)

By , March 8, 2013 2:20 pm

在我的前一篇博客文章《通过AWS SDK for Java操作Eucalyptus私有云(1)》中,我们通过一段简单的Java代码演示了可以使用AWS SDK for Java来对基于Eucalyptus的私有云进行操作。在这篇博客文章中,我们进一步介绍AWS SDK for Java中一些常用的API,并以Eucalyptus社区云服务(Eucalyptus Community Cloud)为测试环境对这些代码进行测试。

// 首先导入必要的类库
import java.util.*;
import com.amazonaws.*;
import com.amazonaws.auth.*;
import com.amazonaws.services.ec2.*;
import com.amazonaws.services.ec2.model.*;

// 定义一个类
public class AwsConsoleApp
{

// 必要的登录信息
// 如果要用来测试AWS公有云服务,需要使用AWS的帐号信息
// 如果要用来测试Eucalyptus私有云服务,可以从eucarc文件中找到这些帐号信息
static String EC2_ACCESS_KEY=”THIS_IS_AN_EC2_ACCESS_KEY”;
static String EC2_SECRET_KEY=”THIS_IS_AN_EC2_SECRET_KEY”;
// 这个信息也可以从eucarc文件中找到,
static String EC2_END_POINT =”http://eucalyptus.ecc.eucalyptus.com:8773/services/Eucalyptus”;
static AmazonEC2 ec2;

// 创建一个AWSCredentials类的实例,包含登录信息
// 设定访问AWS(Eucalyptus)云的端点
private static void init() throws Exception
{
AWSCredentials myCredential = new BasicAWSCredentials(EC2_ACCESS_KEY, EC2_SECRET_KEY);
ec2 = new AmazonEC2Client(myCredential);
ec2.setEndpoint(EC2_END_POINT);
}

// 测试方法
public static void main(String[] args) throws Exception
{
// 初始化登录信息和访问端点
init();

// 获得所有的可用域列表
try
{
DescribeAvailabilityZonesResult availabilityZonesResult = ec2.describeAvailabilityZones();
List zones = availabilityZonesResult.getAvailabilityZones();
System.out.println(“You have access to ” + zones.size() + ” availability zones.”);
for(AvailabilityZone zone : zones)
{
System.out.println(” ” + zone.getZoneName());
}
} catch (AmazonServiceException ase)
{
System.out.println(“Caught Exception: ” + ase.getMessage());
}

// 获得所有的映像列表
try
{
DescribeImagesResult imagesResult = ec2.describeImages();
List images = imagesResult.getImages();
System.out.println(“You have access to ” + images.size() + ” images.”);
for(Image image : images)
{
System.out.println(” ” + image.getImageId() + ” ” + image.getImageType() + ” ” + image.getName());
}
} catch (AmazonServiceException ase)
{
System.out.println(“Caught Exception: ” + ase.getMessage());
}

// 创建两个虚拟机实例
try
{
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
.withInstanceType(“m1.small”)
.withImageId(“emi-575A398B”)
.withMinCount(1)
.withMaxCount(2)
.withKeyName(“name_of_your_key”)
;
RunInstancesResult runInstances = ec2.runInstances(runInstancesRequest);
} catch (AmazonServiceException ase)
{
System.out.println(“Caught Exception: ” + ase.getMessage());
}

// 获得所有的虚拟机列表
try
{
DescribeInstancesResult describeInstancesResult = ec2.describeInstances();
List reservations = describeInstancesResult.getReservations();
System.out.println(“You have ” + reservations.size() + ” reservations.”);
for (Reservation reservation : reservations)
{
System.out.println(” ” + reservation.getReservationId());
List instances = reservation.getInstances();
for (Instance instance : instances)
{
System.out.println(” ” + instance.getInstanceId() + ” ” + instance.getInstanceType() + ” ” + instance.getPrivateIpAddress() + ” ” + instance.getPublicIpAddress() + ” key: ” + instance.getKeyName() + ” ” + instance.getState().getName());
}
}
} catch (AmazonServiceException ase)
{
System.out.println(“Caught Exception: ” + ase.getMessage());
}

// 杀死一个虚拟机实例
try
{
List instancesToTerminate = new ArrayList();
instancesToTerminate.add(“ID_of_the_Instance”);
TerminateInstancesRequest term = new TerminateInstancesRequest();
term.setInstanceIds(instancesToTerminate);
ec2.terminateInstances(term);
} catch (AmazonServiceException ase)
{
System.out.println(“Caught Exception: ” + ase.getMessage());
}

}
}

通过AWS SDK for Java操作Eucalyptus私有云(1)

By , March 7, 2013 10:28 pm

Eucalyptus是一个开放源代码的、与AWS高度兼容的云管理平台。以AWS为参考原型的各种云管理平台(例如OpenStack)都在某种程度上兼容AWS API,但是只有Eucalyptus将忠诚地兼容AWS API上升到企业战略与核心竞争力的层面。忠诚地兼容AWS API意味着客户能够在私有云环境中继续使用各种现有的与AWS API相兼容的工具、脚本和映像(AMI),能够在基于Eucalyptus的私有云和AWS公有云之间迁移负载和数据,或者是将基于Eucalyptus的私有云作为开发测试环境但是将AWS公有云作为生产环境。

但是,理想与现实之间总是存在差距的。Eucalyptus以AWS为原型不断地完善自身所提供的功能,而AWS也在不断地对现有的服务进行改进。在目前这个阶段,Eucalyptus还无法100%地实现AWS所提供的各种功能和特性。举个例子来说,一个基于最新版本的AWS SDK for Java的应用,直接用来管理一个基于Eucalyptus的私有云,可能还是会遇到一些意想不到的问题。因此,Eucalyptus公司对AWS SDK for Java打了一些补丁。使用打了Eucalyptus补丁的AWS SDK for Java之后,原有的应用无需进行任何修改即可同时用来管理基于AWS的公有云以及基于Eucalyptus的私有云。这听起来好像很复杂,但是操作起来很简单 - 你只需要下载一个我们打了补丁的JAR文件,用其替代掉原来的JAR文件即可。

如果你从来没有使用过AWS SDK for Java,你需要做一些入门的功呢。具体的教程可以从这里获得。这篇博客文章假定您已经按转配置好AWS SDK for Java,并且能够成功地运行其中的一些演示程序。接下来您需要做的是从下面这个链接下载Eucalyptus公司打过补丁的AWS SDK for Java,并用这个新的JAR文件替换掉原来的JAR文件。

http://jeevanullas.in/tmp/aws-java-sdk-1.3.26.jar

下面这段简单的Java代码,演示了如何通过AWS SDK for Java来对基于Eucalyptus的私有云进行操作。这里我使用了我在Eucalyptus社区云服务(Eucalyptus Community Cloud)中的个人帐号进行测试。

/*
* 导入必要的类库
*/

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;

public class AwsConsoleApp
{

// 必要的登录信息
// 如果要用来测试AWS公有云服务,需要使用AWS的帐号信息
// 如果要用来测试Eucalyptus私有云服务,可以从eucarc文件中找到这些帐号信息
static String EC2_ACCESS_KEY=”THIS_IS_AN_EC2_ACCESS_KEY”;
static String EC2_SECRET_KEY=”THIS_IS_AN_EC2_SECRET_KEY”;
// 这个信息也可以从eucarc文件中找到,
static String EC2_END_POINT =”http://eucalyptus.ecc.eucalyptus.com:8773/services/Eucalyptus”;
static AmazonEC2 ec2;

// 创建一个AWSCredentials类的实例,包含登录信息
// 设定访问AWS(Eucalyptus)云的端点
private static void init() throws Exception
{
AWSCredentials myCredential = new BasicAWSCredentials(EC2_ACCESS_KEY, EC2_SECRET_KEY);
ec2 = new AmazonEC2Client(myCredential);
ec2.setEndpoint(EC2_END_POINT);
}

// 测试方法
public static void main(String[] args) throws Exception
{
// 初始化登录信息和访问端点
init();

try
{
// 获得所有的可用域列表
DescribeAvailabilityZonesResult availabilityZonesResult = ec2.describeAvailabilityZones();
System.out.println(“You have access to ” + availabilityZonesResult.getAvailabilityZones().size() +
” Availability Zones.”);
// 获得所有的虚拟机列表
DescribeInstancesResult describeInstancesRequest = ec2.describeInstances();
List<Reservation> reservations = describeInstancesRequest.getReservations();
Set<Instance> instances = new HashSet<Instance>();

for (Reservation reservation : reservations)
{
instances.addAll(reservation.getInstances());
}

System.out.println(“You have ” + instances.size() + ” Amazon EC2 instance(s) running.”);
} catch (AmazonServiceException ase) {
System.out.println(“Caught Exception: ” + ase.getMessage());
System.out.println(“Reponse Status Code: ” + ase.getStatusCode());
System.out.println(“Error Code: ” + ase.getErrorCode());
System.out.println(“Request ID: ” + ase.getRequestId());
}

}
}

在Eucalyptus 3.3中,将会进一步增强Eucalyptus与AWS之间的兼容性。在AWS SDK for Java这方面,您可以通过如下两个链接了解我们正在做的工作。

https://github.com/eucalyptus/architecture/wiki/aws_java_sdk-3.3-design
https://github.com/eucalyptus/architecture/wiki/aws_java_sdk-3.3-spec

在OS X下利用UNetbootin制作Eucalyptus FastStart可启动安装U盘

By , March 3, 2013 10:14 pm

最近需要在一台没有光驱的上网本上通过FastStart装一个Eucalyptus 3.2.1。比较简便的办法,看来是将ISO转录到U盘上,然后通过U盘启动上网本并进行安装。

通过Google查找了一下,有一个叫做UNetbooin的工具,可以将ISO转录成可启动U盘。这个工具有Windows、Linux和Mac几个不同的版本,可以通过下面这个链接下载:

http://unetbootin.sourceforge.net/

我在Mac上下载并运行UNetbooin这个工具,选择下载到的ISO文件(faststart-3.2.1.iso),并从设备列表中选择正确的U盘,点击OK按钮将ISO文件转录到U盘上(如下图所示)。大概过了两三分钟时间,就完成了转录。完成转录之后,还需要将ISO文件(faststart-3.2.1.iso)拷贝到U盘的根目录。

屏幕快照 2013-03-03 下午10.06.41

将U盘插到上网本上,设置上网本从U盘启动。呀呀,Missing Operating System!启动不来。

Google了一下关键字,发现需要通过fdisk程序激活U盘的引导分区。将U盘插回到Mac上,进行如下设置(假设你的U盘是/dev/disk2,如果你不知道你的U盘是啥的话,可以通过diskutil list查看):

fdisk -e /dev/rdisk2

f 1

write

exit

将U盘插到上网本上,启动成功,一路安装成功。

 

Panorama Theme by Themocracy