2012-04-13 16 views
7

Tôi cần viết một tập lệnh bash nơi tôi phải kiểm tra xem hạt nhân Linux có 32 bit hay 64 bit không.Cách kiểm tra hạt nhân 32 bit/64 bit cho Linux

Tôi đang sử dụng lệnh uname -a và cho tôi kết quả x86_64. Nhưng tôi tin rằng tôi không thể sử dụng nó theo cách chung chung bởi vì kết quả có thể khác nhau nếu một số người sử dụng kiến ​​trúc non x86.

Cách kiểm tra hạt nhân 32 bit/64 bit cho Linux?

+0

Khi bạn nói "cài đặt", bạn có nghĩa là hạt nhân? Vì bạn có thể sử dụng hạt nhân 64 bit với cài đặt 32 bit. –

+0

Có ... Hạt nhân ... Cảm ơn – VJS

Trả lời

-2

Grep cho '64' ở đầu ra uname

uname -a | grep 64 
+2

Nếu hạt nhân được biên dịch 64 lần, điều này sẽ gây ra kết quả dương tính giả. Ditto nếu tên của máy chủ là 'blade64A'. –

+1

Sử dụng 'uname -i | thay vào đó grep 64'. –

+0

@David Schwartz: Tôi có chút mới mẻ trong điều này và không nhận được suy nghĩ của bạn. Bạn có thể giải thích một chút được không. Cảm ơn một tấn !! – VJS

5

Bạn có thể truy vấn hệ thống với kích thước của một long int:

getconf LONG_BIT 

Nhưng tôi không chắc chắn nếu điều này là hoàn toàn xách tay để tất cả các kiến ​​trúc khác nhau.

1

Tìm kiếm cờ lm (chế độ dài) trong/proc/cpuinfo. Nếu điều này là đúng, nó có nghĩa là bạn có một bộ xử lý 64 bit. Một grep đơn giản sẽ cung cấp cho bạn thông tin này.

Về phiên bản hạt nhân, bạn luôn có thể grep trên thông tin uname -a. Tốt hơn là tìm nguồn gốc của chương trình chưa được đặt tên để chúng tôi có thể giảm chênh lệch do tên máy chủ độc hại.

+2

Điều này sẽ chỉ hoạt động trên i386/x86_64. Tôi đã từng làm việc trên một máy POWER và có định dạng '/ proc/cpuinfo' hoàn toàn khác, nhỏ gọn hơn nhiều và không có các cờ như thế này. –

+0

@above/proc/cpuinfo cung cấp số bit vật lý và bit ảo. Bạn có nhận được thông tin này khi làm việc trên máy điện không ?? Bước tiếp theo cho chúng tôi là hiểu được thông tin này. Tôi đang cố gắng. Một điều nữa: Tôi nghĩ rằng chúng tôi có thể sử dụng kích thước của int trong C để xác định kích thước từ của máy. –

+0

@prathmeshkallurkar Tôi không có quyền truy cập vào máy đó nữa, nhưng tôi nhớ thông tin thực sự ngắn gọn - như 4 dòng trên mỗi CPU, chỉ có tên mẫu và hầu như không có gì khác. Ngay cả khi nó có thông tin về các bit có sẵn, nó chắc chắn ở một định dạng khác với trên x86. –

1

Tôi nghĩ ra những điều sau đây. Nó giả định rằng init được sử dụng (một số bản phân phối đã chuyển sang trình tải khác, nhưng sẽ dễ dàng có được danh sách những người được sử dụng hợp lý thường xuyên) và bạn sử dụng ELF, không phải a.out hoặc định dạng thực thi kỳ lạ khác hiện nay. Đây có thể là giả định cho hầu hết các hệ thống, nhưng có lẽ chúng có thể bị phá vỡ trong các hệ thống nhúng, v.v. Tuy nhiên, ý tưởng chung có thể thích ứng (có được quy trình init hoặc tương đương và kiểm tra bit của nó bằng cách sử dụng file). Nếu bạn đang chạy dưới dạng root, thay vì đi qua đường dẫn của tệp, bạn có thể sử dụng file $(sudo readlink -e /proc/1/exe) (PID 1 là init có lẽ là di động nhiều hơn bất kỳ điều gì về đường dẫn của tệp).

if file /sbin/init | fgrep 'ELF 64-bit' &>/dev/null; then 
    echo "64-bit" 
else 
    echo "not 64-bit" 
fi 
+0

Vấn đề với cách tiếp cận này là có thể sử dụng thực thi 32 bit khi chạy hạt nhân 64 bit. – Job

+0

@Job Bạn nói đúng, nhưng 'init' (PID 1) được thực hiện như là quá trình đầu tiên, vì vậy tôi nghĩ nó xác định được độ bit của toàn bộ hệ thống. –

+0

Vâng, tôi nghĩ rằng về mặt kỹ thuật, nó có thể là ngay cả đối với 'init' là 32 bit trên hạt nhân 64-bit nhưng trên bất kỳ hệ thống" bình thường "nào thì cách tiếp cận của bạn sẽ ổn thôi. – Job

15

Câu hỏi đặt ra là: bạn dự định đạt được gì khi biết bạn đang ở trên 32 hay 64? Hậu quả của việc sử dụng môi trường 128-bit giả định là gì? Và phần nào thực sự đang được thử nghiệm cho N-bitness? Một CPU có thể hỗ trợ chạy trong chế độ 64-bit, nhưng môi trường là 32-bit. Hơn nữa, bản thân môi trường có thể là một chế độ hỗn hợp; xem xét chạy hạt nhân 64 bit với một không gian người dùng 32 bit (được thực hiện trên một số RISC cổ điển). Và sau đó, nếu không gian người dùng không phải là một định dạng bitness/thực thi đồng nhất? Đó là lý do tại sao getconf LONG_BIT là vô nghĩa như nhau để sử dụng, bởi vì nó phụ thuộc vào cách nó được biên dịch.

$ /rt64/usr/bin/getconf LONG_BIT 
64 
$ /usr/bin/getconf LONG_BIT 
32 
$ file /usr/bin/getconf /rt64/usr/bin/getconf 
/usr/bin/getconf:  ELF 32-bit MSB executable, SPARC32PLUS, V8+ Required, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 
/rt64/usr/bin/getconf: ELF 64-bit MSB executable, SPARC V9, relaxed memory ordering, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 
$ uname -m 
sparc64 
0

Depend những gì bạn đang tìm kiếm, tôi có lắp máy trong 32 bit trên 64 bit proc, tất cả đều ở trên sẽ quay trở lại 32 bit trong trường hợp của tôi

Nhưng nếu tôi nhìn vào phần cứng, lshw trên Ubuntu (lshw -c cpu), mô tả về CPU hiển thị rõ ràng tôi có một CPU 64 bit, vì vậy tôi có thể cài đặt một phiên bản 64 bit của Ubuntu.

/proc/cpuinfo cũng là nguồn thông tin tốt về phần cứng, như cờ lm đứng ở chế độ dài.

Chúc một ngày tốt đẹp. Jack.