Проблемы с попыткой использовать FUSE в Bluemix

Я искал способ добавить удаленную файловую систему, доступную в Bluemix. В этом сообщении мне сказали использовать стек cflinuxfs2, который поддерживается в последних версиях Cloud Foundry.

Мне удалось выполнить команду mkdir для точки монтирования из моего Java-приложения и выполнить команду sshfs, но эта последняя завершается с ошибкой: «Чтение: сброс соединения узлом».

Дело в том, что те же самые команды, которые используются в Linux дома, работают нормально, поэтому я понимаю команду, ключ ssh и файлы ноу-хостов в порядке.

Это фрагмент кода Java EE, развернутый в среде выполнения Liberty в Bluemix:

String s = null;
Process p = null;
BufferedReader br = null;
try 
{
    p = Runtime.getRuntime().exec("mkdir -p /home/vcap/misc");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command mkdir with exit: " + p.exitValue());
    p.destroy();
    br.close();

    p = Runtime.getRuntime().exec("sshfs [email protected]:/ /home/vcap/misc -o IdentityFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts -o idmap=user -o compression=no -o sshfs_debug");
    br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command sshfs with exit: " + p.exitValue());
    p.destroy();
    br.close();
}
catch(IOException ex)
{
    ex.printStackTrace();
}
catch(InterruptedException ex)
{
    ex.printStackTrace();
}
finally
{
    try 
    {
        if(br != null)
            br.close();
    }
    catch(IOException ex) 
    {
        ex.printStackTrace();
    }
}

Файлы, на которые ссылаются команды, включаются в файл EAR и отправляются как часть приложения. Я могу видеть их и их содержимое, просматривая файловую систему с панели управления Bluemix.

Просматривая Интернет, я нашел множество сообщений с сообщением об ошибке: «читай: сброс соединения узлом», но, похоже, они не применимы к моему случаю или связаны с брандмауэрами и файлами конфигурации, к которым у меня нет доступа в Bluemix. И, как я уже сказал, те же две команды, выполненные в моем Linux-боксе дома, работают нормально.

Любая идея или рекомендация, чтобы заставить его работать? Кто-нибудь уже тестировал эту идею в Bluemix?

Спасибо!


person Jose Miguel Ordax    schedule 26.05.2015    source источник
comment
С printStackTrace() ничего не распечатывалось?   -  person Jeff Sloyer    schedule 27.05.2015
comment
Нет, потому что нет ошибки Java. Команда выполняется правильно с точки зрения Java и возвращает код выхода 1. Вот и все.   -  person Jose Miguel Ordax    schedule 27.05.2015
comment
Я только что обнаружил, что p.getErrorStream() также получает ошибки консоли, а не только обычный вывод консоли. Проблема выглядит следующим образом: fusermount: опция allow_other разрешена только в том случае, если в /etc/fuse.conf установлено «user_allow_other», поэтому у меня есть новая область исследования. Я отпишусь с выводами.   -  person Jose Miguel Ordax    schedule 27.05.2015
comment
Обновил вопрос с последними выводами...   -  person Jose Miguel Ordax    schedule 27.05.2015


Ответы (1)


Хорошо, наконец, я нашел причину проблемы с помощью коллег по команде. Проблема была с разрешениями закрытого ключа ssh. Должно быть 600, а по умолчанию после cf push было 644.

Итак, вот окончательный код (быстрый и грязный), который сработал, на всякий случай, если он может быть полезен другим...

  1. Включите в приложение закрытый ключ и файлы known_hosts.

  2. Нажмите на приложение, добавив параметр -s cflinuxfs2.

  3. Выполните при запуске во время выполнения некоторый код, подобный этому:

    String s = null;
    Process p = null;
    BufferedReader br = null;
    try 
    {
        p = Runtime.getRuntime().exec("mkdir -p /home/vcap/misc");
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("#### Executing command mkdir with exit: " + p.exitValue());
        p.destroy();
        br.close();
    
        p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key");
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("#### Executing command chmod with exit: " + p.exitValue());
        p.destroy();
        br.close();
    
        p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts");
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("#### Executing command chmod with exit: " + p.exitValue());
        p.destroy();
        br.close();
    
        p = Runtime.getRuntime().exec("sshfs [email protected]:/home/ibmcloud /home/vcap/misc -o IdentityFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts -o idmap=user -o compression=no -o sshfs_debug");
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("#### Executing command sshfs with exit: " + p.exitValue());
        p.destroy();
        br.close();
    
        p = Runtime.getRuntime().exec("ls -l /home/vcap/misc");
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("#### Executing command ls with exit: " + p.exitValue());
        p.destroy();
        br.close();
    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }
    catch(InterruptedException ex)
    {
        ex.printStackTrace();
    }
    finally
    {
        try 
        {
            if(br != null)
                br.close();
        }
        catch(IOException ex) 
        {
            ex.printStackTrace();
        }
    }
    

    Этот фрагмент должен создать папку, смонтировать удаленную файловую систему в эту папку и вывести содержимое удаленной файловой системы.

person Jose Miguel Ordax    schedule 27.05.2015