본문 바로가기

IT

우분투 리눅스 17.04(알파)의 lightdm-gtk-greeter-2.0.1 패키지 문제

우분투 리눅스 17.04(알파)를 쓰면서 2D/3D 그래픽 관련 라이브러니나 프로그램은 'padoka PPA : Paulo Dias - Launchpad'를 쓰며 커널은 4.10 개발자 소스(현재 4.10-rc4가 최신 버전)를 컴파일해서 쓰고 있습니다.

pc는 올여름이면 만 10면이 되는 고물 - ASUS P5B-E Plus 마더보드(바이오스 0638, PCIe 1.1, SATA 2 규격 ), 인텔 코어 2 듀오 E6420 2.13 GHz CPU, 삼성 800 Mhz DDR2 DRAM 8 GB, 웨스턴 디지털 500 GB SATA 3 하드디스크, ATI HD 5450 비디오 카드 - 등을 써왔는데 지난해 9월에 비디오 카드를 엔비디아 지포스 GTX 1060(이엠텍 6 GB 제품 - 으로 바꾸었습니다.
이때부터 고생문이 열리기 시작했는데 오늘은 이 얘기를 하는 건 유보하고 주요 문제를 다 해결하고 나서 어제 겪은 것만 말씀 드립니다.

그저께 나온 엔비디아 378.09 베타 드라이버 패키지와 nvidia-settings 패키지에 비공식 패치를 적용하여 우분투 deb 패키지로 만들어 설치하는 데 꽤 시간이 걸렸지만 그런 대로 잘 동작하고 있었습니다. 그 뒤 drm, Mesa, xorg-server 등을 컴파일하거나 우분투 패키지를 업데이트하고 있었는데 어제 낮 열 두시 전후 해서 우분투 업데이트 과정에서 문제가 생겼습니다. X 윈도우로 로그인할 수 없었습니다.

낮에는 할 일이 있어서 ms 윈도우즈 - 윈도우즈 10 1607 인사이더 프리뷰 빌드 15014 - 를 사용하다가 오후 네 시 이후부터 리눅스 시스템으로 부팅해서 그 문제를 살펴보기 시작했는데 처음에는 원인이 무엇인지 알 수 없더군요.
'sudo systemctl stauts lightdm', 'sudo journalctl -xe' 명령을 내리면 주로 패스워드 서브시스템 - pam 혹은 libpam - 관련 에러만 간략히 보였는데 이것만으로 구체적인 판단을 할 수는 없었습니다. 해서, 비디오 카드 드라이버 문제가 아니라면 X 윈도우를 띄우는데 관건적인 역할을 하는 lightdm, lightdm-gtk-greeter를 다시 컴파일해보기로 했습니다.

아래는 이 과정에서 알게 된 것인데, 우분투 리눅스는 17.04 개발자 버전에서 lightdm은 최신 패키지로 업데이트했지만 여기에 의존하는 lightdm-gtk-greeter 패키지는 업데이트하지 않고 그대로 유지하는 바람에 gtk-3.0이나 lightdm 1.19.2의 변화를 반영하지 못해 컴파일하면 에러 메시지가 주루룩 쏟아지면서 실패했습니다. 이러기를 몇 차례 하다가 에러 메시지를 확인하면서 헤더 파일의 변화 내용을 반영하여 lightdm-gtk-greeter-2.0.1 소스 패키지의 'src/lightdm-gtk-greeter.c' 파일을 수작업으로 수정하여 컴파일하니 제대로 되어 deb 패키지가 만들어졌습니다.
이걸 설치한 뒤 컨솔로 빠져나와 'sudo systemctl restart lightdm' 해서 X 윈도우를 다시 띄웠는데 여전히 그리터(환영) 화면의 로그인 단계를 넘지 못하더군요.
그 상태에서 몇 시간을 헤매고 있다고 최후의 수단(?)으로 컨솔에서 'sudo apt update; sudo apt upgrade' 명령으로 우분투 패키지 업데이트를 수시로 반복했는데 어느 순간 gnome-shell 패키지를 gdm-3.22.2-3ubuntu1으로 업데이트하는 걸 간파했습니다. 직감적으로 이거다 싶어서 X 윈도우를 다시 띄우고 나서 이윽고 그리터 화면이 나타날 때 비밀번호를 제대로 입력하니 그렇게도 되지 않던 로그인 문제가 한방에 풀려버렸습니다. "아, 이 감격!"이 아니라 차라리 허탈해지더군요.
이 문제는 근본적으로는 어제 정오 무렵 우분투 패키지 업데이트를 할 때 문제가 있는 gnome-shell(3.22.2-3 데비안 패키지)로 업데이트되면서 벌어진 일인데 그게 어제 밤에 또다시 제대로 된 버전으로 업데이트되면서 풀린 것이지만, 이 lightdm-gtk-greeter 패키지 문제도 간과할 수는 없습니다.(우분투 개발자가 아직 이 문제는 모르고 있는지 귀찮아서 그런지 손도 대지 않고 있군요)

gnome-shell-3.22.2-3ubuntu1을 쓰는 게 보다 중요하지만, lightdm-gtk-greeter 패키지를 이렇게 패치해서 쓰지 않으면 그리터 화면에서 비밀번호를 제대로 입력해도 아무런 에러 메시지 없이 한참 버벅거리다 실패합니다. 이렇게 패치한 뒤에는 비밀번호를 잘못 입력하면 즉각 에러 메시지가 나타나고 제대로 입력하면 gnome-shell이 제대로 동작하면서 빠른 시간 안에 X 윈도우가 뜹니다.
어쨌든, 앓던 이 하나 제대로 뽑았습니다. lightdm-gtk-greeter는 아래 링크한 데비안 패키지가 최신 버전이고 제가 만든 패치보다 더 나은 패치가 적용되어 있지만 우분투 패키지와 내용이 좀 다르므로 함부로 설치할 수는 없습니다. 참고 자료로 첨부하는 것입니다.

자작 패치

diff -urN lightdm-gtk-greeter-2.0.1/src/lightdm-gtk-greeter.c /home/build/lightdm-gtk-greeter-2.0.1/src/lightdm-gtk-greeter.c
--- lightdm-gtk-greeter-2.0.1/src/lightdm-gtk-greeter.c 2017-01-21 00:29:44.000000000 +0900
+++ /home/build/lightdm-gtk-greeter-2.0.1/src/lightdm-gtk-greeter.c     2017-01-20 21:39:05.613554967 +0900
@@ -1932,11 +1932,11 @@
     {
         gtk_widget_show (GTK_WIDGET (username_entry));
         gtk_widget_show (GTK_WIDGET (cancel_button));
-        lightdm_greeter_authenticate (greeter, NULL);
+        lightdm_greeter_authenticate (greeter, NULL, NULL);
     }
     else if (g_strcmp0 (username, "*guest") == 0)
     {
-        lightdm_greeter_authenticate_as_guest (greeter);
+        lightdm_greeter_authenticate_as_guest (greeter, NULL);
     }
     else
     {
@@ -1956,7 +1956,7 @@
             set_language (NULL);
         }

-        lightdm_greeter_authenticate (greeter, username);
+        lightdm_greeter_authenticate (greeter, username, NULL);
     }
 }

@@ -1978,7 +1978,7 @@
     if (lightdm_greeter_get_in_authentication (greeter))
     {
         cancelling = TRUE;
-        lightdm_greeter_cancel_authentication (greeter);
+        lightdm_greeter_cancel_authentication (greeter, NULL);
         set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);
     }

@@ -2012,7 +2012,7 @@

     language = get_language ();
     if (language)
-        lightdm_greeter_set_language (greeter, language);
+        lightdm_greeter_set_language (greeter, language, NULL);
     g_free (language);

     session = get_session ();
@@ -2233,7 +2233,7 @@
         start_session ();
     else if (lightdm_greeter_get_in_authentication (greeter))
     {
-        lightdm_greeter_respond (greeter, gtk_entry_get_text (password_entry));
+        lightdm_greeter_respond (greeter, gtk_entry_get_text (password_entry), NULL);
         /* If we have questions pending, then we continue processing
          * those, until we are done. (Otherwise, authentication will
          * not complete.) */
@@ -2326,7 +2326,7 @@
             }
         }
         else
-            lightdm_greeter_authenticate_autologin (greeter);
+            lightdm_greeter_authenticate_autologin (greeter, NULL);
     }
 }


lightdm-gtk-greeter-2.0.2 소스에 적용되어 있는 패치
lightdm-gtk-greeter-2.0.1/src/lightdm-gtk-greeter.c 2017-01-21 00:29:44.000000000 +0900
+++ lightdm-gtk-greeter-2.0.2/src/lightdm-gtk-greeter.c 2017-01-21 00:51:54.000000000 +0900
@@ -677,6 +677,9 @@
 
 /* Clock */
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+
 static gboolean
 clock_timeout_thread (void)
 {
@@ -697,6 +700,8 @@
     return TRUE;
 }
 
+#pragma GCC diagnostic pop
+
 /* Message label */
 
 static gboolean
@@ -1932,11 +1937,19 @@
     {
         gtk_widget_show (GTK_WIDGET (username_entry));
         gtk_widget_show (GTK_WIDGET (cancel_button));
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_authenticate (greeter, NULL, NULL);
+#else
         lightdm_greeter_authenticate (greeter, NULL);
+#endif
     }
     else if (g_strcmp0 (username, "*guest") == 0)
     {
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_authenticate_as_guest (greeter, NULL);
+#else
         lightdm_greeter_authenticate_as_guest (greeter);
+#endif
     }
     else
     {
@@ -1955,8 +1968,11 @@
             set_session (NULL);
             set_language (NULL);
         }
-
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_authenticate (greeter, username, NULL);
+#else
         lightdm_greeter_authenticate (greeter, username);
+#endif
     }
 }
 
@@ -1978,7 +1994,11 @@
     if (lightdm_greeter_get_in_authentication (greeter))
     {
         cancelling = TRUE;
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_cancel_authentication (greeter, NULL);
+#else
         lightdm_greeter_cancel_authentication (greeter);
+#endif
         set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);
     }
 
@@ -2012,7 +2032,11 @@
 
     language = get_language ();
     if (language)
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_set_language (greeter, language, NULL);
+#else
         lightdm_greeter_set_language (greeter, language);
+#endif
     g_free (language);
 
     session = get_session ();
@@ -2233,7 +2257,11 @@
         start_session ();
     else if (lightdm_greeter_get_in_authentication (greeter))
     {
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+        lightdm_greeter_respond (greeter, gtk_entry_get_text (password_entry), NULL);
+#else
         lightdm_greeter_respond (greeter, gtk_entry_get_text (password_entry));
+#endif
         /* If we have questions pending, then we continue processing
          * those, until we are done. (Otherwise, authentication will
          * not complete.) */
@@ -2326,7 +2354,11 @@
             }
         }
         else
+#ifdef HAVE_LIBLIGHTDMGOBJECT_1_19_2
+            lightdm_greeter_authenticate_autologin (greeter, NULL);
+#else
             lightdm_greeter_authenticate_autologin (greeter);
+#endif
     }
 }
 
@@ -2684,7 +2716,7 @@
         return EXIT_FAILURE;
 
     /* Set default cursor */
-    gdk_window_set_cursor (gdk_get_default_root_window (), gdk_cursor_new (GDK_LEFT_PTR));
+    gdk_window_set_cursor (gdk_get_default_root_window (), gdk_cursor_new_for_display (gdk_display_get_default (), GDK_LEFT_PTR));
 
     /* Make the greeter behave a bit more like a screensaver if used as un/lock-screen by blanking the screen */
     if (lightdm_greeter_get_lock_hint (greeter))
'lightdm-gtk-greeter (2.0.2-1)'