Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to upload a file into OpenStack Swift 2.14.0 on a Raspberry Pi 3 because of "[Errno 13] Permission denied"

Creating and erasing buckets (containers) in my OpenStack Swift version 2.14.0 installation works well. It is a Swift only installation. No further OpenStack services like Keystone have been deployed.

$ swift stat
                        Account: AUTH_test
                     Containers: 2
                        Objects: 0
                          Bytes: 0
Containers in policy "policy-0": 2
   Objects in policy "policy-0": 0
     Bytes in policy "policy-0": 0
                     Connection: keep-alive
...

$ swift post s3perf
$ swift list -A http://10.0.0.253:8080/auth/v1.0 -U test:tester -K testing
bucket
s3perf

These are the (positive) messages regarding bucket creation inside the file storage1.error.

$ tail -f /var/log/swift/storage1.error
...
May  9 13:58:50 raspberrypi container-server: STDERR: (1114) accepted
('127.0.0.1', 38118)
May  9 13:58:50 raspberrypi container-server: STDERR: 127.0.0.1 - - 
[09/May/2017 11:58:50] "POST /d1/122/AUTH_test/s3perf HTTP/1.1" 204 142 
0.021630 (txn: tx982eb25d83624b37bd290-005911aefa)

But any attempt to upload a file causes just an error message [Errno 13] Permission denied.

$ swift upload s3perf s3perf-testfile1.txt 
Object PUT failed: http://10.0.0.253:8080/v1/AUTH_test/s3perf/s3perf-testfile1.txt 
503 Service Unavailable  [first 60 chars of response] <html><h1>Service 
Unavailable</h1><p>The server is currently

$ tail -f /var/log/swift/storage1.error
...
May 18 20:55:44 raspberrypi object-server: STDERR: (927) accepted 
('127.0.0.1', 45684)
May 18 20:55:44 raspberrypi object-server: ERROR __call__ error with PUT 
/d1/40/AUTH_test/s3perf/testfile : #012Traceback (most recent call 
last):#012  File "/home/pi/swift/swift/obj/server.py", line 1105, in 
__call__#012    res = getattr(self, req.method)(req)#012  File 
"/home/pi/swift/swift/common/utils.py", line 1626, in _timing_stats#012    
resp = func(ctrl, *args, **kwargs)#012  File 
"/home/pi/swift/swift/obj/server.py", line 814, in PUT#012    
writer.put(metadata)#012  File "/home/pi/swift/swift/obj/diskfile.py", 
line 2561, in put#012    super(DiskFileWriter, self)._put(metadata, 
True)#012  File "/home/pi/swift/swift/obj/diskfile.py", line 1566, in 
_put#012    tpool_reraise(self._finalize_put, metadata, target_path, 
cleanup)#012  File "/home/pi/swift/swift/common/utils.py", line 3536, in 
tpool_reraise#012    raise resp#012IOError: [Errno 13] Permission denied 
(txn: txfbf08bffde6d4657a72a5-00591dee30)
May 18 20:55:44 raspberrypi object-server: STDERR: 127.0.0.1 - - 
[18/May/2017 18:55:44] "PUT /d1/40/AUTH_test/s3perf/testfile HTTP/1.1" 
500 875 0.015646 (txn: txfbf08bffde6d4657a72a5-00591dee30)

Also the proxy.error file contains an error message ERROR 500 Expect: 100-continue From Object Server.

May 18 20:55:44 raspberrypi proxy-server: ERROR 500 Expect: 100-continue
From Object Server 127.0.0.1:6010/d1 (txn: txfbf08bffde6d4657a72a5-
00591dee30) (client_ip: 10.0.0.220)

I have started Swift as user pi and assigned these folders to this user:

$ sudo chown pi:pi /etc/swift
$ sudo chown -R pi:pi /mnt/sdb1/*
$ sudo chown -R pi:pi /var/cache/swift
$ sudo chown -R pi:pi /var/run/swift

sdb1 is a loopback device with XFS file system.

$ mount | grep sdb1
/srv/swift-disk on /mnt/sdb1 type xfs (rw,noatime,nodiratime,attr2,nobarrier,inode64,logbufs=8,noquota)

$ ls -ld /mnt/sdb1/1/
drwxr-xr-x 3 pi pi 17 May 12 13:14 /mnt/sdb1/1/

I deployed Swift this way.

I wonder why creating buckets (conrainers) works but the upload of a file fails because of Permission denied.

Update 1:

$ sudo swift-ring-builder /etc/swift/account.builder
/etc/swift/account.builder, build version 2
256 partitions, 1.000000 replicas, 1 regions, 1 zones, 1 devices, 0.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 0 (0:00:00 remaining)
The overload factor is 0.00% (0.000000)
Ring file /etc/swift/account.ring.gz is up-to-date
Devices:   id region zone ip address:port replication ip:port  name weight partitions balance flags meta
            0      1    1  127.0.0.1:6012      127.0.0.1:6012    d1   1.00        256    0.00   

$ sudo swift-ring-builder /etc/swift/container.builder
/etc/swift/container.builder, build version 2
256 partitions, 1.000000 replicas, 1 regions, 1 zones, 1 devices, 0.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 0 (0:00:00 remaining)
The overload factor is 0.00% (0.000000)
Ring file /etc/swift/container.ring.gz is up-to-date
Devices:   id region zone ip address:port replication ip:port  name weight partitions balance flags meta
            0      1    1  127.0.0.1:6011      127.0.0.1:6011    d1   1.00        256    0.00    

$ sudo swift-ring-builder /etc/swift/object.builder
/etc/swift/object.builder, build version 2
256 partitions, 1.000000 replicas, 1 regions, 1 zones, 1 devices, 0.00 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 0 (0:00:00 remaining)
The overload factor is 0.00% (0.000000)
Ring file /etc/swift/object.ring.gz is up-to-date
Devices:   id region zone ip address:port replication ip:port  name weight partitions balance flags meta
            0      1    1  127.0.0.1:6010      127.0.0.1:6010    d1   1.00        256    0.00     

Update 2

The required ports are open.

$ nmap localhost -p 6010,6011,6012,8080,22
...
PORT     STATE SERVICE
22/tcp   open  ssh
6010/tcp open  x11
6011/tcp open  unknown
6012/tcp open  unknown
8080/tcp open  http-proxy

Update 3

I can write as user pi inside the folder where Swift should store the objects.

$ whoami
pi
$ touch /srv/1/node/d1/objects/test
$ ls -l /srv/1/node/d1/objects/test
-rw-r--r-- 1 pi pi 0 May 13 22:59 /srv/1/node/d1/objects/test

Update 4

All swift processes belong to user pi.

$ ps aux | grep swift
pi         944  3.2  2.0  24644 20100 ?        Ss   May12  65:14 /usr/bin/python /usr/local/bin/swift-proxy-server /etc/swift/proxy-server.conf
pi         945  3.1  2.0  25372 20228 ?        Ss   May12  64:30 /usr/bin/python /usr/local/bin/swift-container-server /etc/swift/container-server.conf
pi         946  3.1  1.9  24512 19416 ?        Ss   May12  64:03 /usr/bin/python /usr/local/bin/swift-account-server /etc/swift/account-server.conf
pi         947  3.1  1.9  23688 19320 ?        Ss   May12  64:04 /usr/bin/python /usr/local/bin/swift-object-server /etc/swift/object-server.conf
pi        1000  0.0  1.7 195656 17844 ?        Sl   May12   0:01 /usr/bin/python /usr/local/bin/swift-object-server /etc/swift/object-server.conf
pi        1001  0.0  1.8 195656 18056 ?        Sl   May12   0:01 /usr/bin/python /usr/local/bin/swift-object-server /etc/swift/object-server.conf
pi        1002  0.0  1.6  23880 16772 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-object-server /etc/swift/object-server.conf
pi        1003  0.0  1.7 195656 17848 ?        Sl   May12   0:01 /usr/bin/python /usr/local/bin/swift-object-server /etc/swift/object-server.conf
pi        1004  0.0  1.7  24924 17504 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-account-server /etc/swift/account-server.conf
pi        1005  0.0  1.6  24924 16912 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-account-server /etc/swift/account-server.conf
pi        1006  0.0  1.8  24924 18368 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-account-server /etc/swift/account-server.conf
pi        1007  0.0  1.8  24924 18208 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-account-server /etc/swift/account-server.conf
pi        1008  0.0  1.8  25864 18824 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-container-server /etc/swift/container-server.conf
pi        1009  0.0  1.8  25864 18652 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-container-server /etc/swift/container-server.conf
pi        1010  0.0  1.7  25864 17340 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-container-server /etc/swift/container-server.conf
pi        1011  0.0  1.8  25864 18772 ?        S    May12   0:01 /usr/bin/python /usr/local/bin/swift-container-server /etc/swift/container-server.conf
pi        1012  0.0  1.8  24644 18276 ?        S    May12   0:03 /usr/bin/python /usr/local/bin/swift-proxy-server /etc/swift/proxy-server.conf
pi        1013  0.0  1.8  24900 18588 ?        S    May12   0:03 /usr/bin/python /usr/local/bin/swift-proxy-server /etc/swift/proxy-server.conf
pi        1014  0.0  1.8  24900 18588 ?        S    May12   0:03 /usr/bin/python /usr/local/bin/swift-proxy-server /etc/swift/proxy-server.conf
pi        1015  0.0  1.8  24900 18568 ?        S    May12   0:03 /usr/bin/python /usr/local/bin/swift-proxy-server /etc/swift/proxy-server.conf

Update 5

When I create a bucket, the Swift service creates a folder like this one:

/mnt/sdb1/1/node/d1/containers/122/9d5/7a23d9409f11da3062432c6faa75f9d5/

and this folder contains a db-file like 7a23d9409f11da3062432c6faa75f9d5.db. I think this is the correct behavior.

But when I try to upload a file inside a bucket, Swift creates just an empty folder like this one.

/mnt/sdb1/1/node/d1/objects/139/eca/8b17958f984943fc97b6b937061d2eca

I can create files inside these empty folders via touch or echo as user pi but for an unknown reason, Swift does not store files inside these folders.

Update 6

In order to investigate this issue further, I installed Swift according to the SAIO - Swift All In One instructions one time inside a VMware ESXi virtual machine with Ubuntu 14.04 LTS and another time inside Raspbian on a Raspberry Pi 3. The result is, that inside the Ubuntu 14.04 VM, Swift works perfectly, but when running ontop of the Rasberry Pi, uploading files does not work.

Object PUT failed: http://10.0.0.253:8080/v1/AUTH_test/s3perf-testbucket/testfiles/s3perf-testfile1.txt 
503 Service Unavailable  [first 60 chars of response] 
<html><h1>Service Unavailable</h1><p>The server is currently

The storage1.error log file still says:

May 24 13:15:15 raspberrypi object-server: ERROR __call__ error with PUT 
/sdb1/484/AUTH_test/s3perf-testbucket/testfiles/s3perf-testfile1.txt :
#012Traceback (most recent call last):#012  File 
"/home/pi/swift/swift/obj/server.py", line 1105, in __call__#012    res = 
getattr(self, req.method)(req)#012  File 
"/home/pi/swift/swift/common/utils.py", line 1626, in _timing_stats#012    
resp = func(ctrl, *args, **kwargs)#012  File 
"/home/pi/swift/swift/obj/server.py", line 814, in PUT#012    
writer.put(metadata)#012  File "/home/pi/swift/swift/obj/diskfile.py", 
line 2561, in put#012    super(DiskFileWriter, self)._put(metadata, 
True)#012  File "/home/pi/swift/swift/obj/diskfile.py", line 1566, in
 _put#012    tpool_reraise(self._finalize_put, metadata, target_path, 
cleanup)#012  File "/home/pi/swift/swift/common/utils.py", line 3536, in 
tpool_reraise#012    raise resp#012IOError: [Errno 13] Permission denied  
(txn: txdfe3c7f704be4af8817b3-0059256b43)

Update 7

The issue is still not fixed, but I have now a working Swift service on the Raspberry Pi. I installed the (quite outdated) Swift revision 2.2.0, which is shipped with Raspbian and it works well. The steps I did are explained here.

like image 296
Neverland Avatar asked Nov 07 '22 22:11

Neverland


1 Answers

Based on the information that you provided, the errors occur during writing Metadata.

The operations for writing Metadata falls into two categories: manipulating inode and manipulating extended attributes. So there are two possible sources for your errors.

First, it is an inode related error. This error may occur due to setting the inode64 parameter while mounting the device. According to the XFS man page:

If applications are in use which do not handle inode numbers bigger than 32 bits, the inode32 option should be specified.

Second, it is an extended attributes related error. You can use the xattr package of python to write extended attributes, and check whether exception happens.

like image 72
laven_qa Avatar answered Nov 15 '22 08:11

laven_qa