もちろん、ソースからカーネルにパッチを当ててビルドするのは面白いゲームですが 、怠UbuntuなUbuntuユーザー向けの既製のリポジトリがあります。 1つの問題-パッケージをダウンロードし、更新を手動で追跡する必要があります。
最近まで、たとえば、各アーキテクチャのコマンドのリストが公開されているサイトなどで更新を監視することができ、端末に簡単にコピーすることができました。 しかし、最近、このエッセイを作成する動機となるスクリプトが登場しました。
スクリプトの作成者が唯一の目標を設定したと心から信じています-チームの迷惑なリストの公開を停止し、誰がどんなアーキテクチャを持っているかをコメントで説明することですが、それにもかかわらず、その内容を見たときに平均的な男性の涙が私の頬を転げ落ちました。
それで、私は一時停止し、それが以前にどのように行われたのか、木が大きくなったとき、時にはバイナリーだったときを思い出すことにしました。
そのため、 リポジトリからUbuntuのバージョンの最新カーネルを取得し、インタラクティブモードまたは自動(anachronでの操作用)モードでインストールします。
rc(リリース候補)としてマークされたカーネルは、しばしば動作が悪く、リポジトリには常に完全なバージョンが含まれているとは限らないため、インストールしません。
私たちのバージョンのUbuntuのカーネルに加えて、次のバージョンの新しい安定したカーネルを入手できることは悪くありません(実践が示すように、そのようなカーネルはしばしばうまく機能し、有用な更新を含みます)。
したがって、構文に到達します
sudo bash kernel_upd.sh [-a] [-u] [-h]
オプションの意味は次のとおりです。
-a自動インストールを有効にします(スクリプトは追加の質問をしません。これにより、anacronのタスクとして有効にできます)。
-u Ubuntu以外のバージョンのカーネルをインストールできます
-h短いヘルプ
さらに、スクリプトを完全には分析しませんが、一般的な戦略といくつかの有用なbashプログラミング手法のみを示します。
戦略
-
wget
を使用して、利用可能なカーネルのリストをダウンロードします。
-
grep
と正規表現を使用して、必要なカーネルのみをフィルタリングします(rcではなく、おそらくUbuntuのバージョンに対応しています)。
- リポジトリの構造は、新しいカーネルがリストの最後に配置されるようになっているため、追加のソートは不要で、最後のカーネルが最新になります。
tail
コマンドを使用してバージョンを取得します。
-
uname
コマンドを使用して、システムにインストールされているカーネルのバージョンを取得します。
- 正規表現を使用して、インストール済みの使用可能なカーネルのメジャーバージョンを選択し、新しいバージョンが使用可能な場合は、
dpkg
コマンドを使用してダウンロードしてインストールします。
- エラーを受け取った場合、報告します。 すべてがうまくいった場合は、ダウンロードしたファイルを削除し、再起動を求めます。
Bashの便利なささいなこと
メッセージでスクリプト名$0
使用します
スクリプトメッセージは、どのスクリプトからのものかを示すと、はるかに情報量が多くなります。 パラメーター
$0
には、実行可能スクリプトの名前が含まれています。 たとえば、スーパーユーザー権限でスクリプトを実行するリクエストは次のようになります
if [ `whoami` != 'root' ]; then echo "Permission denied. Run $0 as the root" exit 1; fi
Ubuntuのインストール済みバージョンの名前を取得します
Ubuntuのスクリプトでは、このディストリビューションのどのバージョンをインストールしたかを知ることは非常に便利です。
lsb_release
コマンドは、この情報を取得するのに役立ちます
RELEASE_CDN=`lsb_release -sc`
追加のコマンドを使用する
システムにインストールされている可能性のあるコマンドをオプションで使用する場合(たとえば、
send-notify
が使用可能な場合はユーザーに通知し、使用
send-notify
ない場合は
kdialog
を使用する)、次の例を使用できます。
目的のコマンドのパスを取得します
KNOTIFY=`which kdialog` NOTIFY=`which notify-send`
受信したパスが空でない場合、コマンドは利用可能です
if [[ -n $NOTIFY ]]; then notify-send 'Installation finished' "Kernel $KERNEL_A was succesfuly installed<br> Please, reboot your computer for the changes to take effect" elif [[ -n $KNOTIFY ]]; then kdialog --title 'Installation finished' --passivepopup "Kernel $KERNEL_A was succesfuly installed<br> Please, reboot your computer for the changes to take effect" fi
ユーザー確認リクエスト
対話モードでスクリプトを起動するとき、アクションの実行の確認をユーザーに尋ねるのは良いトーンです。 これを行うために、
if
コマンドまたは
case
コマンドとともに、ユーザーと通信するための強力なツールになることができる
read
コマンドがあります。 例えば
read -p 'Do you want to reboot computer now (y/n)?' REPLY if [ $REPLY == 'y' ]; then shutdown -r 0 fi
ユーザーにコンピューターをすぐに再起動する許可を求めます。
スクリプトオプションの分析
getopts
コマンドは、
-a -u
または
-au
形式でスクリプトオプションを分析するための強力なツールを提供します。 パラメーターのないオプションは、コロンの前にコロンで指定されます
":auh"
、パラメーターのあるオプションは、コロンの後に指定されます。
while getopts ":auh" opt; do case "$opt" in "a") AUTO=1;; "u") RELEASE='';; "h") echo -e $USAGE exit 0;; "?") echo "Invalid option $OPTARG. Try $0 -h for help" exit 1;; *) echo "Unknown error while processing options" exit 1;; esac done
前の$?
実行ステータスを確認し$?
スクリプトの実行中に、一部のコマンドが失敗し、さらにスクリプトの実行が台無しになる場合があります。 したがって、このようなコマンドの実行ステータスを確認することが重要です。 このステータスは、パラメーター
$?
含まれています
$?
dpkg -i *.deb if [ $? -eq 0 ]; then echo "..." fi
入力I / Oをリダイレクトする|
演算子を使用して、あるコマンドの出力を別のコマンドの入力にリダイレクトする便利な機能を忘れないでください
|
KERNEL_A=`wget -qO - $REP | grep -o "v[0-9]\.[0-9].[0-9]*-"$RELEASE"\w*" | tail -n 1`
これにより、基本的なコマンドを1つにまとめることができ、必要なことだけを行います(上記のコマンドは、リポジトリから最新の安定バージョンのカーネルを取得し、変数
KERNEL_A
保存します)。
カスタム機能を使用する
Bashで利用可能なカスタム関数は、スクリプトコードの量を大幅に削減できます。
function clean { cd / echo 'Cleaning...' rm -rf /tmp/KERNEL_UPD } clean
完成したスクリプトはこちらから入手できます 。 それを変更し、編集し、自分の目的のためにその部分を使用します。
おわりに
最後に言いたいことは-もちろん、Ubuntuは人々にとってLinuxですが、それは主にLinuxであり、わずかな労力で、ビデオを見たりインターネットをサーフィンしたりするための美しいシェルだけでなく、不思議なことに取り組むことができる強力なデザイナーも手に入れることができます。
そして、力があなたと共に来ますように!
PS:複雑なスクリプトを改善できる有益な説明をしてくれたegorinskユーザーに感謝します。
PPS:シューッという音は「不必要ではありません!」私にとってカルマをマージし、最初にコメントを書いてから考える人、正しい人種的に正しい生き方を知っている人-地獄で燃えている! スマッキング= *