헤드리스 Ubuntu 서버 시스템이 때때로 GRUB 메뉴에 멈춤


54

세미 임베디드 환경의 단일 보드 컴퓨터에 Ubuntu 10.10 Server가 설치되어 있습니다. 키보드 나 화면이없고 SSH 액세스 만 가능합니다.

따라서 때때로 부팅 할 때 GRUB 메뉴에 멈춰 키 스트로크가 첫 번째 옵션을 선택할 때까지 기다리는 것은 정말 실망스러운 일입니다.

어떠한 상황에서도 키 입력을 기다리지 않도록 GRUB을 구성하는 방법은 무엇입니까?

업데이트 # 1 : GRUB 2이므로 menu.lst가 없습니다. 그러나 / etc / default / grub은 다음과 같습니다.

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

업데이트 # 2 : 알아 냈습니다. 실패한 부팅을 따르는 부팅에서는 GRUB이 자체 시간 초과를 비활성화합니다. 메뉴를 표시하면 부팅에 실패하므로 피할 수없는 루프입니다. 이 동작은 /etc/grub.d/00_header 파일을 편집하고 make_timeout 기능을 변경하여 비활성화 할 수 있습니다.

make_timeout ()
{
    echo "set timeout=0"
}

이제 grub 구성 업데이트 프로그램 스크립트를 종료하고 다시 실행하십시오.

sudo update-grub2

콘솔에서 액세스하는 머신을위한 제품인 Ubuntu Server의 경우이 동작이 기본값이라는 것은 말이되지 않습니다.


1
당신의 /boot/grub/menu.lst모습은 어떻습니까?
Shane Madden

7
찾은 결과를 편집 대신 자신의 질문에 대한 답변으로 게시 할 수 있습니다. 그렇게하면 원하는 경우 답변을 찬성 할 수 있습니다.
Skyhawk

답변:


41

Ubuntu 12.04 LTS의 경우에 설정할 수있는 특정 옵션이 있습니다 /etc/default/grub.

예를 들어, 2 초의 타임 아웃을 원한다면 (무인 재부팅을위한 정지를 피하기 위해) 다음 라인을 추가하십시오 /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

update-grub그 후에 달리는 것을 잊지 마십시오 ...


이로 인해 OP와 동일한 초기 문제가 해결되었지만 드문 경우에 서버를 모니터에 연결할 때 아무 것도 보이지 않습니다. 모니터는 연결되지 않지만 SSH는 여전히 잘 작동합니다. 이것이 예상됩니까?
Dowlers

18

다음은 이전 버전과 약간 다른 Ubuntu 10.10에 대한 지침입니다. /etc/grub.d/00_header 파일 에서 이전 부팅 실패에 대한 어리석은 점검을 주석 처리하십시오.

##if [ \${recordfail} = 1 ]; then
##  set timeout=-1
##else
  set timeout=${2}
##fi

그런 다음 업데이트하십시오.

sudo update-grub

Linux가 연결된 두 번째 드라이브가 있으면 grub2가 해당 드라이브를 찾아 부팅 할 때 원하는 드라이브를 묻습니다. "update-grub"을 실행하기 전에 추가 드라이브를 모두 제거하십시오.

참조 https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544


6

Ubuntu Server 9.10을 사용하여 매우 불쾌한 디자인 감독을 만났습니다. 당신의 수정은 나를 크게 도와주었습니다. 같은 파일에 "make_timeout ()"함수가 없기 때문에 9.10에 필요한 수정이 다르다는 점을 지적하고 싶었습니다.

Ubuntu 9.10의 경우 동일한 파일 (00_header)의 끝으로 이동하여 다음을 변경하십시오.

[\ $ {recordfail} = 1] 인 경우; 그때
  시간 초과 설정 = -1
그밖에
  시간 종료 = $ {GRUB_TIMEOUT} 설정
fi
EOF

[\ $ {recordfail} = 1] 인 경우; 그때
  시간 종료 = $ {GRUB_TIMEOUT} 설정
그밖에
  시간 종료 = $ {GRUB_TIMEOUT} 설정
fi
EOF

이전과 같이 다음을 실행하십시오.

sudo update-grub2

훌륭한 솔루션, 방법을 궁금해하고 완벽하게 작동합니다! 참고 : grub을 업데이트 할 때는 실행중인 grub 버전에 관계없이 "sudo update grub"만 실행하면됩니다.

이것은 내 베이컨을 저장했습니다. 일주일 동안 재부팅 할 때마다 서버가 grub 메뉴에 앉아 있었으며 무엇이 잘못되었는지 전혀 몰랐으며 모든 것을 시도했습니다. 이것과 질문의 팁이 그것을했습니다. 정말 고마워.
대런 그리브

1

직렬 액세스 (및 부트 로더가있는 동안)에 GRUB을 구성하고 개방형 직렬 포트, 널 모뎀 케이블 및 USB-RS232 변환기를 이러한 인스턴스에 편리하게 유지하십시오. 나는 헤드리스 서버와 Guruplug를 실행하고 다른 방법은 없었습니다.


1

recordfail에 대한 시간 초과를 길게 설정했습니다.

if [ "\${recordfail}" = 1 ]; then
  set timeout=30
else
  set timeout=${2}

이전 부팅에 실패한 경우 부팅 할 때 30 초의 시간 초과가 발생 함을 의미합니다. (다른 OS 가하는 것과 달리 ...)

이것은 / etc / default / grub의 설정일 수도 있고 IMHO 일 수도 있습니다.


1

왜 이것이 서버, 특히 서버에 대한 기본 조치인지는 모르겠지만 이것이 서버 설정 스크립트에서 구현 한 것입니다.

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub

1

이 접근 방식은 조금 더 깔끔 /etc/default/grub합니다. 다음 줄을 추가하여 수정 하십시오.

GRUB_RECORDFAIL_TIMEOUT=2

... 프로비저닝에서 다음과 같이 자동으로 수행 할 수 있습니다.

if grep '^GRUB_RECORDFAIL_TIMEOUT=' /etc/default/grub ; then
   echo GOOD: /etc/default/grub
else
   echo FIXING: /etc/default/grub
   perl -pi.bak -e \
      's/^(GRUB_TIMEOUT=.*\n)/${1}GRUB_RECORDFAIL_TIMEOUT=2\n/' \
      /etc/default/grub
   update-grub
fi

GRUB_RECORDFAIL_TIMEOUT 변수가 /etc/grub.d/00_header(12.04 LTS에서 볼 수 있듯이) 다음에서 언급되면 가능해야합니다 .

make_timeout ()
{
    cat << EOF
if [ "\${recordfail}" = 1 ]; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
else
  set timeout=${2}
fi
EOF
}

실패가 기록되는 방식을 파고 더 나은 답변을 얻을 수 있는지 궁금합니다.


GRUB_RECORDFAIL_TIMEOUT 매개 변수는이 질문이 처음 논의 된 이후에 추가되었습니다. 요즘에는 이것이 더 좋은 방법입니다.
mikepurvis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.