Comment 0 for bug 1552621

Franz Hsieh (franz-hsieh) wrote :

Normally system should be able to switch to login screen after oem-config is finished. However on OEM mode the system stops with black screen after oem-config is finished.


1) Boot into OEM mode (EFI) and install the system
2) Restart system, click "Prepare for shipping to end user" and reboot system.
3) oem-config starts, enter user information
4) Black screen.

I found there has race condition between oem-config-* scripts.

First, please watch the code pieces I found in the oem-config-firstboot

for try in $(seq 1 $TRY); do
 if [ "$FRONTEND" = debconf_ui ]; then
  plymouth quit || true
  /usr/sbin/oem-config-wrapper $DEBUG $AUTOMATIC --only \
   2>>/var/log/oem-config.log \
   || CODE=$?
  /usr/bin/ubiquity-dm vt7 :0 oem \
   /usr/sbin/oem-config-wrapper $DEBUG $AUTOMATIC --only || CODE=$?
 if [ "$CODE" -eq 0 ]; then
  # Remove the temporary OEM configuration user, if possible
  # and desired.
  RET="$(echo GET oem-config/remove | debconf-communicate)"
  if [ "${RET#* }" = true ] && getent passwd oem >/dev/null; then
   pkill -u oem || true
   userdel --force --remove oem || true
  /bin/systemctl set-default || true
  /bin/systemctl --no-block isolate || true
  exit 0

and oem-config-wrapper:
#! /bin/sh
# Run oem-config, plus other things that need to run after it in X.
set -e

LANG=en_US.UTF-8 oem-config "$@"

# 'set -e' will cause us to exit if oem-config fails. Otherwise:

# Don't run again.
rm -f /var/lib/oem-config/run

# Cleanup from anything the early command prepared
RET="$(echo GET oem-config/late_command | debconf-communicate)" || true
if [ "${RET%% *}" = 0 ]; then
 command="${RET#* }"
 log-output sh -c "$command" || true
RET="$(echo GET oem-config/remove | debconf-communicate)"
if [ "${RET#* }" = true ]; then
 #debconf crashes with this set (LP: #641478)
 #mandb postinst doesn't like not knowing the locale
 if [ -r /etc/default/locale ]; then
  . /etc/default/locale
 # We're about to pull the rug out from under our own feet, so this
 # has to run very late.
 case $FRONTEND in
   export DEBIAN_FRONTEND=dialog
   oem-config-remove || true
   oem-config-remove-gtk || true
   export DEBIAN_FRONTEND=kde
   oem-config-remove || true

The /usr/sbin/oem-config-wrapper calls oem-config for bring up UI for user and runs oem-config-remove-gtk to remove all ubiquity packages at the end.

Because of oem-config-remove-gtk removes all ubiquity packages, the oem-config-firstboot can't run remaining commands. Therefore session can't switch to graphical and result in black screen.