নাম থেকে কোথা থেকে এর তথ্য পাওয়া যায়?


40

প্রকৃতপক্ষে বাস্তবে এর তথ্য কোথা থেকে পাওয়া যায়?

আমি বুঝতে পারছি এটি এমন কিছু যা সরাসরি হওয়া উচিত। দুর্ভাগ্যক্রমে, আমি কেবলমাত্র সেই তথ্য সহ কোনও শিরোনাম পাই না।

বলুন কেউ মৌলিক আউটপুট পরিবর্তন করতে চেয়েছিলেন uname/ uname -s থেকে Linuxঅন্য কিছু করার জন্য (মূলত কার্নেলের পুনঃনামকরনের)।

তিনি কীভাবে সঠিকভাবে (অর্থাত্ উত্স পরিবর্তন করছেন) কীভাবে করবেন?

উত্তর:


26

unameউপযোগ থেকে তার তথ্য পায় uname()সিস্টেম কল। এটি এর মতো কাঠামোটি পপুলেট করে (দেখুন man 2 uname):

       struct utsname {
           char sysname[];    /* Operating system name (e.g., "Linux") */
           char nodename[];   /* Name within "some implementation-defined
                                 network" */
           char release[];    /* Operating system release (e.g., "2.6.28") */
           char version[];    /* Operating system version */
           char machine[];    /* Hardware identifier */
       #ifdef _GNU_SOURCE
           char domainname[]; /* NIS or YP domain name */
       #endif
       };

এটি সরাসরি চলমান কার্নেল থেকে আসে। আমি অনুমান হবে সমস্ত তথ্য হার্ড কোডেড তা হল, সম্ভবত ছাড়া domainname(এবং যেমন এটি সক্রিয় আউট, এছাড়াও nodename, machineএবং release, মন্তব্য দেখুন)। রিলিজ স্ট্রিংটি, uname -rসংকলনের সময় কনফিগারেশনের মাধ্যমে সেট করা যেতে পারে, তবে আমি সন্দেহ করি যে সিস্টেম ক্ষেত্রটি অনেকটা করতে পারে - এটি লিনাক্স কার্নেল এবং এটি অন্য কোনও কিছু ব্যবহার করার জন্য অনুমেয় কারণ নেই।

তবে এটি যেহেতু ওপেন সোর্স তাই আপনি সোর্স কোডটি পরিবর্তন করতে পারেন এবং যে কোনও সিজননেম চাইলে কার্নেলটি আবার কম্পাইল করতে পারেন ile


2
domainnameক্ষেত্র দ্বারা সেট করা হয় domainnameকমান্ড ব্যবহার setdomainnameসিস্টেম কল। একইভাবে, সিস্টেম কল ব্যবহার করে কমান্ড nodenameদ্বারা ক্ষেত্রটি সেট করা হয় । ( / মানটি এতে সংরক্ষণ করা যেতে পারে ))hostnamesethostnamenodenamehostname/etc/nodename
স্কট

2
এটি অপ্রাসঙ্গিক - প্রশ্নটি কোথায় এটি পরিবর্তন করবেন জিজ্ঞাসা করা হয়েছিল। হ্যাঁ, unameকমান্ডটি একটি সিস্টেম কল থেকে তার তথ্য পায়। এবং সিস্টেম কল তার তথ্য কোথায় পাবে? (উত্তর, এখানে অন্যান্য
পোস্টারদের

@ গিলস: অপ্রাসঙ্গিক কি? যদি উত্তরটি এখানে "অন্যান্য পোস্টার দ্বারা সরবরাহ করা হয়: এটি কার্নেলের মধ্যে কঠোরভাবে কোডড ..." নোট আমি ঠিক একই জিনিস বলেছি নোট করুন: "এটি সরাসরি চলমান কার্নেল থেকে এসেছে। আমি সমস্ত তথ্য কঠোরভাবে ধরে নেব এতে কোড করা হয়েছে ... যেহেতু এটি ওপেন সোর্স, আপনি সোর্স কোডটি পরিবর্তন করতে পারেন এবং যে কোনও সি-নেমটি চান তা ব্যবহার করতে কার্নেলটি পুনরায় সংকলন করতে পারেন It এটি কোনও কনফিগারেশন বিকল্প নয় gold
গোল্ডলোকস

2
@ গোল্ডিলকস কেন machineকখনও পরিবর্তন হবে? এটি কার্নেলের মধ্যে হার্ডকোড করা নাও হতে পারে কারণ এটি হার্ডওয়ারের সাথে খাপ খাইয়ে নিতে পারে তবে এটি তখন বুট করার সময় সেট হয়ে যায় এবং এর পরে পরিবর্তন হয় না। তবে না: এটি প্রক্রিয়া অনুযায়ী সেট করা যেতে পারে (উদাহরণস্বরূপ i686x86_64 তে প্রসেস করা 32-বিটের প্রতিবেদন করা)। উপায় দ্বারা, releaseকিছুটা পরিমাণে প্রক্রিয়া অনুযায়ীও কাস্টমাইজ করা যায় (চেষ্টা করুন setarch i686 --uname-2.6 uname -a)।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

1
@Gilles আমি সম্পাদনা করেছেন machine, nodenameএবং releaseমন্তব্য একটি রেফারেন্স সঙ্গে প্রশ্ন। আবার, প্রশ্নটি আসলে সেই সমস্ত ক্ষেত্র সম্পর্কে ছিল না।
স্বর্ণলোকস

26

ডেটা init / version.c এ সংরক্ষণ করা হয়:

struct uts_namespace init_uts_ns = {
        .kref = {
                .refcount       = ATOMIC_INIT(2),
        },
        .name = {
                .sysname        = UTS_SYSNAME,
                .nodename       = UTS_NODENAME,
                .release        = UTS_RELEASE,
                .version        = UTS_VERSION,
                .machine        = UTS_MACHINE,
                .domainname     = UTS_DOMAINNAME,
        },
        .user_ns = &init_user_ns,
        .proc_inum = PROC_UTS_INIT_INO,
};
EXPORT_SYMBOL_GPL(init_uts_ns);

স্ট্রিংগুলি সেগুলিতে অন্তর্ভুক্ত / উত্পন্ন / সংকলন অন্তর্ভুক্ত:

#define UTS_MACHINE "x86_64"
#define UTS_VERSION "#30 SMP Fri Apr 11 00:24:23 BST 2014"

এবং এতে অন্তর্ভুক্ত / উত্পন্ন / উত্স্রলিজ।

#define UTS_RELEASE "3.14.0-v2-v"

ইউটিএসএসওয়াইএসআইএম সংযুক্ত / লিনাক্স / uts.h এ সংজ্ঞায়িত করা যেতে পারে

#ifndef UTS_SYSNAME
#define UTS_SYSNAME "Linux"
#endif

বা মেকফিলগুলিতে একটি # নির্দিষ্ট রূপ হিসাবে

অবশেষে, হোস্টনাম এবং ডোমেইননাম / proc / sys / কার্নেল / {হোস্টনাম, ডোমেননাম by দ্বারা নিয়ন্ত্রিত হতে পারে} এগুলি ইউটিএস নামের স্থান অনুসারে:

# hostname
hell
# unshare --uts /bin/bash
# echo test > /proc/sys/kernel/hostname 
# hostname
test
# exit
# hostname
hell

এটি সাধারণত একটি ভাল এবং সম্পূর্ণ উত্তর, তবে পোস্টারের প্রশ্নের সরাসরি নির্দেশের উত্তর দেওয়ার সময় এটি মূল্যবান হতে পারে। আমি বিশ্বাস করি এটি এর পরিমাণ হবে - প্রাসঙ্গিক ফাইলে প্রাসঙ্গিক এন্ট্রি পরিবর্তন করে এবং পুনরায় কম্পাইল করুন। আপনি লিখেছেন "বা মেকফিলগুলিতে একটি # নির্দিষ্ট হিসাবে"। তুমি কি বিস্তারিত বলতে পারো?
ফাহিম মিঠা

জন্য +1 unshare। আজ অবধি কোনওভাবেই আমি এই আদেশটি মিস করতে পেরেছি। ধন্যবাদ!
টিনো

এবং include/generated/compile.hউত্পাদিত হয়েছে scripts/mkcompile_h: unix.stackexchange.com/a/485962/32558
Ciro

8

একটি সাহায্যে লিনাক্স ক্রস রেফারেন্স দেখুন ও আপনার উল্লেখ /proc/sys/kernel/ostype, আমি ট্র্যাক ostypeকরতে অন্তর্ভুক্ত / লিনাক্স / sysctl.h , যেখানে একটি মন্তব্য বলছেন যে নাম কল করে যোগ করা হয় register_sysctl_table

সুতরাং কোথা থেকে বলা হয় ? একটি জায়গা হ'ল কার্নেল / utsname_sysctl.c , এর মধ্যে / linux / uts.h অন্তর্ভুক্ত রয়েছে , যেখানে আমরা পাই:

/*
 * Defines for what uname() should return 
 */
#ifndef UTS_SYSNAME
#define UTS_SYSNAME "Linux"
#endif

সুতরাং, কার্নেলের ডকুমেন্টেশন অনুসারে:

এই মানগুলি টিউন করার একমাত্র উপায় হ'ল কার্নেলটি পুনর্নির্মাণ

:-)


6

অন্য কোথাও মন্তব্য করা হিসাবে, তথ্যটি unameসিসকলের সাথে আসে , যা তথ্য চলমান কার্নেলটিতে হার্ড-কোডড।

সংস্করণ অংশ স্বাভাবিকভাবে সেট থাকে, তখন একটি নতুন কার্নেল কম্পাইল Makefile নামক :

VERSION = 3
PATCHLEVEL = 15
SUBLEVEL = 0
EXTRAVERSION =

যখন আমার কার্নেলগুলি সংকলন করার সময় পেতাম, আমি সেখানে এক্সট্রাভেরশনে জিনিস যুক্ত করতাম; যে আপনাকে uname -r ভালো জিনিস দিয়েছিল 3.4.1-mytestkernel

আমি এটি পুরোপুরি বুঝতে পারি না, তবে আমি মনে করি যে বাকি তথ্যগুলি Makefile944 লাইনের আশেপাশে সেটআপ করা আছে :

# ---------------------------------------------------------------------------

# KERNELRELEASE can change from a few different places, meaning version.h
# needs to be updated, so this check is forced on all builds

uts_len := 64
define filechk_utsrelease.h
    if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
      echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2;    \
      exit 1;                                                         \
    fi;                                                               \
    (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
endef

define filechk_version.h
    (echo \#define LINUX_VERSION_CODE $(shell                         \
    expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
    echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
endef

$(version_h): $(srctree)/Makefile FORCE
    $(call filechk,version.h)

include/generated/utsrelease.h: include/config/kernel.release FORCE
    $(call filechk,utsrelease.h)

PHONY += headerdep
headerdep:
    $(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
    $(srctree)/scripts/headerdep.pl -I$(srctree)/include

বাকি ডেটাগুলির জন্য, sys_unameম্যাক্রোস (বেশ কয়েকটি সংশ্লেষিত উপায়ে) ব্যবহার করে সিস্কাল তৈরি করা হয়েছিল, আপনি যদি দুঃসাহসী বোধ করেন তবে আপনি এখান থেকে শুরু করতে পারেন ।

সম্ভবত এই জাতীয় তথ্য পরিবর্তনের সর্বোত্তম উপায় হ'ল unameসিস্কলকে ওভাররাইড করার জন্য একটি কার্নেল মডিউল লেখা ; আমি এটি কখনও করি নি তবে আপনি এই পৃষ্ঠায় ৪.২ বিভাগে তথ্য সন্ধান করতে পারেন (দুঃখিত, সরাসরি কোনও লিঙ্ক নেই)। তবে খেয়াল করুন যে কোডটি বেশ পুরানো কার্নেলের সাথে উল্লেখ করছে (বর্তমানে লিনাক্স কার্নেলের নাম utsস্পেস রয়েছে, তারা যা বোঝায়) তাই আপনাকে সম্ভবত এটি পরিবর্তন করতে হবে।


ধন্যবাদ সবাইকে. আমি ইতিমধ্যে জানতাম এটির সাথে কিছু করার আছে। যাইহোক, আমি যা বুঝতে পারি না তা হ'ল উত্সটির ভিতরে এবং কোথায় "লিনাক্স" স্ট্রিংটি সংজ্ঞায়িত করা হয়। আমি জানি কেবল রানটাইম চলাকালীন আমি সেই তথ্যটি কোথায় খুঁজে পেতে পারি (এটি / প্রোক / সিএস / কার্নেল / ostype এর মধ্যে রয়েছে)। কর্নেল নিজেই সঠিক নামটি জানতে পারে যে এটির সঠিক নামটি আরও আকর্ষণীয় বিষয় হয়ে উঠবে, আমি বলব।
ব্যবহারকারী 237251

@ user237251 "লিনাক্স" শব্দের কতগুলি উদাহরণ স্ট্রিং প্রসঙ্গে কার্নেল উত্সে ঘটে? যদি এটি এতটা না হয় তবে আপনি কেবল একটি পাঠ্য অনুসন্ধানের ফলাফলগুলি পরীক্ষা করতে পারেন এবং এটি আপনাকে কোথায় নিয়ে যায়।
জ্যাব

@ জ্যাব ওয়ে অনেক বেশি। ভাগ্যক্রমে, কার্নেলওবি.এস.আর.এর কেউ আমাকে "রহস্য" সমাধান করতে সহায়তা করেছে। লিনাক্স এর নাম / / অন্তর্ভুক্ত / লিনাক্স / আউটস। এখানে দেখুন: lxr.free-electrons.com/source/incolve/linux/uts.h?v=3.10
ব্যবহারকারী 237251

2

যদিও এটি সূচিত করার জন্য উত্সটিতে আমি কিছু খুঁজে পাইনি, আমি বিশ্বাস করি এটি অবিচ্ছিন্ন সিস্কেল ব্যবহার করে।

man 2 uname

এটি সম্পর্কে আপনাকে আরও বলা উচিত। যদি কেসটি হয় তবে এটি সরাসরি কার্নেলের কাছ থেকে তথ্য পেয়েছে এবং এটি পরিবর্তন করার জন্য সম্ভবত পুনরায় সংশোধনের প্রয়োজন হবে।

আপনি বাইনারি পরিবর্তন করতে পারেন আপনি যা করতে চান তা করার জন্য বাইনারি তবে আপনি কেবল ডাব্লু / ই প্রোগ্রাম দিয়ে লিখুন দয়া করে। নেতিবাচক কিছু স্ক্রিপ্ট যে আউটপুট উপর নির্ভর করে।


3
যদি আপনি strace unameএটি করেন তবে এটি নিশ্চিত করবে যে unameসিস্টেম কলটি ব্যবহৃত হয়েছে।
গ্রিম

1

আনম পরিবর্তন করার সঠিক উপায় হ'ল সংকলন শিরোনাম পরিবর্তন করা এবং অন্যদের পরামর্শ মতো পুনরায় সংকলন করা। তবে আমি নিশ্চিত নই যে আপনি যখন এমন কিছু করতে পারেন তখন কেন আপনি এত ঝামেলার মধ্য দিয়ে যেতে চান,

alias uname 'uname \\!* | sed s/2.6.13/2.6.52/'

অথবা এমনকি

alias uname 'echo whatever'

0

রমানোর জবাব আমার কাছে পার হয়ে গেছে, কিন্তু কার্নেল উত্স ডিরেক্টরিতে Q=আপনার makeকমান্ডলাইনে বিকল্পটি পাস করার মাধ্যমে আসল যাদুটি আরও সহজেই আবিষ্কার করা যায় । আপনার বিবরণ, একটি স্ক্রিপ্ট একটি কল যা এক দেখতে দেয়: echo "4.4.19$(/bin/sh ./scripts/setlocalversion .)"। একই স্নিপেট চালানো কর্নেল রিলিজ নম্বর দেয় 4.4.19-00010-ge5dddbf,। আপনি যদি স্ক্রিপ্টটি দেখেন, এটি সংস্করণ সিস্টেম থেকে সংখ্যাটি নির্ধারণ করে এবং এটি চালানো bash -xসঠিক প্রক্রিয়াটি দেখায়:

+++ git rev-parse --verify --short HEAD
++ head=e5dddbf
+++ git describe --exact-match
++ '[' -z '' ']'
++ false
+++ git describe
++ atag=release/A530_os_1.0.0-10-ge5dddbf
++ echo release/A530_os_1.0.0-10-ge5dddbf
++ awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
++ git config --get svn-remote.svn.url
++ git diff-index --name-only HEAD
++ grep -qv '^scripts/package'
++ return
+ res=-00010-ge5dddbf
+ echo -00010-ge5dddbf
-00010-ge5dddbf

এটি আমাকে যা দেখায় তা হ'ল যদি আমি আমার চলমান কার্নেলের সাথে কাজ করার জন্য একটি কার্নেল মডিউল তৈরি করতে চাই, তবে আমি ভুল ট্যাগ হওয়া রিলিজ এবং ভুল প্রতিশ্রুতিতে আছি। make dtbsসঠিক সংস্করণ নম্বর সহ উত্পন্ন ফাইলগুলি তৈরি করতে আমার এটি ঠিক করতে এবং কমপক্ষে ডিটিবি ( ) তৈরি করতে হবে।


দেখা যাচ্ছে, এমনকি যথেষ্ট ছিল না। আমাকে scripts/setlocalversionকেবল একটিতে প্রতিস্থাপন করতে হয়েছিল :

#!/bin/sh
echo -0710GC0F-44F-01QA

তারপরে স্বয়ংক্রিয়তাযুক্ত ফাইলগুলি পুনর্নির্মাণ করুন:

make Q= ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs

তারপরে আমি ডেরেক মলয়ের নমুনা ড্রাইভারটি তৈরি করতে পারি এবং insmodএটি সফলভাবে সক্ষম হয়েছি । স্পষ্টত Module.symversউপস্থিত না থাকার সম্পর্কে সতর্কবার্তাটি কোনও ব্যাপার নয়। সমস্ত লিনাক্স মডিউলটি সেই লোকালভার্সনের স্ট্রিংয়ের কাজ করবে কিনা তা নির্ধারণ করতে ব্যবহার করছিল।


0

scripts/mkcompile_h

V4.19-এ, এই ফাইলটি উত্পন্ন করে include/generated/compile.hএবং এর মধ্যে বেশ কয়েকটি আকর্ষণীয় অংশ রয়েছে /proc/version: https://github.com/torvalds/linux/blob/v4.19/scriptts/mkcompile_h

  • #<version>অংশ থেকে আসে .versionbuild ট্রি, যা বৃদ্ধি পরার যখনই লিংক ঘটে ফাইল দ্বারা (পরিবর্তনগুলি কনফিগ ফাইল প্রয়োজন /) scripts/link-vmlinux.sh

    এটি KBUILD_BUILD_VERSIONপরিবেশে পরিবর্তনশীল দ্বারা ওভাররাইড করা যেতে পারে :

    if [ -z "$KBUILD_BUILD_VERSION" ]; then
        VERSION=$(cat .version 2>/dev/null || echo 1)
    else
        VERSION=$KBUILD_BUILD_VERSION
    fi
    
  • তারিখটি কেবল একটি কাঁচা dateকল:

    if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
        TIMESTAMP=`date`
    else
        TIMESTAMP=$KBUILD_BUILD_TIMESTAMP
    fi
    

    এবং একইভাবে ব্যবহারকারীর নামটি whoami( KBUILD_BUILD_USER) এবং হোস্টনাম থেকে hostname( KBUILD_BUILD_HOST) থেকে আসে

  • সংকলক সংস্করণটি এসেছে gcc -v, এবং এটি নিয়ন্ত্রণ করা যায় না বলে মনে হয়।

প্রশ্নের স্টাফ সংস্করণটি কীভাবে পরিবর্তন করা যায় তা এখানে রয়েছে: https://stackoverflow.com

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.