2010-07-12 17:03:45 -05:00
=======================
SAIO - Swift All In One
=======================
2010-09-01 21:42:24 -05:00
------------------------------------
Instructions for setting up a dev VM
------------------------------------
2010-07-12 17:03:45 -05:00
This documents setting up a virtual machine for doing Swift development. The
2010-09-30 11:18:37 -05:00
virtual machine will emulate running a four node Swift cluster.
2010-07-12 17:03:45 -05:00
2010-08-20 20:02:58 -06:00
* Get the *Ubuntu 10.04 LTS (Lucid Lynx)* server image:
- Ubuntu Server ISO: http://releases.ubuntu.com/10.04/ubuntu-10.04.1-server-amd64.iso (682 MB)
- Ubuntu Live/Install: http://cdimage.ubuntu.com/releases/10.04/release/ubuntu-10.04-dvd-amd64.iso (4.1 GB)
- Ubuntu Mirrors: https://launchpad.net/ubuntu/+cdmirrors
2010-09-30 11:23:39 -05:00
* Create guest virtual machine from the Ubuntu image (if you are going to use
a separate partition for swift data, be sure to add another device when
creating the VM)
2010-07-12 17:03:45 -05:00
* As root on guest (you'll have to log in as you, then `sudo su -` ):
2010-07-14 14:37:17 -05:00
#. `apt-get install python-software-properties`
#. `add-apt-repository ppa:swift-core/ppa`
2010-07-12 17:03:45 -05:00
#. `apt-get update`
2010-07-16 00:47:58 -05:00
#. `apt-get install curl gcc bzr memcached python-configobj
python-coverage python-dev python-nose python-setuptools python-simplejson
python-xattr sqlite3 xfsprogs python-webob python-eventlet
2010-08-19 21:28:24 -05:00
python-greenlet python-pastedeploy`
2010-07-12 17:03:45 -05:00
#. Install anything else you want, like screen, ssh, vim, etc.
2010-09-30 11:18:37 -05:00
#. If you would like to use another partition for storage:
2010-09-30 10:35:10 -05:00
#. `fdisk /dev/sdb` (set up a single partition)
#. `mkfs.xfs -i size=1024 /dev/sdb1`
#. Edit `/etc/fstab` and add
`/dev/sdb1 /mnt/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0`
#. If you would like to use a loopback device instead of another partition:
2010-09-30 12:41:49 -05:00
#. `dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=1000000`
(modify seek to make a larger or smaller partition)
#. `mkfs.xfs -i size=1024 /srv/swift-disk`
2010-09-30 10:35:10 -05:00
#. Edit `/etc/fstab` and add
2010-09-30 12:41:49 -05:00
`/srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0`
2010-09-30 10:35:10 -05:00
2010-07-12 17:03:45 -05:00
#. `mkdir /mnt/sdb1`
#. `mount /mnt/sdb1`
#. `mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 /mnt/sdb1/test`
#. `chown <your-user-name>:<your-group-name> /mnt/sdb1/*`
2010-07-13 22:24:47 -05:00
#. `mkdir /srv`
2010-07-12 17:03:45 -05:00
#. `for x in {1..4}; do ln -s /mnt/sdb1/$x /srv/$x; done`
#. `mkdir -p /etc/swift/object-server /etc/swift/container-server /etc/swift/account-server /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 /srv/4/node/sdb4 /var/run/swift`
2010-07-14 08:11:57 -07:00
#. `chown -R <your-user-name>:<your-group-name> /etc/swift /srv/[1-4]/ /var/run/swift` -- **Make sure to include the trailing slash after /srv/[1-4]/**
2010-07-12 17:03:45 -05:00
#. Add to `/etc/rc.local` (before the `exit 0` )::
mkdir /var/run/swift
2010-09-30 12:41:49 -05:00
chown <your-user-name>:<your-group-name> /var/run/swift
2010-07-12 17:03:45 -05:00
#. Create /etc/rsyncd.conf::
uid = <Your user name>
gid = <Your group name>
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
2010-09-30 10:47:57 -05:00
address = 127.0.0.1
2010-07-12 17:03:45 -05:00
[account6012]
max connections = 25
path = /srv/1/node/
read only = false
lock file = /var/lock/account6012.lock
[account6022]
max connections = 25
path = /srv/2/node/
read only = false
lock file = /var/lock/account6022.lock
[account6032]
max connections = 25
path = /srv/3/node/
read only = false
lock file = /var/lock/account6032.lock
[account6042]
max connections = 25
path = /srv/4/node/
read only = false
lock file = /var/lock/account6042.lock
[container6011]
max connections = 25
path = /srv/1/node/
read only = false
lock file = /var/lock/container6011.lock
[container6021]
max connections = 25
path = /srv/2/node/
read only = false
lock file = /var/lock/container6021.lock
[container6031]
max connections = 25
path = /srv/3/node/
read only = false
lock file = /var/lock/container6031.lock
[container6041]
max connections = 25
path = /srv/4/node/
read only = false
lock file = /var/lock/container6041.lock
[object6010]
max connections = 25
path = /srv/1/node/
read only = false
lock file = /var/lock/object6010.lock
[object6020]
max connections = 25
path = /srv/2/node/
read only = false
lock file = /var/lock/object6020.lock
[object6030]
max connections = 25
path = /srv/3/node/
read only = false
lock file = /var/lock/object6030.lock
[object6040]
max connections = 25
path = /srv/4/node/
read only = false
lock file = /var/lock/object6040.lock
#. Edit the following line in /etc/default/rsync::
RSYNC_ENABLE=true
#. `service rsync restart`
* As you on guest:
#. `mkdir ~/bin`
2010-07-18 18:19:48 -05:00
#. Create `~/.bazaar/bazaar.conf` ::
2010-07-12 17:03:45 -05:00
[DEFAULT]
email = Your Name <your-email-address>
2010-07-13 22:24:47 -05:00
#. If you are using launchpad to get the code or make changes, run
`bzr launchpad-login <launchpad_id>`
2010-07-15 10:27:19 -05:00
#. Create the swift repo with `bzr init-repo swift`
#. Check out your bzr branch of swift, for example:
2010-07-18 18:19:48 -05:00
`cd ~/swift; bzr branch lp:swift trunk`
#. `cd ~/swift/trunk; sudo python setup.py develop`
2010-07-12 17:03:45 -05:00
#. Edit `~/.bashrc` and add to the end::
export PATH_TO_TEST_XFS=/mnt/sdb1/test
export SWIFT_TEST_CONFIG_FILE=/etc/swift/func_test.conf
export PATH=${PATH}:~/bin
#. `. ~/.bashrc`
#. Create `/etc/swift/auth-server.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = auth-server
[app:auth-server]
use = egg:swift#auth
default_cluster_url = http://127.0.0.1:8080/v1
2010-09-10 13:40:43 -07:00
# Highly recommended to change this.
super_admin_key = devauth
2010-08-20 02:19:50 +00:00
2010-07-12 17:03:45 -05:00
#. Create `/etc/swift/proxy-server.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
bind_port = 8080
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
2010-08-24 14:38:36 +00:00
pipeline = healthcheck cache auth proxy-server
2010-08-20 02:19:50 +00:00
2010-08-24 14:38:36 +00:00
[app:proxy-server]
2010-08-20 02:19:50 +00:00
use = egg:swift#proxy
[filter:auth]
use = egg:swift#auth
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:cache]
2010-08-24 14:40:36 +00:00
use = egg:swift#memcache
2010-08-20 02:19:50 +00:00
2010-10-14 15:58:44 -07:00
#. Create `/etc/swift/swift.conf` ::
[swift-hash]
# random unique string that can never change (DO NOT LOSE)
swift_hash_path_suffix = changeme
2010-07-12 17:03:45 -05:00
#. Create `/etc/swift/account-server/1.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/1/node
mount_check = false
bind_port = 6012
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
2010-07-12 17:03:45 -05:00
[account-replicator]
vm_test_mode = yes
[account-auditor]
[account-reaper]
#. Create `/etc/swift/account-server/2.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/2/node
mount_check = false
bind_port = 6022
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
2010-07-12 17:03:45 -05:00
[account-replicator]
vm_test_mode = yes
[account-auditor]
[account-reaper]
#. Create `/etc/swift/account-server/3.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/3/node
mount_check = false
bind_port = 6032
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
2010-07-12 17:03:45 -05:00
[account-replicator]
vm_test_mode = yes
[account-auditor]
[account-reaper]
#. Create `/etc/swift/account-server/4.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/4/node
mount_check = false
bind_port = 6042
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
2010-07-12 17:03:45 -05:00
[account-replicator]
vm_test_mode = yes
[account-auditor]
[account-reaper]
#. Create `/etc/swift/container-server/1.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/1/node
mount_check = false
bind_port = 6011
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
2010-07-12 17:03:45 -05:00
[container-replicator]
vm_test_mode = yes
[container-updater]
[container-auditor]
#. Create `/etc/swift/container-server/2.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/2/node
mount_check = false
bind_port = 6021
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
2010-07-12 17:03:45 -05:00
[container-replicator]
vm_test_mode = yes
[container-updater]
[container-auditor]
#. Create `/etc/swift/container-server/3.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/3/node
mount_check = false
bind_port = 6031
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
2010-07-12 17:03:45 -05:00
[container-replicator]
vm_test_mode = yes
[container-updater]
[container-auditor]
#. Create `/etc/swift/container-server/4.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/4/node
mount_check = false
bind_port = 6041
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
2010-07-12 17:03:45 -05:00
[container-replicator]
vm_test_mode = yes
[container-updater]
[container-auditor]
#. Create `/etc/swift/object-server/1.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/1/node
mount_check = false
bind_port = 6010
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
2010-07-12 17:03:45 -05:00
[object-replicator]
vm_test_mode = yes
[object-updater]
[object-auditor]
#. Create `/etc/swift/object-server/2.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/2/node
mount_check = false
bind_port = 6020
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
2010-07-12 17:03:45 -05:00
[object-replicator]
vm_test_mode = yes
[object-updater]
[object-auditor]
#. Create `/etc/swift/object-server/3.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/3/node
mount_check = false
bind_port = 6030
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
2010-07-12 17:03:45 -05:00
[object-replicator]
vm_test_mode = yes
[object-updater]
[object-auditor]
#. Create `/etc/swift/object-server/4.conf` ::
2010-08-20 02:19:50 +00:00
[DEFAULT]
2010-07-12 17:03:45 -05:00
devices = /srv/4/node
mount_check = false
bind_port = 6040
user = <your-user-name>
2010-08-20 02:19:50 +00:00
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
2010-07-12 17:03:45 -05:00
[object-replicator]
vm_test_mode = yes
[object-updater]
[object-auditor]
#. Create `~/bin/resetswift` ::
#!/bin/bash
swift-init all stop
sleep 5
sudo umount /mnt/sdb1
sudo mkfs.xfs -f -i size=1024 /dev/sdb1
sudo mount /mnt/sdb1
sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 /mnt/sdb1/test
sudo chown <your-user-name>:<your-group-name> /mnt/sdb1/*
mkdir -p /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 /srv/4/node/sdb4
sudo rm -f /var/log/debug /var/log/messages /var/log/rsyncd.log /var/log/syslog
sudo service rsyslog restart
sudo service memcached restart
2010-09-30 10:35:10 -05:00
.. note ::
If you are using a loopback device, substitute `/dev/sdb1` above with
2010-09-30 12:45:54 -05:00
`/srv/swift-disk`
2010-09-30 10:35:10 -05:00
2010-07-12 17:03:45 -05:00
#. Create `~/bin/remakerings` ::
#!/bin/bash
cd /etc/swift
2010-09-01 21:42:24 -05:00
rm -f *.builder * .ring.gz backups/*.builder backups/* .ring.gz
2010-07-12 17:03:45 -05:00
swift-ring-builder object.builder create 18 3 1
swift-ring-builder object.builder add z1-127.0.0.1:6010/sdb1 1
swift-ring-builder object.builder add z2-127.0.0.1:6020/sdb2 1
swift-ring-builder object.builder add z3-127.0.0.1:6030/sdb3 1
swift-ring-builder object.builder add z4-127.0.0.1:6040/sdb4 1
swift-ring-builder object.builder rebalance
swift-ring-builder container.builder create 18 3 1
swift-ring-builder container.builder add z1-127.0.0.1:6011/sdb1 1
swift-ring-builder container.builder add z2-127.0.0.1:6021/sdb2 1
swift-ring-builder container.builder add z3-127.0.0.1:6031/sdb3 1
swift-ring-builder container.builder add z4-127.0.0.1:6041/sdb4 1
swift-ring-builder container.builder rebalance
swift-ring-builder account.builder create 18 3 1
swift-ring-builder account.builder add z1-127.0.0.1:6012/sdb1 1
swift-ring-builder account.builder add z2-127.0.0.1:6022/sdb2 1
swift-ring-builder account.builder add z3-127.0.0.1:6032/sdb3 1
swift-ring-builder account.builder add z4-127.0.0.1:6042/sdb4 1
swift-ring-builder account.builder rebalance
#. Create `~/bin/startmain` ::
#!/bin/bash
swift-init auth-server start
swift-init proxy-server start
swift-init account-server start
swift-init container-server start
swift-init object-server start
#. Create `~/bin/startrest` ::
#!/bin/bash
2010-09-10 13:40:43 -07:00
# Replace devauth with whatever your super_admin key is (recorded in
# /etc/swift/auth-server.conf).
swift-auth-recreate-accounts -K devauth
2010-07-12 17:03:45 -05:00
swift-init object-updater start
swift-init container-updater start
swift-init object-replicator start
swift-init container-replicator start
swift-init account-replicator start
swift-init object-auditor start
swift-init container-auditor start
swift-init account-auditor start
swift-init account-reaper start
#. `chmod +x ~/bin/*`
#. `remakerings`
2010-07-18 18:19:48 -05:00
#. `cd ~/swift/trunk; ./.unittests`
#. `startmain` (The `` Unable to increase file descriptor limit. Running as non-root? `` warnings are expected and ok.)
2010-09-10 13:40:43 -07:00
#. `swift-auth-add-user -K devauth -a test tester testing` # Replace `` devauth `` with whatever your super_admin key is (recorded in /etc/swift/auth-server.conf).
2010-07-13 22:24:47 -05:00
#. Get an `X-Storage-Url` and `X-Auth-Token` : `` curl -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://127.0.0.1:11000/v1.0 ``
#. Check that you can GET account: `` curl -v -H 'X-Auth-Token: <token-from-x-auth-token-above>' <url-from-x-storage-url-above> ``
2010-07-12 17:03:45 -05:00
#. Check that `st` works: `st -A http://127.0.0.1:11000/v1.0 -U test:tester -K testing stat`
2010-09-10 13:40:43 -07:00
#. `swift-auth-add-user -K devauth -a test2 tester2 testing2` # Replace `` devauth `` with whatever your super_admin key is (recorded in /etc/swift/auth-server.conf).
#. `swift-auth-add-user -K devauth test tester3 testing3` # Replace `` devauth `` with whatever your super_admin key is (recorded in /etc/swift/auth-server.conf).
2010-09-05 19:53:08 -07:00
#. `cp ~/swift/trunk/test/functional/sample.conf /etc/swift/func_test.conf`
2010-09-05 19:21:08 -07:00
#. `cd ~/swift/trunk; ./.functests` (Note: functional tests will first delete
2010-09-05 19:53:08 -07:00
everything in the configured accounts.)
2010-09-05 19:21:08 -07:00
#. `cd ~/swift/trunk; ./.probetests` (Note: probe tests will reset your
environment as they call `resetswift` for each test.)
2010-07-13 22:24:47 -05:00
2010-07-14 08:11:57 -07:00
If you plan to work on documentation (and who doesn't?!):
2010-07-14 08:16:00 -07:00
#. `sudo apt-get install python-sphinx`
2010-07-19 03:00:28 +00:00
#. `python setup.py build_sphinx`
2010-07-14 08:11:57 -07:00
2010-07-13 22:24:47 -05:00
----------------
Debugging Issues
----------------
If all doesn't go as planned, and tests fail, or you can't auth, or something doesn't work, here are some good starting places to look for issues:
#. Everything is logged in /var/log/syslog, so that is a good first place to
look for errors (most likely python tracebacks).
#. Make sure all of the server processes are running. For the base
functionality, the Proxy, Account, Container, Object and Auth servers
should be running
#. If one of the servers are not running, and no errors are logged to syslog,
it may be useful to try to start the server manually, for example:
2010-07-14 08:11:57 -07:00
`swift-object-server /etc/swift/object-server/1.conf` will start the
2010-07-13 22:24:47 -05:00
object server. If there are problems not showing up in syslog,
then you will likely see the traceback on startup.