2008-11-30 37 views
21

Tôi muốn nhận được từ bất kỳ hệ thống giống Unix nào (nếu có thể) một id duy nhất sẽ liên tục mỗi khi ứng dụng của tôi chạy trong cùng một máy. Nếu có thể, tôi muốn nhận được cùng một id từ Linux hoặc FreeBSD hoặc Solaris, v.v ... Tôi không muốn tạo id mới cho mỗi máy, nhưng có một id đã tồn tại và tôi thích id này đến từ hệ điều hành và tôi không thích sử dụng cái gì đó như địa chỉ MAC.Lấy một id duy nhất từ ​​hệ thống giống Unix

Nếu không có tùy chọn nào khác, tôi có thể sử dụng MAC kết hợp với một thứ khác, ví dụ id có thể là băm md5 của tổ hợp địa chỉ MAC và một thứ khác.

Tôi muốn nghe đề xuất của bạn.

Nếu nó hữu ích, đơn đăng ký của tôi được viết bằng C/C++.

Mục tiêu của tất cả điều này là để ngăn người dùng chạy ứng dụng của tôi từ hai lần trở lên. Tôi muốn chạy một lần.

+0

Tôi thấy điều này không rõ ràng. Bạn muốn xác định điều gì? Phần cứng bạn đang chạy? Người dùng? Thứ gì khác?? Và duy nhất trên phạm vi gì? – dmckee

+0

Tôi phải đồng ý. Tại sao tất cả các hạn chế? –

+0

Tôi đã có một động não. Tôi nghĩ anh ấy muốn trợ giúp triển khai cơ chế hạn chế bản sao. Điều đó làm cho nó phần cứng, và câu trả lời của uzhin hợp lý. – dmckee

Trả lời

2

Tôi không nghĩ điều đó là có thể. Gần nhất bạn có thể nhận được là tạo một chuỗi ngẫu nhiên rất dài (như MS làm với GUID) và lưu trữ nó ở đâu đó trên hệ thống của bạn.

+0

+1 để hủy bỏ phiếu bầu. Điều này đã tốt hơn so với Blue có thể đã mong đợi ở đầu. – dmckee

+0

GUID không phải ngẫu nhiên, mỗi lần. Tuy nhiên, MS tạo ra chúng như thế nào, chúng sẽ không nói. Chúng được cho là không lặp lại trên máy mà chúng được tạo ra. –

11

Cả Solaris và Linux đều cung cấp hostid (1) tiện ích

+10

Trên Linux glibc, gethostid() (đó là những gì sử dụng hostid) trả về một giá trị dựa trên địa chỉ IP, mà không phải là duy nhất cũng không thay đổi. – CesarB

+0

Điều đó hoàn toàn phụ thuộc vào ứng dụng. –

+4

Tôi vừa thử nghiệm 'hostid' trên 3 máy tính khác nhau (nhưng cùng một bản phân phối): nó trả về cùng một giá trị cho tất cả chúng. – picrap

1

Bạn phải xem xét rằng rất nhiều các thiết lập có thể đã tạo ra một hình ảnh hệ thống tập tin và nhân bản với nhiều máy móc, chứ không phải là thiết lập chúng riêng rẽ. Trong các trường hợp khác, máy có thể thiết lập lại nhiều lần. Nói cách khác, bất cứ điều gì hệ điều hành được cung cấp không thể tin cậy được.

Tuy nhiên, CPU vẫn giữ một số sê-ri duy nhất, nhưng quyền truy cập vào nó sẽ khác nhau trên các hệ thống khác nhau.

+0

Điều đó phụ thuộc vào loại CPU bạn có. Một thời gian ngắn, Intel bắt đầu triển khai một số sê-ri trên các bộ vi xử lý Pentium mà bạn có thể nhận được với hướng dẫn cpuid, nhưng họ nhận được rất nhiều phản hồi từ các nhóm riêng tư về nó. Tôi không chắc họ vẫn làm điều đó. Nếu máy tính có 2 procs thì sao? –

0

Có vẻ như bạn đang tìm kiếm UUID. Đây là một id phổ biến duy nhất trên toàn cầu (thực sự, giống như GUID)

Có nhiều triển khai C++ này trong libs khác nhau hoặc bạn có thể sử dụng lệnh uuidgen và nắm bắt đầu ra.

+1

Err, no, UUID là khác nhau mỗi khi nó được tạo ra: "id duy nhất sẽ liên tục mỗi khi ứng dụng của tôi chạy trên cùng một máy" – user23167

1

Bạn không đề cập đến mức độ ổn định của số nhận dạng duy nhất cần phải - bạn luôn muốn có cùng một máy chủ để tạo cùng một ID mỗi khi mã của bạn được chạy?

Nếu không, thì đề xuất của uuidgen của fuzzymonk là những gì bạn muốn.

Nếu có, thì bạn cần phải quyết định những gì cấu thành "giống" như xa như máy chủ lưu trữ liên quan. Một cách sẽ là như bạn đề nghị, tổng MD5 của MAC của giao diện ethernet đầu tiên và "cái gì đó". Đối với "cái gì đó" trong trường hợp đó tôi sẽ xem xét FQDN, trừ khi khái niệm của bạn "cùng một máy chủ" bao gồm FQDN thay đổi ...

0

Hầu hết các máy giống Unix có bộ tạo số ngẫu nhiên có thể truy cập thông qua /dev/random. Bạn sẽ cần một cái gì đó giống như một địa chỉ MAC và một thời gian để cung cấp cho một sự độc đáo chính hãng cho máy phát điện GUID (đây là những gì các máy phát điện GUID trên Windows nào). Ngày đầu này, nhận được một cái gì đó từ/dev/ngẫu nhiên sẽ giúp bạn có được một cấu trúc GUID loại hợp lý tốt. Trong thực tế, các thư viện UUID thực hiện điều này đằng sau hậu trường.

Nếu bạn chỉ cần một số cho mỗi máy, hơn một địa chỉ MAC có thể sẽ là đủ. Chúng được quản lý bởi một cơ quan trung tâm và người ta có thể giả định hợp lý rằng không có hai địa chỉ MAC nào giống nhau.Tuy nhiên, nếu bạn đang cố gắng sử dụng điều này để buộc cài đặt phần mềm vào địa chỉ MAC, hãy lưu ý rằng một số thành phần có địa chỉ MAC có thể lập trình hoặc các thành phần có thể lập trình của địa chỉ MAC. Các hệ điều hành giống Unix, đặc biệt là các hệ điều hành nguồn mở có xu hướng không có các số xê-ri cứng có dây. Cách tiếp cận này cũng có thể gây ra các vấn đề với việc chạy nhiều phiên bản phần mềm trong máy ảo.

Một tùy chọn có thể là USB dongle, có thể lấy từ một số nhà sản xuất. Một tùy chọn khác có thể là một máy chủ cấp phép, nơi mã duy nhất được cung cấp cho máy chủ. Một lần nữa, một số giải pháp đóng hộp cho điều này có sẵn từ các nguồn khác nhau.

+0

Tôi cần một số cho mỗi máy, sẽ liên tục. Tôi biết tất cả những điều này về địa chỉ MAC và bởi vì chúng có thể thay đổi, chúng là giải pháp cuối cùng của tôi. – Blue

9

Cách tốt nhất là, như thường lệ, để xem cách người khác đã giải quyết cùng một vấn đề.

FLEXlm cũng sử dụng số nhận dạng máy chủ lưu trữ cho các giấy phép khóa nút của nó. Số nhận dạng máy chủ phổ biến nhất mà nó sử dụng là địa chỉ MAC ethernet cho một trong các giao diện mạng của bạn, được đập cùng nhau mà không có bất kỳ dấu phân cách nào.

Nó cũng có thể sử dụng (trên Windows) số sê-ri của ổ C: một lần nữa đập vỡ mà không có bất kỳ dấu tách nào, và trên Solaris đầu ra của lệnh hostid (IIRC, trên máy tính Sun, số này thực sự là độc đáo, và nằm trên một EEPROM có thể tháo rời nhỏ trên bo mạch hệ thống).

Trong khi địa chỉ MAC cực kỳ dễ giả mạo, nó gần như là một định danh phổ biến hiện nay (gần như tất cả các máy tính mới có ít nhất một cổng ethernet, và nó rất phổ biến để chúng hoạt động) độc đáo trên toàn cầu (trên thực tế, các giao thức Ethernet phụ thuộc vào tính độc đáo này). Các vấn đề chính bạn sẽ gặp phải với phương pháp này:

  • Một số máy tính có một số địa chỉ ethernet; một số trong số đó là trên bảng chính, một số là trên thẻ rời rời.
  • Chúng cực kỳ dễ giả mạo (và một số giao thức phụ thuộc vào việc có thể thay đổi chúng).
  • Một số môi trường ảo hóa tạo ra các địa chỉ ethernet ngẫu nhiên trên mỗi lần khởi động (nhưng chúng thường có cách để buộc một giá trị cố định).
+0

+1 - Tôi sẽ đề cập đến rằng nếu có một cách đáng tin cậy để duy nhất id một hệ thống Linux, flexlm sẽ sử dụng nó, nhưng họ giải quyết cho địa chỉ mac. – JimB

3

Không có cách nào chung và đáng tin cậy để có được những gì bạn muốn.

5

Tùy chọn khác là sử dụng thông tin có nguồn gốc từ dmidecode, một lệnh hiện diện trên Linux. Thông tin này được giải mã từ/dev/mem, do đó yêu cầu quyền truy cập root.

Thông tin dmidecode lần đọc được biết là thiếu sót, như một số nhà sản xuất bo mạch chủ nói dối hoặc giả mạo một số trường.

+0

dmidecode không khả dụng trên tất cả các hệ thống Linux. Ví dụ như hệ thống IBM POWER với SLES được cài đặt trên chúng. – woverton

0

Bạn đã đề cập rằng trên Windows bạn sử dụng một số GUID ... Bạn có một số chi tiết về cách nó được tạo ra không? Ngoài ra, bạn có thể thử một cái gì đó như ID CPU, hoặc ID đĩa cứng ... Tôi cho rằng những người không thể thay đổi (nhưng bạn sẽ gặp rắc rối nếu một đĩa cứng bị lỗi được thay thế).

+0

Câu trả lời này trên SO giải thích nó cho Windows: http://stackoverflow.com/a/23584584/139793 – wasatchwizard

-2

Bạn có thể sử dụng một lockfile ở những nơi như:

  • /var/run/yourapp.pid (nếu chương trình chạy bằng root)
  • $ HOME/.yourapp.pid (nếu chạy bởi người dùng và hệ thống tệp cục bộ)
  • $ HOME/.yourapp. $ (tên máy chủ -f).pid (nhà trên nfs)

Khi chương trình của bạn được chạy, nó sẽ làm điều gì đó như:

lock = open(filename, O_CREAT | O_EXCL); 
dprintf(lock, "%u", getpid()); 

Nếu mở thất bại, kiểm tra xem quá trình này vẫn chạy và nếu không muốn nói: xóa các tập tin và thử lại.

27

Làm thế nào về UUID của hệ thống tệp gốc? Bạn có thể lấy thiết bị hệ thống tệp gốc từ /etc/fstab, bằng cách phân tích cú pháp tệp theo cách thủ công hoặc bằng cách sử dụng getfsent (3) hoặc getfsfile (3). Khi bạn có thiết bị, bạn có thể nhận UUID bằng cách kiểm tra các liên kết trong /dev/disk/by-uuid hoặc từ lệnh blkid.

+0

Là duy nhất cho tất cả các máy tính? –

+0

@spartacus yes, UUID là một định danh duy nhất trên toàn cầu. –

+0

http://tools.ietf.org/html/rfc4122 - Đặc tả này xác định không gian tên Tên Tài nguyên Đồng nhất cho UUID (Trình nhận dạng duy nhất phổ biến), còn được gọi là GUID (Toàn cầu Trình nhận dạng duy nhất). UUID dài 128 bit và có thể đảm bảo tính độc đáo trên không gian và thời gian . –

1

Bạn có thể lấy UUID của hệ thống tệp gốc /, điều này khá đáng tin cậy, nhưng nó sẽ không phân biệt giữa chroots và có thể là vms chạy trên cùng một đĩa.

Nếu bạn chủ yếu giao dịch với HDD nội bộ hoặc tĩnh được dành riêng để chạy một hệ điều hành cụ thể thì bạn sẽ có thể sử dụng UUID của hệ thống tệp gốc để phát hiện hệ thống.

Bạn có thể lấy UUID của fs gốc với một cái gì đó như thế này: alias sys_guid='sudo /sbin/blkid | grep "$(df -h/| sed -n 2p | cut -d" " -f1):" | grep -o "UUID=\"[^\"]*\" " | sed "s/UUID=\"//;s/\"//"'

Nếu bạn cần thêm sự khác biệt giữa các phiên bản kernel của cùng một hệ điều hành, hoặc khác nhau của hệ điều hành chạy trên cùng một đĩa, bạn có thể sử dụng dữ liệu từ uname và/hoặc kết hợp chúng với gốc fs UUID.

0

Câu trả lời từ Jason Day và A.Danischewski dường như đi đúng hướng nhưng không đáp ứng tiêu chí của bạn về bất kỳ "hệ thống giống Unix" nào kể từ /sbin/blkid/etc/fstab không tồn tại trên OSX.

Cách tiếp cận di động chỉ 100% sẽ là chọn vị trí chuẩn cho tệp mà ứng dụng của bạn sẽ tạo, ví dụ: /etc/YOURAPP.cfg và lưu trữ UUID tại đó nếu một tài khoản chưa tồn tại. Cách xa lý tưởng, vì người khác hoặc ứng dụng có thể xóa tệp hoặc thay đổi tệp hoặc nếu người dùng thay đổi hệ thống tệp gốc, bạn có thể mất ID từ máy hiện tại hoặc có thể xuất hiện trên máy khác . Chưa kể đến các vấn đề với quyền đọc và ghi, v.v.

Nhưng cuối cùng không có thứ như "cùng một máy". Bất kỳ máy tính nào cũng không kém phần cấu hình hiện tại của nó. Tôi không nghĩ rằng bạn có thể làm tốt hơn thế này, một cách đáng tin cậy.

Các vấn đề liên quan